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

Вниз

Свойство типа TShortCut у наследника TCollectionItem   Найти похожие ветки 

 
Almaz ©   (2005-05-12 14:47) [0]

Уважаемые коллеги,
столкнулся со следующей проблемой: есть компонент, наследник TCustomEdit, имеющий коллекцию некоторых объектов. Так вот, как известно, если при описании компонента добавить ему свойство типа TShortCut, то в инспекторе объектов это свойство будет представлено выпадающим списком, где можно выбрать комбинацию клавиш.
Однако, если точно такое же объявление поместить в описание класса элемента коллекции, то его свойство в инспекторе объектов будет отображаться числом, так вместо, например, Alt+Down отбражается соответственно 32808 и т.п., что неудобно.
Подскажите, с чем может быть связано подобное поведение Object Inspector"а.
Пример кода:

type
 THotkeyItem = class(TCollectionItem)
 private
   FHotkey: TShortCut;
 published
   property Hotkey: TShortCut read FHotKey write FHotKey;
 end;

 TCustomEditTest = class(TCustomEdit)
 private
   FHotkey: TShortCut;
   FCollection: TCollection;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property Hotkey: TShortCut read FHotKey write FHotKey;
   property Collection: TCollection read FCollection write FCollection;
 end;

...

constructor TCustomEditTest.Create(AOwner: TComponent);
begin
 inherited;
 FCollection := TCollection.Create(THotkeyItem);
end;

destructor TCustomEditTest.Destroy;
begin
 FCollection.Free;
 inherited;
end;


 
Style ©   (2005-05-12 15:17) [1]

{$IFDEF DELPHI67}
  RegisterPropertyEditor(TypeInfo(TShortCut),TMyComponent, "MyShortCutProperty", TShortCutProperty);
$ENDIF}


 
Юрий Зотов ©   (2005-05-12 23:59) [2]

> Almaz ©   (12.05.05 14:47)

Похоже, дело в том, что редактор свойств типа TShortCut регистририруется в VCL не для всех классов (а, например, для TWinControl и его потомков) - поэтому TCollectionItem остается "за бортом". Найти строку регистрации в исходниках VCL не удалось (видимо, ее там и нет, она зашита где-то в уже откомпилированном коде и в исходниках недоступна), поэтому проверить это предположение нельзя, но другой причины, вроде как, быть не может.

Во всяком случае, своя регистрация (см. [1]) действительно помогает (а куда бы ей деться?), только регистрировать надо, коннечно, не для самого компонента (с ним и так все нормально), а для элемента коллекции (в uses добавить VCLEditors):
RegisterPropertyEditor(TypeInfo(TShortCut), THotKeyItem, "HotKey", TShortCutProperty)

Последнее - строчку в конструкторе я бы все же изменил:
FCollection := TOwnedCollection.Create(Self, THotkeyItem)

В этом случае коллекция будет иметь непустого Owber"а, что гарантирует нормальную работу метода GetNamePath, а через него - механизмов IDE.


 
Almaz ©   (2005-05-13 01:29) [3]


> Юрий Зотов ©   (12.05.05 23:59) [2]

Огромное спасибо Вам за исчерпывающий ответ.


 
Ученик   (2005-05-13 23:09) [4]

Извиняюсь, продолжу тему

Можно ли подключить стандартный редактор для ImageIndex,
в свое время не получилось

uses
 ImgList, SysUtils, Classes;


type
 TComponent1 = class(TComponent)
 private
   { Private declarations }
   FImageIndex: TImageIndex;
   FImages: TCustomImageList;
 protected
   { Protected declarations }
 public
   { Public declarations }
 published
   { Published declarations }
   property ImageIndex: TImageIndex read FImageIndex write FImageIndex;
   property Images: TCustomImageList read FImages write FImages;
 end;


 
Style ©   (2005-05-14 09:53) [5]

В исходниках я вообще не нашел TImageIndexProperty
Наверное он где-нить в design-time пакете IDE Delphi.

А вот в Jedi описывают ImageIndexProperty самостоятельно.


 {$IFDEF COMPILER6_UP}
 {$IFDEF VCL}
 TJvDefaultImageIndexProperty = class(TIntegerProperty, ICustomPropertyDrawing, ICustomPropertyListDrawing)
 protected
   function ImageList: TCustomImageList; virtual;
 public
   function GetAttributes: TPropertyAttributes; override;
   procedure GetValues(Proc: TGetStrProc); override;
   function GetValue: string; override;
   procedure SetValue(const Value: string); override;
   procedure ListMeasureWidth(const Value: string;
     ACanvas: TCanvas; var AWidth: Integer); virtual;
   procedure ListMeasureHeight(const Value: string;
     ACanvas: TCanvas; var AHeight: Integer); virtual;
   procedure ListDrawValue(const Value: string;
     ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); virtual;
   procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect;
     ASelected: Boolean);
   procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect;
     ASelected: Boolean);
 end;
 {$ENDIF VCL}

 {$IFDEF VisualCLX}
 TJvDefaultImageIndexProperty = class(TIntegerProperty)
 protected
   function ImageList: TCustomImageList; virtual;
 public
   function GetAttributes: TPropertyAttributes; override;
   procedure Edit; override;
 end;
 {$ENDIF VisualCLX}

 {$ENDIF COMPILER6_UP}

 {$IFDEF COMPILER6_UP}

 {$IFDEF VCL}
 TJvDefaultImageIndexProperty = class(TIntegerProperty, ICustomPropertyDrawing, ICustomPropertyListDrawing)
 protected
   function ImageList: TCustomImageList; virtual;
 public
   function GetAttributes: TPropertyAttributes; override;
   procedure GetValues(Proc: TGetStrProc); override;
   function GetValue: string; override;
   procedure SetValue(const Value: string); override;
   procedure ListMeasureWidth(const Value: string;
     ACanvas: TCanvas; var AWidth: Integer); virtual;
   procedure ListMeasureHeight(const Value: string;
     ACanvas: TCanvas; var AHeight: Integer); virtual;
   procedure ListDrawValue(const Value: string;
     ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); virtual;
   procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect;
     ASelected: Boolean);
   procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect;
     ASelected: Boolean);
 end;
 {$ENDIF VCL}

 {$IFDEF VisualCLX}
 TJvDefaultImageIndexProperty = class(TIntegerProperty)
 protected
   function ImageList: TCustomImageList; virtual;
 public
   function GetAttributes: TPropertyAttributes; override;
   procedure Edit; override;
 end;
 {$ENDIF VisualCLX}

 {$ENDIF COMPILER6_UP}

//=== { TJvDefaultImageIndexProperty } =======================================

{$IFDEF COMPILER6_UP}

function TJvDefaultImageIndexProperty.ImageList: TCustomImageList;
const
 cImageList = "ImageList";
 cImages = "Images";
begin
 if TypInfo.GetPropInfo(GetComponent(0), cImageList) <> nil then
   Result := TCustomImageList(TypInfo.GetObjectProp(GetComponent(0), cImageList))
 else
 if TypInfo.GetPropInfo(GetComponent(0), cImages) <> nil then
   Result := TCustomImageList(TypInfo.GetObjectProp(GetComponent(0), cImages))
 else
   Result := nil;
end;

function TJvDefaultImageIndexProperty.GetAttributes: TPropertyAttributes;
begin
 {$IFDEF VCL}
 Result := [paValueList, paMultiSelect, paRevertable];
 {$ENDIF VCL}
 {$IFDEF VisualCLX}
 Result := [paRevertable, paDialog];
 {$ENDIF VisualCLX}
end;

{$IFDEF VCL}

function TJvDefaultImageIndexProperty.GetValue: string;
begin
 Result := IntToStr(GetOrdValue);
end;

procedure TJvDefaultImageIndexProperty.SetValue(const Value: string);
var
 XValue: Integer;
begin
 try
   XValue := StrToInt(Value);
   SetOrdValue(XValue);
 except
   inherited SetValue(Value);
 end;
end;

procedure TJvDefaultImageIndexProperty.GetValues(Proc: TGetStrProc);
var
 Tmp: TCustomImageList;
 I: Integer;
begin
 Tmp := ImageList;
 if Assigned(Tmp) then
   for I := 0 to Tmp.Count - 1 do
     Proc(IntToStr(I));
end;

procedure TJvDefaultImageIndexProperty.ListMeasureWidth(const Value: string; ACanvas: TCanvas; var AWidth: Integer);
var
 Tmp: TCustomImageList;
begin
 Tmp := ImageList;
 if Assigned(Tmp) then
   AWidth := Tmp.Width + ACanvas.TextHeight(Value) + 4;
end;

procedure TJvDefaultImageIndexProperty.ListMeasureHeight(const Value: string; ACanvas: TCanvas; var AHeight: Integer);
var
 Tmp: TCustomImageList;
begin
 Tmp := ImageList;
 if Assigned(Tmp) then
   AHeight := Max(Tmp.Height + 2, ACanvas.TextHeight(Value) + 2);
end;

procedure TJvDefaultImageIndexProperty.ListDrawValue(const Value: string; ACanvas:
 TCanvas; const ARect: TRect; ASelected: Boolean);
var
 Tmp: TCustomImageList;
 R: TRect;
begin
 DefaultPropertyListDrawValue(Value, ACanvas, ARect, ASelected);
 Tmp := ImageList;
 if Tmp <> nil then
 begin
   R := ARect;
   ACanvas.FillRect(ARect);
   Tmp.Draw(ACanvas, ARect.Left, ARect.Top, StrToInt(Value));
   OffsetRect(R, Tmp.Width + 2, 0);
   DrawText(ACanvas.Handle, PChar(Value), -1, R, 0);
 end;
end;

procedure TJvDefaultImageIndexProperty.PropDrawName(ACanvas: TCanvas;
 const ARect: TRect; ASelected: Boolean);
begin
 DefaultPropertyDrawName(Self, ACanvas, ARect);
end;

procedure TJvDefaultImageIndexProperty.PropDrawValue(ACanvas: TCanvas;
 const ARect: TRect; ASelected: Boolean);
