Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   falsche Anordnung von TPanels (https://www.delphipraxis.net/217272-falsche-anordnung-von-tpanels.html)

Geri 3. Jun 2025 07:36

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:
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;
Ich bin ratlos und ChatGPT konnte mir auch nicht weiterhelfen:)

LG Geri

Geri 3. Jun 2025 07:42

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier noch Bilder zur Landscape und der falschen Darstellung in Portrait

Delphi.Narium 3. Jun 2025 07:48

AW: falsche Anordnung von TPanels
 
Statt
Delphi-Quellcode:
 for var P in Panels do
      P.Align := TAlignLayout.Top;
würd' ich die Panels hier auch entsprechend Deiner Anforderung auflisten.

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?

Geri 3. Jun 2025 08:15

AW: falsche Anordnung von TPanels
 
Delphi-Quellcode:
 for var i := 0 to pnlClient.ChildrenCount - 1 do
    Log.d(pnlClient.Children[i].Name);
liefert, dass die Elemente richtig eingefügt sind.
Portrait: pnlAxis0, pnlAxis01, pnlAxis1, pnalAxis11, pnlAxis2,pnlAxis21


Habe nun mal Align nacheinander aufgerufen.

Delphi-Quellcode:

    // 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;
führt zu keiner Verbesserung

AuronTLG 3. Jun 2025 08:28

AW: falsche Anordnung von TPanels
 
Versuch mal, in der korrekten Reihenfolge die Alignment auf MostTop zu setzen.

Geri 3. Jun 2025 08:38

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;

Geri 3. Jun 2025 08:55

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

AuronTLG 3. Jun 2025 09:50

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.

Geri 3. Jun 2025 10:06

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;

Delphi.Narium 3. Jun 2025 10:09

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 22:53 Uhr.
Seite 1 von 4  1 23     Letzte »    

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