Controls in anderen Forms "klauen"

Rund um die LCL und andere Komponenten
Antworten
Nimral
Beiträge: 101
Registriert: Mi 10. Jun 2015, 11:33

Controls in anderen Forms "klauen"

Beitrag von Nimral »

Ich arbeite gerne mit einem Form und blende dort je nach Bedarf Panels ein und aus. Das wird mit der Zeit etwas voll im Forms-Designer. Kann man eigentlich ein Panel samt seinen ganzen Controils auch in einem anderen Form entwerfen und dann irgendwie im eigenen Form nützen?

Thx, Armin.

Benutzeravatar
Winni
Beiträge: 672
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Controls in anderen Forms "klauen"

Beitrag von Winni »

Hi!

Statt solch Design-Akrobatik solltest Du Dir mal TPageControl (Reiter Common Controls) ansehen. Beliebig viele Seiten jeweils mit einem Reiter. Hervorragend geeignet für den Fall, dass die Form zu voll wird.

Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 840
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Controls in anderen Forms "klauen"

Beitrag von fliegermichl »

Du brauchst nur das otherform.Panel.Parent := thisform zuweisen.
Allerdings musst du aufpassen, daß du das rückgängig machst wegen der Ownerschaft.

charlytango
Beiträge: 333
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Controls in anderen Forms "klauen"

Beitrag von charlytango »

Überfüllung im Fenster ist immer ein Thema.
Deswegen gibt es auch immer viele Diskussionen zur Benutzerführung.

TPageControl wie winnie empfohlen hat ist sicher die erste Anlaufstelle.
https://www.andre-winkelmann.de/lazarus ... gecontrol/

Auch andere Ordnungselemente wie TTabcontrol, TScrollBox, TFlowbox kommen in Frage, sind aber komplexer zu handhaben.
Es gibt aber auch die Möglichkeit das mit Frames (TFrame) zu lösen.
https://lazarus-ccr.sourceforge.io/docs ... frame.html
https://www.andre-winkelmann.de/lazarus ... ek/tframe/
Oder auch zB ein komplettes Form samt allen darauf befindlichen Conrols und deren Funktion direkt irgendwo einzudocken bzw einzubauen.

Code: Alles auswählen

var
  owndLeft:TfrmSettingsManager;
begin

  owndLeft := TfrmSettingsManager.Create(self);

  owndLeft.DisableAlign;
  owndLeft.Align := alClient;
  owndLeft.ManualDock(PanelXY, NIL, alClient);
  owndLeft.EnableAlign;
  owndLeft.Show; 

end;  
wobei PanelXY nur ein Beispiel für ein existierendes Panel ist in das das Fenster eingebaut wird. Du kannst es zB auch in ein TTabsheet eines Pagecontrol einbauen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4569
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Controls in anderen Forms "klauen"

Beitrag von af0815 »

Ich verwende da konsequent Frames, die erst zur Laufzeit eingebunden werden. Damut habe ich die Funktion immer mit dem Frame zusammen gebündelt und nicht ein einem ewig langen Programm versteckt. Oft habe ich auch Frame in Frame in Frame.

Ein weiterer Vorteil ist, das ich somit ein fertiges Frame öfters verwenden kann, sogar in verschiedenen Applikationen, wenn man die Schnittstellen konsequent betreibt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Controls in anderen Forms "klauen"

Beitrag von wp_xyz »

Die einzige praktable Lösung, die übervolle Formulare in verschiedene Dateien aufspaltet, ist mit Frames zu arbeiten. Zum Beispiel ein PageControl mit 5 verschiedenen Seiten, auf denen jeweils sehr viele unterschiedliche Controls sitzen. Das alles in ein und demselben Formular zu verwalten, bedingt eine ellenlange Komponentenliste in der Formular-Deklaration, die kreuz und quer durcheinander gewürfelt ist, und sehr sehr viele Event Handler. Erzeuge stattdessen für jede Seite des PageControl einen Frame, damit wandern die dazu gehörigen Controls und deren Event-Handler in eine eigene Datei, die des Frame. Auf dem Hauptformular bleibt ein PageControl mit fünf leeren Seiten. Widerstehe dem Drang, die Frames schon zur Designzeit in die Seiten einzufügen - das geht zwar im Prinzip, aber es kann zu leicht ein Event-Handler durch einen versehentlichen Klick ausgehängt werden, so dass man lange suchen muss, warum etwas nicht funktioniert was doch funktionieren sollte. Daher immer die Frames erst zur Laufzeit erzeugen und in ihren Parent einfügen.

Der Konfigurationsdialog der IDE ist ein wunderschönes Beispiel, wie man einen extrem komplexen Dialog durch Frames entzerren und handhabbar machen kann.

Antworten