Ich muss TSpeedButton um zwei neue Eigenschaften erweitern. Obwohl die Eigenschaften im Objektinspektor korrekt angezeigt werden und die Werte in der DFM-Datei gespeichert werden, erhält die Methode "create" zur Laufzeit die Eigenschaften als "nil".So fügen Sie TSpeedButton eine Eigenschaft hinzu (Delphi)
Was ist los? Hier
ist die kundenspezifische Komponentencode:
unit ulbSpeedButton;
interface
uses
Winapi.Windows, Winapi.Messages, System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Graphics,
Vcl.StdCtrls, Vcl.ExtCtrls, Winapi.CommCtrl, Vcl.ImgList,
Vcl.Themes, System.Generics.Collections, Vcl.Buttons;
type
tlbSpeedButton = class(TSpeedButton)
private
fImageList : TImageList;
fImageIndex : Integer;
function GetImageIndex:Integer;
function GetImageList:TImageList;
procedure SetImageIndex(aIndex:Integer);
procedure SetImageList(aImageList:TImageList);
protected
public
constructor Create(AOwner: TComponent); override;
published
property ImgIndex : Integer read fImageIndex write SetImageIndex;
property ImgList : TImageList read GetImageList write SetImageList;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Leo Bruno', [tlbSpeedButton]);
end;
{ tlbSpeedButton }
constructor tlbSpeedButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
if ((Assigned(fImageList)) and (fImageList.Count > 0)) then
fImageList.GetBitmap(fImageIndex,Self.Glyph);
end;
function tlbSpeedButton.GetImageIndex: Integer;
begin
Result := fImageIndex;
end;
function tlbSpeedButton.GetImageList: TImageList;
begin
Result := fImageList;
end;
procedure tlbSpeedButton.SetImageIndex(aIndex: Integer);
begin
if fImageIndex <> aIndex then
begin
fImageIndex := aIndex;
Invalidate;
end;
end;
procedure tlbSpeedButton.SetImageList(aImageList: TImageList);
begin
if fImageList <> aImageList then
begin
fImageList := aImageList;
Invalidate;
end;
end;
end.
Sehr netter Mann. Gearbeitet wie ein Charme. Nur eine Sache konnte ich nicht beheben. In der Designzeit, wenn ich einen Bildindex und eine Bildliste zuweise, wird die Glyphe aktualisiert. Wenn jedoch ein bereits gesetzter Bildindex in der Entwurfszeit geändert wird, wird das Zeichen nicht aktualisiert. Vielen Dank für Ihre Zeit und Geduld. –
@LeoBruno: Sobald die Dimensionen der 'Glyph' festgelegt sind, zeichnet 'GetBitmap()' einfach neue Bilder über die vorhandene Bitmap. Ich erwartete, dass 'GetBitmap()' das 'OnChange'-Ereignis der Glyphe auslöst, so dass' TSpeedButton' automatisch 'Invalidate() 'selbst würde. Aber anscheinend ist das nicht der Fall, es sei denn, 'GetBitmap()' muss die Größe der Bitmap ändern (was beim ersten Mal der Fall ist). Also, mache '' UpdateGlyph() '' 'Invalidate()' direkt aufzurufen, um es zu erzwingen. –