AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

falsche Anordnung von TPanels

Ein Thema von Geri · begonnen am 3. Jun 2025 · letzter Beitrag vom 4. Jun 2025
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
68 Beiträge
 
Delphi 2005 Personal
 
#1

falsche Anordnung von TPanels

  Alt 3. Jun 2025, 07:36
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
Gerhard
  Mit Zitat antworten Zitat
Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
68 Beiträge
 
Delphi 2005 Personal
 
#2

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 07:42
Hier noch Bilder zur Landscape und der falschen Darstellung in Portrait
Miniaturansicht angehängter Grafiken
landscape.jpg   portrait.jpg  
Gerhard
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.562 Beiträge
 
Delphi 7 Professional
 
#3

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 07:48
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?
  Mit Zitat antworten Zitat
Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
68 Beiträge
 
Delphi 2005 Personal
 
#4

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 08:15
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
Gerhard
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
333 Beiträge
 
Delphi 12 Athens
 
#5

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 08:28
Versuch mal, in der korrekten Reihenfolge die Alignment auf MostTop zu setzen.
  Mit Zitat antworten Zitat
Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
68 Beiträge
 
Delphi 2005 Personal
 
#6

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 08:38
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;
Gerhard
  Mit Zitat antworten Zitat
Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
68 Beiträge
 
Delphi 2005 Personal
 
#7

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 08:55
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);
Gerhard

Geändert von Geri ( 3. Jun 2025 um 08:58 Uhr)
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
333 Beiträge
 
Delphi 12 Athens
 
#8

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 09:50
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.
  Mit Zitat antworten Zitat
Geri

Registriert seit: 23. Nov 2004
Ort: Feldkirch
68 Beiträge
 
Delphi 2005 Personal
 
#9

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 10:06
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;
Gerhard

Geändert von Geri ( 3. Jun 2025 um 10:09 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.562 Beiträge
 
Delphi 7 Professional
 
#10

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 10:09
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 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