Текущий архив: 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.49 MB
Время: 0.039 c