Ich geh ins Wochenende
Hier mein Versuch das per decorator pattern umzusetzen.
Das sind noch keine Komponenten, das käme später, es geht erstmal um Machbarkeit:
Delphi-Quellcode:
type
TNxBoundLabel = class(TBoundLabel) //* Damit wir an die protected-Innereien herankommen
end;
TNxLabeledControl = class(TCustomEdit) //* Der Dekorateur für TCustomEdit
private //* TCustomEdit deshalb, weil viele Komponenten davon abgeleitet sind...Datepicker leider nicht.
fCustomEdit: TCustomEdit;
fEditLabel: TNxBoundLabel;
fLabelPosition: TLabelPosition;
fLabelSpacing: Integer;
procedure SetLabelPosition(const Value: TLabelPosition);
procedure SetLabelSpacing(const Value: Integer);
protected
procedure SetParent(AParent: TWinControl); override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetName(const Value: TComponentName); override;
procedure CMVisiblechanged(var Message: TMessage); message CM_VISIBLECHANGED;
procedure CMEnabledchanged(var Message: TMessage); message CM_ENABLEDCHANGED;
procedure CMBidimodechanged(var Message: TMessage); message CM_BIDIMODECHANGED;
public
constructor Create(AOwner: TComponent; aCustomEdit: TCustomEdit); reintroduce;
procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override;
procedure SetupInternalLabel;
property EditLabel: TNxBoundLabel read FEditLabel;
published
property LabelPosition: TLabelPosition read FLabelPosition
write SetLabelPosition default lpAbove;
property LabelSpacing: Integer read fLabelSpacing write SetLabelSpacing
default 3;
end;
TNxEdit = class(TNxLabeledControl) //* Das zu dekorierende Control ist in diesem einfachen Fall ein TEdit (siehe Code im Contrustor)
private
fNXLabeledControl: TNxLabeledControl;
public
constructor Create(aOwner: TComponent);
destructor Destroy; override;
end;
Die meisten Methoden sind im Prinzip C&P aus TCustomLabeledEdit. Worauf es IMO ankommt ist:
Delphi-Quellcode:
constructor TNxLabeledControl.Create(AOwner: TComponent; aCustomEdit: TCustomEdit);
begin
inherited Create(AOwner);
fCustomEdit := aCustomEdit;
FLabelPosition := lpAbove;
FLabelSpacing := 3;
SetupInternalLabel;
end;
procedure TNxLabeledControl.SetupInternalLabel;
begin
if Assigned(FEditLabel) then
exit;
if not Assigned(fCustomEdit) then
exit;
FEditLabel := TNxBoundLabel.Create(fCustomEdit);
FEditLabel.FreeNotification(fCustomEdit);
FEditLabel.FocusControl := fCustomEdit;
end;
Der Code für das zu labelnde Edit
Delphi-Quellcode:
constructor TNxEdit.Create(aOwner: TComponent);
begin
inherited Create(aOwner, TEdit.Create(Self)); //* Hier steht endlich die zu verwendende Komponente
end;
destructor TNxEdit.Destroy;
begin
fCustomEdit.Free;
inherited;
end;
In einem ersten Test wird zwar das Edit angezeigt, nicht jedoch das Label
Ich freue mich aber darüber das es nicht knallt
Ich schau Montag wieder rein. Bis denne!
Sherlock