-
При создании компоненты создаю два свойства
property ImageIndex: TImageIndex read FImageIndex write SetImageIndex; property Images: TCustomImageList read FImages write SetImages;
При этом в инспекторе на всех свойствах с типом integer (Tag, Width, Height) появился выпадающий список из Images.
А ImageIndex показывается как integer, без иконок. А хотелось что-бы именно в нем был выпадающий список с наполнением от Images.
как мне связать между собой ImageIndex и Images?
-
> При этом в инспекторе на всех свойствах с типом integer > (Tag, Width, Height) появился выпадающий список из Images
Очевидно что вы неправильно зарегистрировали редактор. Поумолчанию редактор на TImageIndex уже зарегистрирован.
Покажите ваш код регистрации
-
Редактор я не регистрировал, и не нашел как это делается на других примерах
-
Покажите код вашего компонета
-
TBSVButton = class(TGraphicControl) private FCaption: TCaption; FCaptionAlignment: TAlignment; FCaptionHeight: Integer; FCaptionAlignmentVertical: TAlignmentVertical; FCaptionWidth: Integer; FImages: TCustomImageList; FMouseInControl: Boolean; FOnMouseEnter: TNotifyEvent; FTransparent: Boolean; // MouseTimer: TTimer; FRectBorder: TRect; FRectInner: TRect; FWordWrap: Boolean; FImageChangeLink: TChangeLink; FImageIndex: TImageIndex; MLCanvas: TMultiLine; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED; function IsImageIndexStored: Boolean; procedure SetCaption(const Value: TCaption); procedure SetCaptionAlignment(const Value: TAlignment); procedure SetImageIndex(const Value: TImageIndex); procedure SetImages(const Value: TCustomImageList); procedure SetTransparent(const Value: Boolean); procedure SetWordWrap(const Value: Boolean); procedure ImageListChange(Sender: TObject); procedure SetCaptionAlignmentVertical(const Value: TAlignmentVertical); protected { Protected declarations } FState: TButtonState; procedure DoMouseEnter; virtual; procedure DoMouseLeave; virtual; procedure Paint(); override; property MouseInControl: Boolean read FMouseInControl; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Loaded; override; procedure SetCaptionParam; procedure SetRects; published property Caption: TCaption read FCaption write SetCaption; property CaptionAlignment: TAlignment read FCaptionAlignment write SetCaptionAlignment; property CaptionAlignmentVertical: TAlignmentVertical read FCaptionAlignmentVertical write SetCaptionAlignmentVertical; property ImageIndex: TImageIndex read FImageIndex write SetImageIndex; property Images: TCustomImageList read FImages write SetImages; property Transparent: Boolean read FTransparent write SetTransparent default True; property WordWrap: Boolean read FWordWrap write SetWordWrap stored False; property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('FregatLib', [TBSVButton]); end;
-
не видно никаких коллизий, скорее всего действует чужой редактор. Посмотрите на другом компоненте как ведут себя всойства (Tag, Width, Height)
-
Оффтоп:
а что делает перекрытый метод Loaded в public ?
-
> DimaBr © (20.07.07 12:19) [5]
на других компонентах у этих свойств стоит ComboBox, но с пустым списком, у меня этот ComboBox заполняется из Images
-
> Сергей М. © (20.07.07 13:36) [6] > Оффтоп: а что делает перекрытый метод Loaded в public ?
Там вызывается метод устанавливающий FCaptionHeight и FCaptionWidth
-
Кинте TTollBar, подключите Images и посмотрите на него свойства.
-
А на самом деле у меня будет еще два свойства Images_2 и Images_3, и к ним ImageIndex_2 и ImageIndex_3. Что необходимо указать чтобы в каждом ImageIndex_X показывался свой Images_X
-
> DimaBr © (20.07.07 14:42) [9] > Кинте TTollBar, подключите Images и посмотрите на него свойства. >
попробую
-
> меня будет еще два свойства
Тогда зарегистрируйте свой редактор и наполняйте его. Для этого напишите наследника от
TBrImageIndexProperty = class(TIntegerProperty, ICustomPropertyDrawing,ICustomPropertyListDrawing)
protected
function GetImages: TCustomImageList; virtual; abstract;
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValues( Proc: TGetStrProc ); override;
procedure ListMeasureHeight( const Value: string; ACanvas: TCanvas; var AHeight: Integer );
procedure ListMeasureWidth( const Value: string; ACanvas: TCanvas; var AWidth: Integer );
procedure ListDrawValue( const Value: string; ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean );
property Images: TCustomImageList read GetImages;
procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
end;
function TBrImageIndexProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [ paValueList, paDialog ] - [ paSortList, paMultiSelect, paAutoUpdate, paSubProperties, paReadOnly ];
end;
procedure TBrImageIndexProperty.GetValues( Proc: TGetStrProc );
var I: Integer;
begin
if Images <> nil then
for I := 0 to Images.Count - 1 do Proc( IntToStr( I ) );
end;
procedure TBrImageIndexProperty.ListMeasureHeight( const Value: string; ACanvas: TCanvas; var AHeight: Integer );
begin
if Images <> nil then
AHeight := Max( ACanvas.TextHeight('Wg'), Images.Height + 4 );
end;
procedure TBrImageIndexProperty.ListMeasureWidth( const Value: string; ACanvas: TCanvas; var AWidth: Integer );
begin
if Images <> nil then
AWidth := AWidth + Images.Width + 4;
end;
procedure TBrImageIndexProperty.ListDrawValue( const Value: string; ACanvas: TCanvas; const ARect: TRect;ASelected: Boolean );
var R: TRect;
X: integer;
begin
R := ARect;
try
X := StrToInt( Value );
ACanvas.FillRect( R );
if (Images <> nil) and (X > -1) then begin
R.Right := R.Left + ( R.Bottom - R.Top );
Images.Draw( ACanvas, R.Left + 2, R.Top + 2, X, True );
R := Rect(R.Right,R.Top,ARect.Right,R.Bottom);
end;
finally
DefaultPropertyListDrawValue( Value, ACanvas, R, ASelected );
inherited ListDrawValue( Value, ACanvas, R, ASelected );
end;
end;
procedure TBrImageIndexProperty.PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
begin
DefaultPropertyDrawName(self,ACanvas, ARect);
end;
procedure TBrImageIndexProperty.PropDrawValue(ACanvas: TCanvas;const ARect: TRect; ASelected: Boolean);
var R: TRect;
B: TBitMap;
X: integer;
begin
x := StrToInt( Value );
b := TBitMap.Create;
R := ARect;
if X >= 0 then R.Right := R.Left + ( R.Bottom - R.Top )+2;
try
ACanvas.FillRect( R );
if (Images <> nil) and (X >= 0) then begin
b.Width := Images.Width;
b.Height := ARect.Bottom - ARect.Top;
Images.Draw(b.Canvas,0,0,X, True);
b.Transparent := true;
ACanvas.StretchDraw(Rect(ARect.Left,ARect.Top,ARect.Left+b.Width,ARect.Top+b.Height),b);
R := Rect( R.Right, ARect.Top, ARect.Right, ARect.Bottom );
end;
finally
DefaultPropertyDrawValue(self,ACanvas,R);
inherited PropDrawValue( ACanvas, ARect.Bottom , ASelected );
end;
b.Free;
end;
приблизительно так
TBrAllImageIndexProperty = class(TBrImageIndexProperty)
protected
function GetImages: TCustomImageList;override;
end;
function TBrAllImageIndexProperty.GetImages: TCustomImageList;
begin
Result := nil;
if GetComponent(0) is TBSVButton then
Result := TBSVButton(GetComponent(0)).Images;
end;
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TImageIndex), TBSVButton,'ImageIndex',TBrAllImageIndexProperty);
end;
-
Спасибо, есть над чем поработать, буду разбираться
-
Пожалуйста, обращайтесь !
-
Удалено модератором
-
Удалено модератором
|