Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

Редактор свойства 


kaif   (2002-02-14 21:06) [0]

Хочу сделать редактор свойства Integer, чтобы оно принимало 2 значения:
HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE.

Но что-то не работает. Даже список не выпадает в ObjectInspector.
Что тут не так, и как лучше сделать?

uses
Classes, dsgnintf, TypInfo, Windows;

type
TRegistryRootKeyProperty = class(TEnumProperty)
public
function GetValue: string; override;
procedure SetValue(const Value: string); override;
procedure GetValues(Proc: TGetStrProc); override;
end;

function TRegistryRootKeyProperty.GetValue: string;
begin
if GetOrdValue = HKEY_CURRENT_USER then
Result := "HKEY_CURRENT_USER"
else
Result := "HKEY_LOCAL_MACHINE";
end;

procedure TRegistryRootKeyProperty.GetValues(Proc: TGetStrProc);
begin
inherited;
Proc("HKEY_CURRENT_USER");
Proc("HKEY_LOCAL_MACHINE");
end;

procedure TRegistryRootKeyProperty.SetValue(const Value: string);
begin
inherited;
if Value = "HKEY_CURRENT_USER" then
SetOrdValue(HKEY_CURRENT_USER)
else
SetOrdValue(HKEY_LOCAL_MACHINE);
end;



Набережных С.   (2002-02-14 22:06) [1]

function TRegistryRootKeyProperty.GetAttributes: TPropertyAttributes;
begin
result:=[paValueList, paSortList];
end;



kaif   (2002-02-15 03:03) [2]

Да нет, не помогает. Я не переопределял этот метод, так как в предке есть что-то похожее. Здесь явно проблема с типом данных (значения не идут подряд, как в перечислимых типах). Но от какого PropertyEditor наследовать - не могу сообразить... к тому же компилятор стал сообщать всякие Hints типа
"comparing signed and unsigned types - wineded both operations".
"constant expression violates subrange bounds"...
Дело в том, что я регистрирую свойство так:
RegisterPropertyEditor(TypeInfo(LongWord), TMyComponent, "RegistryRootKey", TRegistryRootKeyProperty);



Юрий Зотов (M)   (2002-02-15 09:43) [3]

1. Как объявлено само свойство? Похоже, причина в этом.

2. "comparing signed and unsigned types - wineded both operations". Это компилятор информирует, что в методе GetValue сравниваются знаковое и беззнаковое целое. Можно не обращать на это внимания, работать все равно будет правильно.

2. Самое главное - нужный эффект можно получить и без всяких редакторов. См. RegisterIntegerConsts.



kaif   (2002-02-15 10:25) [4]

В любом случае спасибо за помощь, но проблема оказалась в другом. Беззнаковый тип DWORD, который определен для значений HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE в Windows.pas конфликтовал с типом Longint самого свойства еще на стадии компиляции. Я не обратил внимания на подсказки компилятора (сама компиляция проходила)... Теперь все работает. Я произвел потомка от TIntegerProperty, переопределив GetValue и SetValue без inherited.



kaif   (2002-02-17 17:45) [5]

А вообще-то RegisterIntegerConsts - хорошая идея! Просто не хотел бросать то, что начал, не разобравшись.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.017 c
3-9065            fag2000@ok.ru         2002-02-06 15:18  2002.03.04  
как узнать что запись новая


1-9203            Анонимщик             2002-02-14 10:54  2002.03.04  
Помогите с печатью метафайла


7-9310            Leviathan             2001-11-26 17:17  2002.03.04  
Два вопроса... :)


4-9345            Вадим                 2002-01-03 16:19  2002.03.04  
Ничего не понимаю


7-9313            Hruks                 2001-11-30 11:52  2002.03.04  
LPT, COM и Рэлюшки...