noch mal zur Sicherheit, bevor ich es nochmal ausprobiere (beim ersten Mal hat es nicht geklappt):
die "normalen" Prozeduren zum Setzen der property werden nach einem Register auch zur Entwurfszeit ausgeführt?
Irgendwie klappt das bei mir nicht.
Ich bin dabei, eine eigene Komponente von TEdit abzuleiten. Die soll (ähnlich wie TLabelledEdit) auch eine Caption bekommen, und das funktioniert im Design-Mode überhaupt nicht. Ich habe jetzt im Setter eine Kontrollmeldung ausgegeben, und auch die wird nur zur Laufzeit beim Formcreate angezeigt, aber nicht, wenn ich die Eigenschaft im Object-Inspector ändere. Was ist da falsch?
Delphi-Quellcode:
TLabelPosition = (ptAbove, ptLeft, ptRight, ptBelow);
TfdEdit = Class(TEdit,IfdComponent)
private
FCaption: String;
FCaptionPosition: TLabelPosition;
FCaptionFont: TFont;
FCaptionDistance: Integer;
...
procedure SetLabelProperties;
procedure SetLabelCaption(const value: string);
procedure SetLabelFont(value: TFont);
procedure SetLabelDistance(value: integer);
...
published
property Caption: string read FCaption write SetLabelCaption;
property CaptionFont: TFont read FCaptionFont write SetLabelFont;
property CaptionDistance: integer read FCaptionDistance write SetLabelDistance;
End;
procedure TfdEdit.SetLabelProperties;
begin
if not assigned(FLabel) then exit;
Flabel.Caption:=FCaption;
if assigned(FCaptionFont) then FLabel.Font:=FCaptionfont;
case FCaptionPosition of
ptAbove: begin FLabel.Left:=Left; FLabel.Top:=Top-FLabel.Height-FCaptionDistance end;
ptLeft: begin FLabel.Left:=Left-FCaptionDistance-FLabel.Width; Flabel.Top:=Top+(Height-Flabel.Height) div 2 end;
ptRight: begin FLabel.Left:=Left+FCaptionDistance+Width; Flabel.Top:=Top+(Height-Flabel.Height) div 2 end;
ptBelow: begin FLabel.Left:=Left; FLabel.Top:=Top+Height+FCaptionDistance end;
end (* case *);
end;
procedure TfdEdit.SetLabelCaption(const value: string);
begin
FCaption:=value;
Showmessage('Label: '+Value);
if value='' then
begin
if assigned(FLabel) then FLabel.Free;
exit
end;
if not assigned(FLabel) then
begin
FLabel:=TLabel.Create(Self);
FLabel.Parent:=Parent
end;
SetLabelProperties;
end;
Wenn ich das Programm starte, wird Showmessage ausgeführt, und das Editfeld samt des Caption-Labels richtig angezeigt.
Aber wenn ich im
OI die Eigenschaft Caption ändere, hat das keine sichtbare Auswirkung, es wird weder das Showmessage noch der Label angezeigt.
Das Setzen der CaptionFont im
OI ist übrigens auch nicht möglich. Die Property wird im
OI angezeigt, aber wenn ich die drei Punkte anklicke, kommt die Fehlermeldung:
Zitat:
nil kann nicht zu TFont zugewiesen werden.
obwohl ich im Konstruktor von TfdEdit den Wert CaptionFont mit self.font initialisiert habe.