![]() |
falsche Anordnung von TPanels
Guten Morgen
Ich habe eine Delphi-App für Android. Beim Umschalten von Landscape nach Portrait sollen sechs Elemente vom Typ TPanel anders angeordnet werden. Sie sollen so aufgebaut werden: Portrait: pnlAxis0, pnlAxis01, pnlAxis1, pnalAxis11, pnlAxis2,pnlAxis21 Landscape: pnlAxis0, pnlAxis1, pnalAxis2, die anderen drei unsichtbar. Alle Panels sind Align.Top eingestellt. Wenn man von Landscape nach Portrait umschaltet, dann stimmt die Reihenfolge nicht mehr. Dargestellt wird: pnlAxis0, pnlAxis01, pnlAxis1, pnalAxis2, pnlAxis11,pnlAxis21 Habe bereits allerlei probiert.
Delphi-Quellcode:
Ich bin ratlos und ChatGPT konnte mir auch nicht weiterhelfen:)
procedure TmDROMainForm.UpdateLayout(aPortrait:Boolean);
var Panels: TArray<TPanel>; ScreenService: IFMXScreenService; begin Panels := [pnlAxis21, pnlAxis2, pnlAxis11, pnlAxis1, pnlAxis01, pnlAxis0]; // umgekehrte Reihenfolge für InsertObject(0,...) try pnlClient.BeginUpdate; for var P in Panels do if P.Parent = pnlClient then pnlClient.RemoveObject(P); pnlAxis01.height:=50; pnlAxis11.height:=50; pnlAxis21.height:=50; If aPortrait then begin // Portrait pnlAxis01.Visible :=true; pnlAxis11.Visible :=true; pnlAxis21.Visible :=true; mAxisItem[0].W.Parent:= pnlAxis01; mAxisItem[0].Divider.Parent:= pnlAxis01; mAxisItem[0].Buzzer.Parent:= pnlAxis01; mAxisItem[1].W.Parent:= pnlAxis11; mAxisItem[1].Divider.Parent:= pnlAxis11; mAxisItem[1].Buzzer.Parent:= pnlAxis11; mAxisItem[2].W.Parent:= pnlAxis21; mAxisItem[2].Divider.Parent:= pnlAxis21; mAxisItem[2].Buzzer.Parent:= pnlAxis21; end else begin // Landscape pnlAxis01.Visible :=false; pnlAxis11.Visible :=false; pnlAxis21.Visible :=false; mAxisItem[0].W.Parent:= pnlAxis0; mAxisItem[0].Divider.Parent:= pnlAxis0; mAxisItem[0].Buzzer.Parent:= pnlAxis0; mAxisItem[1].W.Parent:= pnlAxis1; mAxisItem[1].Divider.Parent:= pnlAxis1; mAxisItem[1].Buzzer.Parent:= pnlAxis1; mAxisItem[2].W.Parent:= pnlAxis2; mAxisItem[2].Divider.Parent:= pnlAxis2; mAxisItem[2].Buzzer.Parent:= pnlAxis2; end; // Sichtbare Panels in richtiger Reihenfolge wieder einfügen for var P in Panels do P.Align := TAlignLayout.Top; // Sichtbare Panels in richtiger Reihenfolge (von unten nach oben) wieder einfügen for var I := High(Panels) downto 0 do if Panels[I].Visible then pnlClient.AddObject(Panels[I]); finally pnlClient.EndUpdate; end; // Layout und Style auffrischen pnlClient.Repaint; for var i := 0 to pnlClient.ChildrenCount - 1 do Log.d(pnlClient.Children[i].Name); end; LG Geri |
AW: falsche Anordnung von TPanels
Liste der Anhänge anzeigen (Anzahl: 2)
Hier noch Bilder zur Landscape und der falschen Darstellung in Portrait
|
AW: falsche Anordnung von TPanels
Statt
Delphi-Quellcode:
würd' ich die Panels hier auch entsprechend Deiner Anforderung auflisten.
for var P in Panels do
P.Align := TAlignLayout.Top; In der For-Schleife werden sie (vermutlich) in der Erstellungsreihenfolge abgearbeitet und nicht zwingend in der von Dir gewünschten. Was sagt denn der Debugger zu der Abfolge der Panels in der For-Schleife? |
AW: falsche Anordnung von TPanels
Delphi-Quellcode:
liefert, dass die Elemente richtig eingefügt sind.
for var i := 0 to pnlClient.ChildrenCount - 1 do
Log.d(pnlClient.Children[i].Name); Portrait: pnlAxis0, pnlAxis01, pnlAxis1, pnalAxis11, pnlAxis2,pnlAxis21 Habe nun mal Align nacheinander aufgerufen.
Delphi-Quellcode:
führt zu keiner Verbesserung// Sichtbare Panels in richtiger Reihenfolge wieder einfügen If aPortrait then begin pnlAxis21.Align := TAlignLayout.Top; pnlAxis2.Align := TAlignLayout.Top; pnlAxis11.Align := TAlignLayout.Top; pnlAxis1.Align := TAlignLayout.Top; pnlAxis01.Align := TAlignLayout.Top; pnlAxis0.Align := TAlignLayout.Top; end; // for var P in Panels do // P.Align := TAlignLayout.Top; // Sichtbare Panels in richtiger Reihenfolge (von unten nach oben) wieder einfügen for var I := High(Panels) downto 0 do if Panels[I].Visible then pnlClient.AddObject(Panels[I]); finally pnlClient.EndUpdate; end; // Layout und Style auffrischen pnlClient.Repaint; for var i := 0 to pnlClient.ChildrenCount - 1 do Log.d(pnlClient.Children[i].Name); end; |
AW: falsche Anordnung von TPanels
Versuch mal, in der korrekten Reihenfolge die Alignment auf MostTop zu setzen.
|
AW: falsche Anordnung von TPanels
Folgender Code hat auch zu keiner Verbesserung geführt.
Delphi-Quellcode:
If aPortrait then
begin pnlAxis21.Align := TAlignLayout.MostTop; pnlAxis2.Align := TAlignLayout.MostTop; pnlAxis11.Align := TAlignLayout.MostTop; pnlAxis1.Align := TAlignLayout.MostTop; pnlAxis01.Align := TAlignLayout.MostTop; pnlAxis0.Align := TAlignLayout.MostTop; end; |
AW: falsche Anordnung von TPanels
Noch ein Hinweis. Unter MS-Windows tritt mit dem Code das selbe Problem auf.
und pnlClient.ChildrenCount hat den Wert 5. Ich hätte 6 erwartet
Delphi-Quellcode:
for var i := 0 to pnlClient.ChildrenCount - 1 do
Log.d(pnlClient.Children[i].Name); |
AW: falsche Anordnung von TPanels
Hm, ich habe wohl nicht genau genug hingeschaut.
Hat es einen bestimmten Grund, dass du die Panels aus ihrem Parent entfernst und wieder einfügst? Das könnte nämlich schon das ganze Problem sein. Ich habe so eine Konstruktion noch nirgendwo verwendet, aber ich würde vermuten, dass das entfernen und wieder einfügen alle vorigen Alignment-Änderungen quasi negiert, da die Panels zum Zeitpunkt der Alignment-Änderung kein Parent haben, welches die Anordnung bestimmt, und dadurch beim erneuten Einfügen auf unerwünschte Weise angeordnet werden. |
AW: falsche Anordnung von TPanels
ChatGPT hatte den Vorschlag. Wenn ich RemoveObject und AddObject weglasse (siehe Code unten) ist die Ausgabe auch falsch.
Delphi-Quellcode:
procedure TmDROMainForm.UpdateLayout(aPortrait:Boolean);
var Panels: TArray<TPanel>; ScreenService: IFMXScreenService; begin Panels := [pnlAxis21, pnlAxis2, pnlAxis11, pnlAxis1, pnlAxis01, pnlAxis0]; // umgekehrte Reihenfolge für InsertObject(0,...) try pnlClient.BeginUpdate; { for var P in Panels do if P.Parent = pnlClient then pnlClient.RemoveObject(P); } pnlAxis01.height:=50; pnlAxis11.height:=50; pnlAxis21.height:=50; If aPortrait then begin // Portrait pnlAxis01.Visible :=true; pnlAxis11.Visible :=true; pnlAxis21.Visible :=true; mAxisItem[0].W.Parent:= pnlAxis01; mAxisItem[0].Divider.Parent:= pnlAxis01; mAxisItem[0].Buzzer.Parent:= pnlAxis01; mAxisItem[1].W.Parent:= pnlAxis11; mAxisItem[1].Divider.Parent:= pnlAxis11; mAxisItem[1].Buzzer.Parent:= pnlAxis11; mAxisItem[2].W.Parent:= pnlAxis21; mAxisItem[2].Divider.Parent:= pnlAxis21; mAxisItem[2].Buzzer.Parent:= pnlAxis21; end else begin // Landscape pnlAxis01.Visible :=false; pnlAxis11.Visible :=false; pnlAxis21.Visible :=false; mAxisItem[0].W.Parent:= pnlAxis0; mAxisItem[0].Divider.Parent:= pnlAxis0; mAxisItem[0].Buzzer.Parent:= pnlAxis0; mAxisItem[1].W.Parent:= pnlAxis1; mAxisItem[1].Divider.Parent:= pnlAxis1; mAxisItem[1].Buzzer.Parent:= pnlAxis1; mAxisItem[2].W.Parent:= pnlAxis2; mAxisItem[2].Divider.Parent:= pnlAxis2; mAxisItem[2].Buzzer.Parent:= pnlAxis2; end; // Sichtbare Panels in richtiger Reihenfolge wieder einfügen If aPortrait then begin pnlAxis21.Align := TAlignLayout.Top; pnlAxis2.Align := TAlignLayout.Top; pnlAxis11.Align := TAlignLayout.Top; pnlAxis1.Align := TAlignLayout.Top; pnlAxis01.Align := TAlignLayout.Top; pnlAxis0.Align := TAlignLayout.Top; { pnlClient.AddObject(pnlAxis21); pnlClient.AddObject(pnlAxis2); pnlClient.AddObject(pnlAxis11); pnlClient.AddObject(pnlAxis1); pnlClient.AddObject(pnlAxis01); pnlClient.AddObject(pnlAxis0); } end else begin pnlAxis2.Align := TAlignLayout.Top; pnlAxis1.Align := TAlignLayout.Top; pnlAxis0.Align := TAlignLayout.Top; pnlAxis21.Align := TAlignLayout.Top; pnlAxis11.Align := TAlignLayout.Top; pnlAxis01.Align := TAlignLayout.Top; { pnlClient.AddObject(pnlAxis2); pnlClient.AddObject(pnlAxis1); pnlClient.AddObject(pnlAxis0); pnlClient.AddObject(pnlAxis21); pnlClient.AddObject(pnlAxis11); pnlClient.AddObject(pnlAxis01); } end; // for var P in Panels do // P.Align := TAlignLayout.Top; // Sichtbare Panels in richtiger Reihenfolge (von unten nach oben) wieder einfügen // for var I := High(Panels) downto 0 do // if Panels[I].Visible then // pnlClient.AddObject(Panels[I]); // ShowMessage(TPanel(p).name) finally pnlClient.EndUpdate; end; |
AW: falsche Anordnung von TPanels
Ein Versuch:
Delphi-Quellcode:
If aPortrait then
begin // Panels in der Reihenfolge von unten nach oben anordnen: pnlAxis21.Align := TAlignLayout.Top; pnlAxis21.Top := 0; pnlAxis2.Align := TAlignLayout.Top; pnlAxis2.Top := 0; pnlAxis11.Align := TAlignLayout.Top; pnlAxis11.Top := 0; pnlAxis1.Align := TAlignLayout.Top; pnlAxis1.Top := 0; pnlAxis01.Align := TAlignLayout.Top; pnlAxis01.Top := 0; pnlAxis0.Align := TAlignLayout.Top; pnlAxis0.Top := 0; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz