[gelöst] Parent eines Controls in anderem Formular?
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1872
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
[gelöst] Parent eines Controls in anderem Formular?
Ich habe ein Control, daß ich an mehreren Stellen verwenden möchte (nicht gleichzeitig).
Dazu setze ich die Eigenschaft Parent entsprechend.
Das funktioniert auch, solange der neue Parent im gleichen Formular ist. Nicht jedoch, bei einem abweichenden Formular.
Hat jemand eine Idee woran das liegen könnte?
In Delphi geht das.
Dazu setze ich die Eigenschaft Parent entsprechend.
Das funktioniert auch, solange der neue Parent im gleichen Formular ist. Nicht jedoch, bei einem abweichenden Formular.
Hat jemand eine Idee woran das liegen könnte?
In Delphi geht das.
Zuletzt geändert von fliegermichl am Mo 9. Nov 2026, 15:45, insgesamt 1-mal geändert.
Re: Parent eines Controls in anderem Formular?
Da fehlen Informationen, wie du das machst.
Wahrscheinlich wieder eine Frage der Erstellungsreihenfolge.
Bei mir geht:
Dann rutscht Form2.Button1 auf Form1.
Lazarus 5.99 (rev main_4_99-5672-gcdf9a904cc) FPC 3.2.2 x86_64-linux-gtk3
Wahrscheinlich wieder eine Frage der Erstellungsreihenfolge.
Bei mir geht:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Button1.Parent:=self;
end; Lazarus 5.99 (rev main_4_99-5672-gcdf9a904cc) FPC 3.2.2 x86_64-linux-gtk3
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1872
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Parent eines Controls in anderem Formular?
Erzeuge ein neues Projekt mit 3 Formularen.
In Form1 platziere einen Speedbutton mit dem Namen sb und einen TBitBtn;
Im OnCreate werden form2 und form3 erzeugt und angezeigt.
Bei dem OnClick des BitBtn soll der Parent umgestellt werden (wird er auch, aber der Button nicht im entsprechenden Formular angezeigt)
Nach dem ersten Klick auf BitBtn1 verschwindet der Speedbutton aus form1, erscheint aber weder auf form2 noch form3.
In Form1 platziere einen Speedbutton mit dem Namen sb und einen TBitBtn;
Im OnCreate werden form2 und form3 erzeugt und angezeigt.
Bei dem OnClick des BitBtn soll der Parent umgestellt werden (wird er auch, aber der Button nicht im entsprechenden Formular angezeigt)
Nach dem ersten Klick auf BitBtn1 verschwindet der Speedbutton aus form1, erscheint aber weder auf form2 noch form3.
Code: Alles auswählen
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if sb.Parent = form2 then
sb.Parent := form3
else
sb.Parent := form2;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form2 := TForm2.Create(Application);
form2.Show;
form3 := TForm3.Create(Application);
form3.Show;
end;
Re: Parent eines Controls in anderem Formular?
Bei mir geht's
- Dateianhänge
-
ParentChanging.zip- (5.14 KiB) 7-mal heruntergeladen
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1872
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Parent eines Controls in anderem Formular?
Oh, da habe ich mich vielleicht etwas unglücklich ausgedrückt. Es ging mir nicht um die Klassenbeziehungen zwischen den Formularen sondern um die Property Parent des Controls.
Nehmen wir an, wir haben zwei Groupboxen in einem Formular und einen SpeedButton.
Wenn ich dann schreibe
Code: Alles auswählen
SpeedButton1.Parent := Groupbox1;
Das funktioniert aber eben nicht, wenn ich als Parent ein anderes Formular angebe.
Re: Parent eines Controls in anderem Formular?
Versteh ich nicht... Klicke doch mal ein kleines Projekt zusammen, das sich so verhält wie von dir beschrieben.
Beim Ändern des Parent behält das Control seine Koordinaten. Wenn es im Ausgansformular weiter unten liegt als der Ziel-Parent hoch ist, dann ist es nicht mehr sichtbar, er liegt nur außerhalb des sichtbaren Bereichs. In Delphi ist das anders: da werden die Koordinaten notfalls so geändert, dass das Control zumindest am Rand des neuen Parent sichtbar bleibt.
Beim Ändern des Parent behält das Control seine Koordinaten. Wenn es im Ausgansformular weiter unten liegt als der Ziel-Parent hoch ist, dann ist es nicht mehr sichtbar, er liegt nur außerhalb des sichtbaren Bereichs. In Delphi ist das anders: da werden die Koordinaten notfalls so geändert, dass das Control zumindest am Rand des neuen Parent sichtbar bleibt.
- Zvoni
- Beiträge: 783
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 11 Pro (Laz4.3/FPC3.2.3)
- CPU-Target: 64Bit
- Wohnort: BW
Re: Parent eines Controls in anderem Formular?
Dir ist bekannt, dass es neben Parent noch einen Owner gibt?
Aber wenn du ein und dasselbe Control auf verschiedenen Formen haben willst, wie willst du dann die Events machen (OnClick)?
Form2 und Form3 wissen nix von Form1, wo du ja schon ne OnClick hast.
Ich würde mir da eher eine "virtuelle" Basisklasse bauen. Also ohne visuelle Repräsentation.
Und diese Basisklasse könnte so aussehen
Und jede deiner Formen leitet sich von dieser Klasse ab
Im jeweiligen Create der jeweiligen Form dann Position, Visibility oder was auch immer festlegen.
Und im Event "procedure MeinButtonClick(Sender: TObject);"
Kannst du dann den Parent für Sender As TButton abfragen und ggfs. unterschiedlichen Code ausführen lassen.
Oder je eigener Form dann den Event "override" bzw. "reintroduce"
Aber wenn du ein und dasselbe Control auf verschiedenen Formen haben willst, wie willst du dann die Events machen (OnClick)?
Form2 und Form3 wissen nix von Form1, wo du ja schon ne OnClick hast.
Ich würde mir da eher eine "virtuelle" Basisklasse bauen. Also ohne visuelle Repräsentation.
Und diese Basisklasse könnte so aussehen
Code: Alles auswählen
Type
TMeineForm = Class(TForm)
MeinButton: TButton; //<<-- Oder SpeedButton, BitBtn was auch immer
procedure MeinButtonClick(Sender: TObject); //virtual? <<-- braucht natürlich in Implementation Code
End;
Code: Alles auswählen
Uses UnitmitMeineForm; // in Form1, Form2, Form3 und wo auch immer
Type
TForm1 = Class(TMeineForm)
//blablaba
//Restliche Controls usw.
End;
Und im Event "procedure MeinButtonClick(Sender: TObject);"
Kannst du dann den Parent für Sender As TButton abfragen und ggfs. unterschiedlichen Code ausführen lassen.
Oder je eigener Form dann den Event "override" bzw. "reintroduce"
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1872
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Parent eines Controls in anderem Formular?
Der Event für das OnClick ist und bleibt bei Form1.
Owner ist in allen Fällen Application.
Natürlich kann man das auch anders lösen. In Delphi hatte ich es so und da hat das funktioniert. Im Rahmen der Portierung ist mir aufgefallen, daß der Button nicht im anderen Formular erscheint und mir war nicht ganz klar, weshalb.
Im anhängenden Projekt kann man den Parent zwischen den Groupboxen oder den Formularen wechseln. Bei den Groupboxen geht es, bei den Formularen nicht.
Owner ist in allen Fällen Application.
Natürlich kann man das auch anders lösen. In Delphi hatte ich es so und da hat das funktioniert. Im Rahmen der Portierung ist mir aufgefallen, daß der Button nicht im anderen Formular erscheint und mir war nicht ganz klar, weshalb.
Im anhängenden Projekt kann man den Parent zwischen den Groupboxen oder den Formularen wechseln. Bei den Groupboxen geht es, bei den Formularen nicht.
- Dateianhänge
-
project1.zip- (95.88 KiB) 5-mal heruntergeladen
Re: Parent eines Controls in anderem Formular?
Du hast Form2 und Form3 in den Auto-Create-Forms gelistet, d.h. beide Formulare werden automatisch beim Programmstart erzeugt. Zusätzlich erzeugst du beide Formulare aber unter demselben Namen nochmals im Code ---> Chaos! Entferne Form2 und Form3 in den Projekt-Optionen > Forms aus der Liste der Auto-Create Forms, oder benenne deine Formulare im Code um zu F2, F3, dann geht es auch mit den Formularen.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1872
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Parent eines Controls in anderem Formular?
Argh, normalerweise lasse ich kein Formular automatisch erzeugen. Aber bei der neuen Lazarusinstallation hatte ich das noch nicht angegeben.wp_xyz hat geschrieben: Mo 9. Nov 2026, 15:11 Du hast Form2 und Form3 in den Auto-Create-Forms gelistet,
Du hast Recht. Wenn autocreate aus ist, funktioniert es.
Danke!
- Zvoni
- Beiträge: 783
- Registriert: Fr 5. Jul 2024, 08:26
- OS, Lazarus, FPC: Windoof 11 Pro (Laz4.3/FPC3.2.3)
- CPU-Target: 64Bit
- Wohnort: BW
Re: Parent eines Controls in anderem Formular?
Dir ist aber klar, dass wenn du Form2 und Form3 so aufrufst wie oben beschrieben, der User Form 1 schliessen kann, und dass dann der Event für den Button im Nirvana ist?fliegermichl hat geschrieben: Mo 9. Nov 2026, 15:01 Der Event für das OnClick ist und bleibt bei Form1.
Owner ist in allen Fällen Application.
Natürlich kann man das auch anders lösen. In Delphi hatte ich es so und da hat das funktioniert. Im Rahmen der Portierung ist mir aufgefallen, daß der Button nicht im anderen Formular erscheint und mir war nicht ganz klar, weshalb.
Im anhängenden Projekt kann man den Parent zwischen den Groupboxen oder den Formularen wechseln. Bei den Groupboxen geht es, bei den Formularen nicht.
bzw. da die Referenz auf Form2 und Form3 von Form1 gehalten wird.....
Alter Schwede....diese Konstruktion wäre mir echt zu wackelig.
Aber gut: Dein Programm. Schliesst der User Form1 nimmt er ja automatisch Form2 und Form3 mit ins Grab, von daher sollte es mit dem "fehlenden" Event nicht knallen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
- af0815
- Lazarusforum e. V.
- Beiträge: 7473
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Parent eines Controls in anderem Formular?
Nicht unbedingt. Genaugenommen macht es das TFrame auch so. Es blendet die Komponenten am richtigen Platz ein. Auch das Verhalten mit dem Events ist daher so begründet. Somit ist das Konstrukt mir nicht so fremd.Zvoni hat geschrieben: Mo 9. Nov 2026, 16:06 Alter Schwede....diese Konstruktion wäre mir echt zu wackelig.
Aber, da gebe ich dir recht, man muss immer wissen was man tut, ansonsten gibt es schwer zu findende Hoppalas.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).