Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Rund um die LCL und andere Komponenten
Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Hallo Profis,

habe folgendes Problem. Habe in einem Menü mehrere Buttons, die dann mehrere Panel untereinander anzeigen oder auch unsichtbar machen. In meinem Programm mache ich das so, dass wen ich ein entsprechendes Button drücke, dann das entsprechende Panel in alTop gesetzt wird. Nochmal drücken, Panel wird unsichtbar. Leider springt auch mal ein Panel zwischen andere Panels, was so nicht sein sollte. Ich wollte über TabOrder die Panels sortieren, aber es funktioniert nicht. Gibt es eine andere Möglichkeit?

Gruß, Luckner

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

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von theo »

Kannst du ein minimales Beispielprojekt anhängen, welches diese Situation zeigt?

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 169
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Jorg3000 »

Hi!
Wenn man mehrere Elemente mit Align=alTop hat, werden sie in der Reihenfolge ihrer Eigenschaft .Top (Y-Koordinate) angezeigt.
Für eine bestimmte Reihenfolge muss man sich also irgendwo die höchste verwendete Y-Position merken. Wenn ein neues Panel kommt, das gemerkte Y erhöhen und dem Panel als .Top zuweisen.
Grüße, Jörg

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Hier die Sortierprocedure

Code: Alles auswählen

procedure TFrameArtikelstamm.Panelesortieren();
begin
  if ButtonNummerierung.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelNummerierung.Visible:= True;
    PanelNummerierung.Align:= alTop;
    PanelNummerierung.Height:= ComboBoxNummernkreise.Top + ComboBoxNummernkreise.Height + 10;
  end
  else
  begin
    PanelNummerierung.Visible:= false;
  end;

  if ButtonAufRolle.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelAufRolle.Visible:= True;
    PanelAufRolle.Align:= alTop;
    PanelAufRolle.Height:= EditRolleAnmerkung.Top + EditRolleAnmerkung.Height + 10;
  end
  else
  begin
    PanelAufRolle.Visible:= false;
  end;

  if ButtonLeporello.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelLeporello.Visible:= True;
    PanelLeporello.Align:= alTop;
    PanelLeporello.Height:= EditLepoAnmerkung.Top + EditLepoAnmerkung.Height + 10;
  end
  else
  begin
    PanelLeporello.Visible:= false;
  end;

  if ButtonBlattware.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelBlattware.Visible:= True;
    PanelBlattware.Align:= alTop;
    ButtonBlattware.Height:= ComboBoxAnzahlBlattware.Top + ComboBoxAnzahlBlattware.Height + 10;
  end
  else
  begin
    PanelBlattware.Visible:= false;
  end;

  if ButtonPerfo.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelPerfo.Visible:= True;
    PanelPerfo.Align:= alTop;
  end
  else
  begin
    PanelPerfo.Visible:= false;
  end;

  if ButtonSplittung.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelSplittung.Visible:= True;
    PanelSplittung.Align:= alTop;
  end
  else
  begin
    PanelSplittung.Visible:= false;
  end;

  if ButtonDruck.Color = $00FF00 then
  begin
    PanelLinks.Visible:= True;
    PanelDruck.Visible:= True;
    PanelDruck.Align:= alTop;
  end
  else
  begin
    PanelDruck.Visible:= false;
  end;

  if ButtonStanze.Color = $00FF00 then
  begin
    PanelRechts.Visible:= True;
    PanelStanze.Visible:= True;
    PanelStanze.Align:= alTop;
  end
  else
  begin
    PanelStanze.Visible:= false;
  end;
end;          

Luckner

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Biite die Zeilen "Panellinks" und "Panelrechts" ignorieren.

Luckner

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

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von theo »

Das ist kein Projekt, das ist ein Schnipsel. :wink:
Aber ja, die Eigenschaft "Top" bringt dich wahrscheinlich weiter, wie Jörg schon sagte.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von af0815 »

Für über Betriebssystem Grenzen hinweg stabile Designs verwende ich generell kein Align. Auch auf die Farbe eines Buttons als Kriterium zu nehmen ist IMHO zu überdenken. Variablen (auch in Records strukturiert) fressen keinen Platz und man ist vom Design unabhängig.

