Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

TPropertyEditor -> TOrdinalProperty   Найти похожие ветки 

 
Mutex   (2005-04-02 10:40) [0]

Я уже замучался с этими редакторами свойств, т.к. ведут они себя несколько странно. Допустим у меня есть редактор свойства с типом LongWord, но при регистрации, если указать этот самый LongWord, то свойство не будет связано с компонентом! Но с integer, как это ни странно все работает. Сейчас проблема с другим свойством имеющим тип HKEY(Cardinal). Разработаный эдитор ни как не хочет связываться со свойством!!!! Вот его простейший код:

 TRegistryKeysProperty = class(TOrdinalProperty)
 public
   function GetAttributes: TPropertyAttributes; override;
   function GetValue: string; override;
   procedure GetValues(Proc: TGetStrProc); override;
   procedure SetValue(const Value: string); override;
 end;

 procedure Register;

implemetation

procedure Register;
begin
 RegisterPropertyEditor(TypeInfo(Cardinal), TRegistrySerializer, "RootKey",
   TRegistryKeysProperty);
end;

const
 S_HCR = "HKEY_CLASSES_ROOT";
 S_HCU = "HKEY_CURRENT_USER";
 S_HLM = "HKEY_LOCAL_MACHINE";
 S_HU  = "HKEY_USERS";
 S_HPD = "HKEY_PERFOMANCE_DATA";
 S_HCC = "HKEY_CURRENT_CONFIG";
 S_HDD = "HKEY_DYN_DATA";

function TRegistryKeysProperty.GetAttributes: TPropertyAttributes;
begin
 Result := [paValueList, paMultiSelect]
end;

function TRegistryKeysProperty.GetValue: string;
var
 OrdVal: Cardinal;
begin
 OrdVal := GetOrdValue;
 case OrdVal of
   Windows.HKEY_CLASSES_ROOT: Result := S_HCR;
   Windows.HKEY_CURRENT_USER: Result := S_HCU;
   Windows.HKEY_LOCAL_MACHINE: Result := S_HLM;
   Windows.HKEY_USERS: Result := S_HU;
   Windows.HKEY_PERFORMANCE_DATA: Result := S_HPD;
   Windows.HKEY_CURRENT_CONFIG: Result := S_HCC;
   Windows.HKEY_DYN_DATA: Result := S_HDD;
 else
   Result := S_HCR
 end;
end;

procedure TRegistryKeysProperty.GetValues(Proc: TGetStrProc);
begin
 Proc(S_HCR);
 Proc(S_HCU);
 Proc(S_HLM);
 Proc(S_HU);
 Proc(S_HPD);
 Proc(S_HCC);
 Proc(S_HDD);
end;

procedure TRegistryKeysProperty.SetValue(const Value: string);
begin
 if Value = S_HCR then
   SetOrdValue(Integer(Windows.HKEY_CLASSES_ROOT))
 else if Value = S_HCU then
   SetOrdValue(Integer(Windows.HKEY_CURRENT_USER))
 else if Value = S_HLM then
   SetOrdValue(Integer(Windows.HKEY_LOCAL_MACHINE))
 else if Value = S_HU then
   SetOrdValue(Integer(Windows.HKEY_USERS))
 else if Value = S_HPD then
   SetOrdValue(Integer(Windows.HKEY_PERFORMANCE_DATA))
 else if Value = S_HCC then
   SetOrdValue(Integer(Windows.HKEY_CURRENT_CONFIG))
 else if Value = S_HDD then
   SetOrdValue(Integer(Windows.HKEY_DYN_DATA))
 else
   SetOrdValue(Integer(Windows.HKEY_CURRENT_USER));
end;


Кто нибудь прояснить, плз, ситуацию. Что нужно сделать чтобы редактор заработал(я уже n-ое количество времени не могу это сделать :( )????


 
Юрий Зотов ©   (2005-04-02 16:09) [1]

С LongWord все нормально работает, c HKEY - нет. Похоже, что для HKEY не генерится RTTI, но это совершенно неважно, вместо HKEY можно использовать любой 4-байтовый беззнаковый тип (а при отключенном Range Checking даже и знаковый).

Вот слегка подправленный код, проверялся в D7.


unit MyComp; // В run-time пакете

interface

uses
 Windows, SysUtils, Classes;

type
 TRegistrySerializer = class(TComponent)
 private
   FRootKey: LongWord;
   procedure SetRootKey(const Value: LongWord);
 public
   constructor Create(AOwner: TComponent); override;
 published
   property RootKey: LongWord read FRootKey write SetRootKey default HKEY_CLASSES_ROOT;
 end;

implementation

{ TRegistrySerializer }

constructor TRegistrySerializer.Create(AOwner: TComponent);
begin
 inherited;
 FRootKey := HKEY_CLASSES_ROOT
end;

procedure TRegistrySerializer.SetRootKey(const Value: LongWord);
begin
 if (Value < HKEY_CLASSES_ROOT) or (Value > HKEY_DYN_DATA) then
   raise Exception.CreateFmt("$%x is invalid root key value", [Value]);
 FRootKey := Value;
end;

end.

============================================================

unit MyCompReg; // В design-time пакете

interface

uses
 Windows, SysUtils, Classes, MyComp, DesignIntf, DesignEditors;

type
 TRootKeyProperty = class(TOrdinalProperty)
 public
   function GetAttributes: TPropertyAttributes; override;
   function GetValue: string; override;
   procedure GetValues(Proc: TGetStrProc); override;
   procedure SetValue(const Value: string); override;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("Examples", [TRegistrySerializer]);
 RegisterPropertyEditor(TypeInfo(LongWord), TRegistrySerializer, "RootKey", TRootKeyProperty);
end;

const
 sRootKey: array[HKEY_CLASSES_ROOT..HKEY_DYN_DATA] of string =
    ("HKEY_CLASSES_ROOT", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", "HKEY_USERS",
     "HKEY_PERFOMANCE_DATA", "HKEY_CURRENT_CONFIG", "HKEY_DYN_DATA");

{ TRootKeyProperty }

function TRootKeyProperty.GetAttributes: TPropertyAttributes;
begin
 Result := inherited GetAttributes + [paValueList, paSortList]
end;

function TRootKeyProperty.GetValue: string;
begin
 Result := sRootKey[GetOrdValue]
end;

procedure TRootKeyProperty.GetValues(Proc: TGetStrProc);
var
 i: LongWord;
begin
 for i := Low(sRootKey) to High(sRootKey) do
   Proc(sRootKey[i])
end;

procedure TRootKeyProperty.SetValue(const Value: string);
var
 i: LongWord;
begin
 for i := Low(sRootKey) to High(sRootKey) do
   if AnsiSameText(Value, sRootKey[i]) then
   begin
     SetOrdValue(Integer(i));
     Exit
   end;
 raise Exception.CreateFmt(""%s" is invalid root key name", [Value])
end;

end.


 
Mutex   (2005-04-02 17:06) [2]

Большое спасибо:) Действительно, смена типа в классе - это решение проблемы :)



Страницы: 1 вся ветка

Форум: "Компоненты";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
14-1131453530
Priest
2005-11-08 15:38
2005.11.27
Подскажите интернет магазин


2-1131723575
ASScef
2005-11-11 18:39
2005.11.27
При нажатии кнопки не выполняется команда


14-1130948774
Erl
2005-11-02 19:26
2005.11.27
статистика


14-1130933341
konda
2005-11-02 15:09
2005.11.27
IP телефония


2-1131813261
Катерина
2005-11-12 19:34
2005.11.27
Как очистить строки (s1,s2:string)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский