Automatische Benamung von Unterkomponenten

Möchte man untergeordnete/eingebetete Komponenten ebenfalls im Form-Designer freigeben und mit anderen Komponenten verlinken, dann kann es hilfreich sein, wenn diese Komponenten einen eindeutigen Namen bekommen.

[delphi]type
TMySubComponent = class(TComponent)
end;

TMyComponent = class(TComponent)
private
FSubComponent: TMySubComponent;
public
constructor Create(Owner: TComponent); override;
published
property SubComponent: TMySubComponent read FSubComponent write FSubComponent;
end;

constructor TMyComponent.Create(Owner: TComponent);
begin
inherited;
FSubComponent := TMySubComponent.Create(Self);
FSubComponent.Name := ‚TheSubComponent‘;
FSubComponent.SetSubComponent(True);
end;[/delphi] SetSubComponent sorgt dafür, daß auch die Property der Unterkomponente gespeichert würden.

Wenn man nun die Referenz dieser Unterkomponente dem Property einer weiteren Komponente zuweist (Achtung, besser nicht zusammen mit SetSubComponent=True benutzen), dann wird in der DFM nicht der Name des Property „MyComponent.SubComponent“ gespeichert, sondern der interne Name „MyComponent.TheSubComponent“, also ein Pfad der Komponenten-Namen, wie man sie mit FindComponent der Reihe nach suchen würde.

Soll aber direkt im Namen der Unterkomponente auch der Name der Elternkomponente stecken, um z.B. einen „eindeutigen“ Namen zu generieren, so könnte man dessen Namen zusammen mit dem Namen des Elternteils synchronisieren.
[delphi]type
TMyComponent = class(TComponent)
private
FSubComponent: TMySubComponent;
procedure AssignSubComponent(Value: TMySubComponent);
protected
procedure SetName(const NewName: TComponentName); override;
public
constructor Create(Owner: TOwner); override;
published
property SubComponent: TMySubComponent read FSubComponent write AssignSubComponent;
end;

procedure TMyComponent.AssignQuery(Value: TCimQuery2);
begin
FSubComponent.Assign(Value); // nicht die Instanz ändern, sondern nur die Eigenschaften übernehmen
end;

constructor TMyComponent.Create(Owner: TComponent);
begin
inherited;
FSubComponent:= TMySubComponent.Create(Self);
FSubComponent.SetSubComponent(True);
end;

procedure TMyComponent.SetName(const NewName: TComponentName);
begin
inherited; // schreibt NewName in Name
FSubComponent.Name := IfThen(Name <> “, Name + ‚_TheSubComponent‘, “); // kein Name, wenn Parent auch Keinen hat
end;[/delphi]

Wenn die Komponente sich im Form-Designer befindet, man aber nicht verhindert, daß die Unterkomponenten andersweitig umbenannt werden könnten (z.B. Exception in TMySubComponent.SetName), dann sollte man beim DFM-Laden das automatische Umbenennen besser deaktivieren, da Links eventuell nicht mehr aufgelöst werden könnten, wenn sich mittendrin plötzlich ein Name ändert, welcher beim Speichern noch anders war.
[delphi]procedure TMyComponent.SetName(const NewName: TComponentName);
begin
inherited; // schreibt NewName in Name
if not (scReading in ComponentState) then
FSubComponent.Name := IfThen(Name <> “, Name + ‚_TheSubComponent‘, “);
end;[/delphi] blödkönnte besser seinganz OKgutsuper duper (noch nicht abgestimmt)  

Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert