Главная страница
    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-1131096685
Pazitron_Brain
2005-11-04 12:31
2005.11.27
Проблемы с железом #2


5-1113565924
имя
2005-04-15 15:52
2005.11.27
Внимание Подлог!!!


14-1131122018
Дмитрий_05
2005-11-04 19:33
2005.11.27
Label определенной длиной а текст переносился по строкам


3-1129038011
stepan_mk
2005-10-11 17:40
2005.11.27
ODAC &amp; ORAARRAY


2-1131599978
paule
2005-11-10 08:19
2005.11.27
Перенос строки в Memo





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский