[gelöst] Parent eines Controls in anderem Formular?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
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?

Beitrag von fliegermichl »

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.
Zuletzt geändert von fliegermichl am Mo 9. Nov 2026, 15:45, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 11423
Registriert: Mo 11. Sep 2006, 19:01

Re: Parent eines Controls in anderem Formular?

Beitrag von theo »

Da fehlen Informationen, wie du das machst.
Wahrscheinlich wieder eine Frage der Erstellungsreihenfolge.

Bei mir geht:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Button1.Parent:=self;
end;      
Dann rutscht Form2.Button1 auf Form1.

Lazarus 5.99 (rev main_4_99-5672-gcdf9a904cc) FPC 3.2.2 x86_64-linux-gtk3

Benutzeravatar
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?

Beitrag von fliegermichl »

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.

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;

wp_xyz
Beiträge: 5512
Registriert: Fr 8. Apr 2011, 09:01

Re: Parent eines Controls in anderem Formular?

Beitrag von wp_xyz »

Bei mir geht's
Dateianhänge
ParentChanging.zip
(5.14 KiB) 7-mal heruntergeladen

Benutzeravatar
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?

Beitrag von fliegermichl »

wp_xyz hat geschrieben: Mo 9. Nov 2026, 13:24Bei mir geht's
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;
Dann verschwindet der SpeedButton aus dem Formular und wird als Kindelement von Groupbox1 angezeigt.
Das funktioniert aber eben nicht, wenn ich als Parent ein anderes Formular angebe.

wp_xyz
Beiträge: 5512
Registriert: Fr 8. Apr 2011, 09:01

Re: Parent eines Controls in anderem Formular?

Beitrag von wp_xyz »

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.

Benutzeravatar
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?

Beitrag von Zvoni »

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

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;
Und jede deiner Formen leitet sich von dieser Klasse ab

Code: Alles auswählen

Uses UnitmitMeineForm;  // in  Form1, Form2, Form3 und wo auch immer
Type
  TForm1 = Class(TMeineForm) 
  //blablaba
  //Restliche Controls usw.
  End;
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"
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.

Benutzeravatar
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?

Beitrag von fliegermichl »

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.
Dateianhänge
project1.zip
(95.88 KiB) 5-mal heruntergeladen

wp_xyz
Beiträge: 5512
Registriert: Fr 8. Apr 2011, 09:01

Re: Parent eines Controls in anderem Formular?

Beitrag von wp_xyz »

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.

Benutzeravatar
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?

Beitrag von fliegermichl »

wp_xyz hat geschrieben: Mo 9. Nov 2026, 15:11 Du hast Form2 und Form3 in den Auto-Create-Forms gelistet,
Argh, normalerweise lasse ich kein Formular automatisch erzeugen. Aber bei der neuen Lazarusinstallation hatte ich das noch nicht angegeben.
Du hast Recht. Wenn autocreate aus ist, funktioniert es.

Danke!

Benutzeravatar
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?

Beitrag von Zvoni »

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.
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?
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.

Benutzeravatar
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?

Beitrag von af0815 »

Zvoni hat geschrieben: Mo 9. Nov 2026, 16:06 Alter Schwede....diese Konstruktion wäre mir echt zu wackelig.
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.

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).

Antworten