Mehrer TPanels untereinander in fest dinierten Folge anzeigen.
-
- 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.
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
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
Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.
Kannst du ein minimales Beispielprojekt anhängen, welches diese Situation zeigt?
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 374
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.
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
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
-
- 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.
Hier die Sortierprocedure
Luckner
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;
-
- 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.
Biite die Zeilen "Panellinks" und "Panelrechts" ignorieren.
Luckner
Luckner
Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.
Das ist kein Projekt, das ist ein Schnipsel.
Aber ja, die Eigenschaft "Top" bringt dich wahrscheinlich weiter, wie Jörg schon sagte.

Aber ja, die Eigenschaft "Top" bringt dich wahrscheinlich weiter, wie Jörg schon sagte.
- af0815
- Lazarusforum e. V.
- Beiträge: 6801
- 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.
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.
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).
-
- 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.
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
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
Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.
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).
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) 57-mal heruntergeladen
Zuletzt geändert von wp_xyz am Mo 19. Sep 2022, 15:43, insgesamt 2-mal geändert.
-
- 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.
Hallo af0815,
ja, ich glaube so werde ich es auch machen. Ich wollte einige Automatismen benutzen, aber Handarbeit ist wohl gefragt.
Luckner
ja, ich glaube so werde ich es auch machen. Ich wollte einige Automatismen benutzen, aber Handarbeit ist wohl gefragt.
Luckner
- af0815
- Lazarusforum e. V.
- Beiträge: 6801
- 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.
Der Vorschlag von wp_xyz ist interessant zumindest einen Versuch Wert, bevor man die Rechenkeule auspacktLuckner 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

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

Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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.
Habe mir das Beispiel angeschaut und es funktioniert. Leider habe ich nicht verstanden wie 

- af0815
- Lazarusforum e. V.
- Beiträge: 6801
- 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.
Das Geheimnis: Geh beim MainPanel unter ChildSizing hinein und schau die dort die Parameter an.Luckner hat geschrieben: Mo 19. Sep 2022, 15:06 Habe mir das Beispiel angeschaut und es funktioniert. Leider habe ich nicht verstanden wie![]()
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).
Re: Mehrer TPanels untereinander in fest dinierten Folge anzeigen.
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.
-
- 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.
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.