Guten Morgen,
Nach einigen Stunden bin ich etwas frustriert:
Ich habe eine von TCustomButton abgeleitete Komponente mit einer published property Icon: TBitmap. Das Laden einer Bitmap in dieses property funktioniert mit dem Delphi-Dialog, wie er beim property Glyph in TBitBtn verwendet wird, einwandfrei. Auch das Kompilieren erfolgt fehlerfrei.
Beim Programmaufruf (aus der
IDE, sowie Direktaufruf der Exe) tritt eine
Exception auf:
"
Exception EReadError in Modul ... bei ...
Fehler beim Lesen von UserButton1.Icon.Data: Ungültiger Pfad für Eigenschaft."
Um eventuellen Hinweisen zuvorzukommen: Ich kenne TBitBtn, ich habe auch die Source diesbezüglich angeschaut; das ist so nicht verwendbar, die Borländer haben eine private (lokale) Klasse verwendet.
Es muss doch möglich sein, eine TBitmap in einer eigenen Komponente zur Entwurfszeit mit einem Bild zu versehen!
Vielleicht hat sich schon jemand damit herumgeärgert.
Für Hinweise wäre ich sehr dankbar.
Ich verwende Windows 7 32bit, Delphi XE2.
Komponente:
Delphi-Quellcode:
unit UserButtonEx;
interface
uses
System.SysUtils, System.Classes,
Vcl.Controls,
Vcl.StdCtrls,
Vcl.Graphics;
type
TUserButton =
class(TCustomButton)
private
FIcon: TBitmap;
procedure SetIcon(
const Value: TBitmap);
protected
public
constructor Create(Owner: TComponent);
destructor Destroy;
override;
published
property Icon: TBitmap
read FIcon
write SetIcon;
end{TUserButton};
implementation
{ TUserButton }
constructor TUserButton.Create(Owner: TComponent);
begin
inherited Create(Owner);
FIcon := TBitmap.Create;
end{TUserButton.Create};
destructor TUserButton.Destroy;
begin
FIcon.Free;
inherited;
end{TUserButton.Destroy};
procedure TUserButton.SetIcon(
const Value: TBitmap);
begin
FreeAndNIL(FIcon);
FIcon := TBitmap.Create;
if Assigned(Value)
then
FIcon.Assign(Value);
Invalidate;
end{TUserButton.SetIcon};
Registrierung:
Delphi-Quellcode:
unit Register_User_Components;
interface
uses
System.Classes,
UserButtonEx;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Eigenentwicklung', [TUserButton]);
end{Register};