Ich moechte fuer ein Projekt eine eigene visuelle Komponente basteln, die widerum visuelle Komponenten (z.B. TButton) enthaelt. Ist es prinzipiell ein richtiges vorgehen,
Das von TComponent abzuleiten
Die Unterkomponenten dynamisch in TMyComponent.Create zu erzeugen mit TheParent := Self
Die Unterkomponenten in TMyComponent.Destroy wieder freizugeben
Eclipticon hat geschrieben:[*] Das von TComponent abzuleiten
[*] Die Unterkomponenten dynamisch in TMyComponent.Create zu erzeugen mit TheParent := Self
[*] Die Unterkomponenten in TMyComponent.Destroy wieder freizugeben
Nein, TWinControl oder TCustomControl (wenn die neue Komponente auch selbst zeichnen soll) sind besser geeignet.
TComponent ist nur für nicht visuelle Komponenten (die werden im laufenden Programm nicht angezeigt, z.B. TTimer) geeignet.
Ja
Nicht nötig, wenn du beim Erstellen Self als Parameter übergibst.
constructor // usw...
var
btn: TButton;
begin
inherited Create(TheOwner);
btn := TButton.Create(Self); // sobald self freigegeben wird, wird auch btn wieder freigegeben
btn.Parent := Self;
Alle so erstellen Komponenten werden wieder freigegeben, wenn deine Instanz von TMyComponent freigegeben wird.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Eclipticon hat geschrieben:Danke Ich hab es mal so versucht, die child components werden aber alle nicht angezeigt. Left und Top ist schon relativ zum Canvas des Parents, oder?
Ja. Warum das nicht funktioniert, kann keiner ohne Code sagen ...
Eclipticon hat geschrieben:Muss ich irgendwo auf Draw- oder Resize Messages reagieren? Und wo lege ich eigentlich die Defaultwerte fuer die Properties der Komponente fest?
Auf Draw- und Resize musst du nur reagieren, wenn deine Komponente selbst etwas zeichnen soll, wobei du dazu die Methoden Paint() bzw. Resize() überschreibst.
Die Eigenschaften setzt du im Constructor bzw. direkt bei den Properties, wenn dies möglich ist:
Du musst auch noch die Parent Eigenschaft von den beiden Buttons setzten, die du hinzufügst. Die musst du einfach nur auf self setzten. Self ist ein interner Zeiger auf die Klasse selbst. In einigen Fällen wie z.b. in deinem ist er praktisch.
pluto hat geschrieben:Du musst auch noch die Parent Eigenschaft von den beiden Buttons setzten, die du hinzufügst. Die musst du einfach nur auf self setzten. Self ist ein interner Zeiger auf die Klasse selbst. In einigen Fällen wie z.b. in deinem ist er praktisch.
Eclipticon hat geschrieben:tu' ich das nicht mit TBitBtn.Create(self); ?
Nein. Im Konstruktor gibt man den Owner des Objekts an, also das Objekt, das sich um das spätere Freigeben kümmert. Der Parent hingegen definiert, in welchem Kontext sich das Objekt zeichnet.
Eclipticon hat geschrieben:Ja, koennt sich auch ueber Anchors loesen lassen, aber Code waere in diesem Fall einfacher...
Ganz wie du willst. Sobald das etwas komplexer wird (z.B. horizontal zentriert zu einem anderen Controls), möchte ich die LCL aber wieder empfehlen.
Eclipticon hat geschrieben:OnResize?
Resize?
DoOnResize??
So aus dem Bauch:
OnResize ist ein Event, in das ausgelöst wird, wenn deine Komponente die Größe ändert. Kann vom Benutzer immer geändert werden und ist auch nur für ihn vorgesehen.
Resize ist richtig, einfach überschreiben.
DoOnResize ruft OnResize auf, musst du nicht weiter beachten
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Resize ist eine Methode die von TCustomControl bereit gestellt wird und wie schon gesagt einfach überschrieben werden kann. Aber Vorsicht: Sie wird auch aufgerufen, wenn Die Komponente keine Größe hat z.b. Breite 0 und Höhe 0. In meinem Fall musste ich das abfangen um Fehler zu vermeiden. Sie wird leider auch zwei mal aufgerufen, wenn du über die Größe über die Entsprechenden Eigenschaften Setzt.