Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.11;
Скачать: CL | DM;

Вниз

Свойство типа 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.057 c
2-1132602045
The Sound
2005-11-21 22:40
2005.12.11
Выключение ПК.


6-1125508765
FShadow
2005-08-31 21:19
2005.12.11
С чего начать создание проги типа PortTunnel?


14-1132571747
syte_ser78
2005-11-21 14:15
2005.12.11
Как прога зовется?


6-1125481501
Nikolay Kislov
2005-08-31 13:45
2005.12.11
Как обойти конфликт между IP адресами?


6-1125594470
Alex_Korn
2005-09-01 21:07
2005.12.11
Определение размера закачиваемого файла.