Für solche Konstrukte rechne ich das Grundgerüst und hänge dann das Detaillayout dort hinein. Das bleibt dann auch bei unterschiedlichen Rechnern und Betriebssystem dann in weiten Grenzen stabil. Und wenn verwende ich nur noch AnchorDocking.

So nebenbei, unter Windows kann man keine (Standard-)Buttons einfärben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Klar ist nur ein Schnipsel.
Mit der Top.Eigenschaft wird es schwierig, weil bei 10 Panels, die untereinander stehen, mal alle angezeigt werden und mal nur Einige. Die Reihenfolge sollte eingehalten werden. Es gibt dann für jedes Panel mehrere Möglichkeiten. Ah ja, die Panelhöhe kann auch bei jedem Panel unterschiedlich ausfallen.

Luckner

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

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von wp_xyz »

Die Eigenschaft Top im Zusammenhang mit Align ist unter Lazarus sehr störrisch und neigt dazu, die Reihenfolge umzustellen - es gibt dazu einige Posts.

Ich würde stattdessen das ChildSizing des Containers verwenden - siehe beigefügtes Mini-Projekt. Wenn man mit dem ChildSizing.Layout cclLeftToRightThenTopToBottom und ChildSizing.ControlsPerLine = 1 und EnlargeHorizontal = crsHomogenousChildresize arbeitet, ist die vertikale Reihenfolge immer gegeben durch die Reihenfolge, in der die Kind-Komponenten in den Container eingefügt werden (man kann zur Designzeit mit den Befehlen von "Z-order" aber noch umstellen).
Dateianhänge
childsizing_show-hide-panel.zip
(2.45 KiB) 37-mal heruntergeladen
Zuletzt geändert von wp_xyz am Mo 19. Sep 2022, 15:43, insgesamt 2-mal geändert.

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Hallo af0815,

ja, ich glaube so werde ich es auch machen. Ich wollte einige Automatismen benutzen, aber Handarbeit ist wohl gefragt.

Luckner

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von af0815 »

Luckner hat geschrieben:
Mo 19. Sep 2022, 14:09
Hallo af0815,

ja, ich glaube so werde ich es auch machen. Ich wollte einige Automatismen benutzen, aber Handarbeit ist wohl gefragt.

Luckner
Der Vorschlag von wp_xyz ist interessant zumindest einen Versuch Wert, bevor man die Rechenkeule auspackt :-)

AnchorDocking und die Panels mit Visible ein/ausschalten ist meiner Erfahrung auch sehr stabil. Nur mit den Align's habe ich schlechte Erfahrung gemacht (außer alClient).

@wp_xyz: Danke für das Beispiel. Edit: Geht echt geil - wieder was gelernt (muss es nur komplett verstehen :lol: ).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Habe mir das Beispiel angeschaut und es funktioniert. Leider habe ich nicht verstanden wie :(

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
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: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von af0815 »

Luckner hat geschrieben:
Mo 19. Sep 2022, 15:06
Habe mir das Beispiel angeschaut und es funktioniert. Leider habe ich nicht verstanden wie :(
Das Geheimnis: Geh beim MainPanel unter ChildSizing hinein und schau die dort die Parameter an.
Screenshot 2022-09-19 151933.jpg
Screenshot 2022-09-19 151933.jpg (28.59 KiB) 808 mal betrachtet
Die Parameter was rot sind, hat wp_xyz geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von wp_xyz »

Luckner hat geschrieben:
Mo 19. Sep 2022, 15:06
Leider habe ich nicht verstanden wie :(
Am besten einfach mal ausprobieren: https://wiki.freepascal.org/Autosize_/_Layout#Layout

Hinweis:
Mich hat lange gestört, dass in TRadioGroup die Radiobuttons links so nahe am Rand kleben. Nachdem ich bemerkt habe, dass TRadioGroup (und TCheckGroup) nur eine raffinierte Anwendung des ChildSizing ist, konnte ich den Abstand über RadioGroup.ChildSizing.LeftRightSpacing vergrößern.

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.

Beitrag von Luckner »

Habe das Layout auf "cclLeftToRightThenTopToBottom" geändert. Diese Änderung hat dann die Panels durcheinandergewirbellt nach irgendeinem Prinzip. Wenn ich wüßte nach welchem. Die anderen Einträge ändern nur die Abstände.

Antworten