var
 Tmp: TCustomImageList;
begin
 Tmp := ImageList;
 if (GetVisualValue <> "") and Assigned(Tmp) then
   ListDrawValue(GetVisualValue, ACanvas, ARect, ASelected)
 else
   DefaultPropertyDrawValue(Self, ACanvas, ARect);
end;

{$ENDIF VCL}

{$ENDIF COMPILER6_UP}



 
Style ©   (2005-05-14 09:54) [6]


{$IFDEF COMPILER5}

function TJvDefaultImageIndexProperty.ImageList: TCustomImageList;
const
 cImageList = "ImageList";
 cImages = "Images";
begin
 if TypInfo.GetPropInfo(GetComponent(0), cImageList) <> nil then
   Result := TCustomImageList(TypInfo.GetObjectProp(GetComponent(0), cImageList))
 else
 if TypInfo.GetPropInfo(GetComponent(0), cImages) <> nil then
   Result := TCustomImageList(TypInfo.GetObjectProp(GetComponent(0), cImages))
 else
   Result := nil;
end;

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

function TJvDefaultImageIndexProperty.GetValue: string;
begin
 Result := IntToStr(GetOrdValue);
end;

procedure TJvDefaultImageIndexProperty.SetValue(const Value: string);
var
 XValue: Integer;
begin
 try
   XValue := StrToInt(Value);
   SetOrdValue(XValue);
 except
   inherited SetValue(Value);
 end;
end;

procedure TJvDefaultImageIndexProperty.GetValues(Proc: TGetStrProc);
var
 Tmp: TCustomImageList;
 I: Integer;
begin
 Tmp := ImageList;
 if Assigned(Tmp) then
   for I := 0 to Tmp.Count - 1 do
     Proc(IntToStr(I));
end;

procedure TJvDefaultImageIndexProperty.ListDrawValue(const Value: string;
 ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
var
 Tmp: TCustomImageList;
 R: TRect;
begin
 inherited ListDrawValue(Value, ACanvas, ARect, ASelected);
 Tmp := ImageList;
 if Tmp <> nil then
 begin
   R := ARect;
   ACanvas.FillRect(ARect);
   Tmp.Draw(ACanvas, ARect.Left, ARect.Top, StrToInt(Value));
   OffsetRect(R, Tmp.Width + 2, 0);
   DrawText(ACanvas.Handle, PChar(Value), -1, R, 0);
 end;
end;

procedure TJvDefaultImageIndexProperty.ListMeasureHeight(const Value: string;
 ACanvas: TCanvas; var AHeight: Integer);
var
 Tmp: TCustomImageList;
begin
 Tmp := ImageList;
 if Assigned(Tmp) then
   AHeight := Max(Tmp.Height + 2, ACanvas.TextHeight(Value) + 2);
end;

procedure TJvDefaultImageIndexProperty.ListMeasureWidth(const Value: string;
 ACanvas: TCanvas; var AWidth: Integer);
var
 Tmp: TCustomImageList;
begin
 Tmp := ImageList;
 if Assigned(Tmp) then
   AWidth := Tmp.Width + ACanvas.TextHeight(Value) + 4;
end;

procedure TJvDefaultImageIndexProperty.PropDrawValue(ACanvas: TCanvas;
 const ARect: TRect; ASelected: Boolean);
begin
//  if GetVisualValue <> "" then
//    ListDrawValue(GetVisualValue, ACanvas, ARect, True)
//  else
 inherited PropDrawValue(ACanvas, ARect, ASelected);
end;

{$ENDIF COMPILER5}

{$IFDEF VisualCLX}
procedure TJvDefaultImageIndexProperty.Edit;
var
 SelectedIndex: Integer;
 Tmp: TImageList;
begin
 if ImageList <> nil then
 begin
   Tmp := TImageList.Create(Application);
   Tmp.Assign(ImageList);
   SelectedIndex := StrToInt(GetValue);
   if EditImageIndex(Tmp, SelectedIndex) then
   begin
     SetValue(IntToStr(SelectedIndex));
     ImageList.Assign(Tmp);
   end;
   Tmp.Free;
 end;
end;
{$ENDIF VisualCLX}


 
Ученик   (2005-05-14 18:44) [7]

>Style ©   (14.05.05 09:53) [5]
С написанием редактора вообще-то проблемы не было, проблема была с подключением стандартного редактора для ImageIndex.

Спасибо за ответ.



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

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

Наверх





Память: 0.49 MB
Время: 0.145 c
14-1132214056
Карелин Артем
2005-11-17 10:54
2005.12.11
Определение пола автоматом.


2-1133110516
Neosted
2005-11-27 19:55
2005.12.11
Память компьютера


1-1132075178
Кирилл_
2005-11-15 20:19
2005.12.11
Вставка в ListBox


1-1130999962
kblc
2005-11-03 09:39
2005.12.11
Есть ли у класса интерфейс?


2-1132935214
Jimm
2005-11-25 19:13
2005.12.11
Как пользоваться Utf8ToUnicode?





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