Delphi-PRAXiS

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;

Uwe Raabe 3. Jun 2025 10:35

AW: falsche Anordnung von TPanels
 
Du könntest auch die Height der Panels auf 0 setzen und das Visible auf True belassen. Den originalen Wert kannst du dir irgendwo (z.B. TagFloat) merken um später die Height wiederherzustellen. Die Panels behalten dann ihre relative Position bei.

Delphi.Narium 3. Jun 2025 10:44

AW: falsche Anordnung von TPanels
 
Andere Idee:

Bei allen Panels Align auf Bottom setzen, dann sind sie erstmal unten angeordnet.

Dann in der Reihenfolge, in der sie von oben angeordnet werden sollen, Align auf Top setzen.

haentschman 3. Jun 2025 10:45

AW: falsche Anordnung von TPanels
 
Hallöle...8-)

Wie wäre es mit TGridPanel?
https://www.youtube.com/watch?v=w2HI...listerChristie

:wink:

Geri 3. Jun 2025 10:48

AW: falsche Anordnung von TPanels
 
Immer noch selbiges Ergebnis mit

Delphi-Quellcode:
  If aPortrait then
    begin
        pnlAxis21.Align := TAlignLayout.Top;
        pnlAxis21.Position.y := 0;
        pnlAxis2.Align := TAlignLayout.Top;
        pnlAxis2.Position.y := 0;
        pnlAxis11.Align := TAlignLayout.Top;
        pnlAxis11.Position.y := 0;
        pnlAxis1.Align := TAlignLayout.Top;
        pnlAxis1.Position.y := 0;
        pnlAxis01.Align := TAlignLayout.Top;
        pnlAxis01.Position.y := 0;
        pnlAxis0.Align := TAlignLayout.Top;
        pnlAxis0.Position.y := 0;
     end;

Uwe Raabe 3. Jun 2025 11:01

AW: falsche Anordnung von TPanels
 
Zitat:

Zitat von haentschman (Beitrag 1549186)
Wie wäre es mit TGridPanel?

TGridPanel ist ein VCL-Control und das kann kein Android. Unter FMX wäre das eher ein TGridPanelLayout. In beiden Fällen muss man sich dann aber immer noch um das Aus- und Einblenden der Zeilen selbst kümmern.

Deswegen auch mein Ansatz mit dem Height := 0. Damit umgeht man das Umsortieren der Controls auf Basis des Alignments, was unweigerlich beim Visible := False bzw. True erfolgt.

Geri 3. Jun 2025 11:05

AW: falsche Anordnung von TPanels
 
Zitat:

Zitat von uwe raabe (Beitrag 1549184)
du könntest auch die height der panels auf 0 setzen und das visible auf true belassen. Den originalen wert kannst du dir irgendwo (z.b. tagfloat) merken um später die height wiederherzustellen. Die panels behalten dann ihre relative position bei.

Mit folgendem Code ergibt sich auch keine Besserung.

Delphi-Quellcode:
procedure TmDROMainForm.UpdateLayout_VHeight(aPortrait:Boolean);
begin

  try
    pnlClient.BeginUpdate;
    If aPortrait then
     begin
      pnlAxis01.Height:=60;
      pnlAxis11.Height:=60;
      pnlAxis21.Height:=60;
      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.Height:=0;
      pnlAxis11.Height:=0;
      pnlAxis21.Height:=0;

      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;
   finally
     pnlClient.EndUpdate;
  end;
  // Layout und Style auffrischen
  pnlClient.Repaint;
end;

Geri 3. Jun 2025 11:13

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nur zur Info: Hier auch noch Screenshot der Objektstruktur.

Uwe Raabe 3. Jun 2025 11:21

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich kann es leider nicht auf Android probieren, aber unter Windows funktioniert das hier angehängte Beispiel schon: https://app.screencast.com/cYGiQaqPxeV40

AuronTLG 3. Jun 2025 11:23

AW: falsche Anordnung von TPanels
 
Eventuell könnte das BeginUpdate/EndUpdate noch reinpfuschen.
Wenn das ohne immer noch nicht funktioniert, ist dann aber etwas komisch. Ich habe sowas auch schon umsetzen müssen und hatte keine Probleme dabei.

Geri 3. Jun 2025 12:54

AW: falsche Anordnung von TPanels
 
@Uwe

Vielen Dank für dein Beispiel. Dein Beispiel funktioniert.

Habe meinen Code anschließend deinem Beispiel folgendermaßen angepasst. Immer noch das selbe Erbenis.
Delphi-Quellcode:
procedure TmDROMainForm.Button1Click(Sender: TObject);
begin
  // UpdateLayout(true);
  LandScape := not LandScape;
end;

procedure TmDROMainForm.SetLandScape(const Value: Boolean);
begin
  if FLandScape <> Value then
  begin
    FLandScape := Value;
    if FLandscape then
    begin
      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
    else
    begin
      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;

    for var pnl in [pnlAxis01, pnlAxis11, pnlAxis21] do
    begin
      if Value then
        HidePanel(pnl)
      else
      begin
        ShowPanel(pnl);
      end;

    end;
  end

end;

Zitat:

Zitat von AuronTLG (Beitrag 1549192)
Eventuell könnte das BeginUpdate/EndUpdate noch reinpfuschen.
Wenn das ohne immer noch nicht funktioniert, ist dann aber etwas komisch. Ich habe sowas auch schon umsetzen müssen und hatte keine Probleme dabei.

Habe ich mal entfernt. Keine Verbesserung.

Geri 3. Jun 2025 13:01

AW: falsche Anordnung von TPanels
 
Noch eine Info dazu: Habe in das Beispiel von Uwe noch Cornerbuttons, wie bei mir eingefügt. Das funktioniert auch
Delphi-Quellcode:
procedure TForm1.ShowPanel(APanel: TPanel);
begin
  APanel.Height := APanel.TagFloat;
end;

procedure TForm1.SetLandScape(const Value: Boolean);
begin
  if FLandScape <> Value then
  begin
    FLandScape := Value;
    if Value then
    begin
       btn1.parent:=panel1;
       btn2.parent:=panel1;
       btn3.parent:=panel3;
       btn4.parent:=panel3;
       btn5.parent:=panel5;
       btn6.parent:=panel5;
    end
    else
    begin
       btn1.parent:=panel2;
       btn2.parent:=panel2;
       btn3.parent:=panel4;
       btn4.parent:=panel4;
       btn5.parent:=panel6;
       btn6.parent:=panel6;
    end;
    for var pnl in [Panel2, Panel4, Panel6] do
    begin
      if Value then
        HidePanel(pnl)
      else
        ShowPanel(pnl);
    end;
  end;
end;

Uwe Raabe 3. Jun 2025 13:27

AW: falsche Anordnung von TPanels
 
Also, das Verfahren funktioniert nun zwar prinzipiell, aber dummerweise in deinem konkreten Fall nicht. Dann muss da noch irgendwas anderes die Ursache sein und somit brauchen wird noch ein paar mehr Informationen.

Geri 3. Jun 2025 14:08

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 3)
So, habe nun mal ein Programm mit den selben Panels erstellt.

Anbei das Projekt.
Nicht er identische, aber ähnlicher Fehler. Alle Panels pnlAxis01, pnlAxis11 und pnlAxis21, die im Portrai-Modus dargestellt sind, werden am Ende angehängt
Vielleicht hat es etwas mit dem Stylebook zu tnun

Delphi-Quellcode:
unit uFirstApp;

interface

uses
  System.Rtti, System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,FMX.Objects,
  FMX.Controls.Presentation, System.ImageList, FMX.ImgList, FMX.Layouts
  {$ifdef ANDROID}
  ,
  Androidapi.JNI.Bluetooth,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  Androidapi.jni.app,
  Androidapi.JNI.Os,
  Androidapi.JNI.Net,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNIBridge,
  System.IOUtils
  {$endif}
  ;

type
  TForm1 = class(TForm)
    pnlAxis0: TPanel;
    btnAxisName0: TCornerButton;
    SB: TStyleBook;
    btnAxisValue0: TCornerButton;
    btnAxisUnit0: TCornerButton;
    btnAxisDiv0: TCornerButton;
    btnAxisW0: TCornerButton;
    btnAxisBuzzer0: TCornerButton;
    ImageList1: TImageList;
    pnlAxis2: TPanel;
    btnAxisName2: TCornerButton;
    btnAxisValue2: TCornerButton;
    btnAxisUnit2: TCornerButton;
    btnAxisDiv2: TCornerButton;
    btnAxisBuzzer2: TCornerButton;
    pnlAxis1: TPanel;
    btnAxisName1: TCornerButton;
    btnAxisValue1: TCornerButton;
    btnAxisUnit1: TCornerButton;
    btnAxisDiv1: TCornerButton;
    btnAxisW1: TCornerButton;
    btnAxisBuzzer1: TCornerButton;
    Button1: TButton;
    btnAxisW2: TCornerButton;
    pnlAxis21: TPanel;
    pnlAxis11: TPanel;
    pnlAxis01: TPanel;
    procedure Button1Click(Sender: TObject);
  private
   FLandScape: Boolean;
   procedure SetLandScape(const Value: Boolean);
    { Private declarations }
  protected
    procedure ShowPanel(APanel: TPanel);
    procedure HidePanel(APanel: TPanel);
  public
    property LandScape: Boolean read FLandScape write SetLandScape;

  end;
var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
 LandScape := not LandScape;
end;

procedure TForm1.SetLandScape(const Value: Boolean);
begin
  if FLandScape <> Value then
  begin
    FLandScape := Value;
    if FLandscape then
    begin
      btnAxisW0.parent:= pnlAxis0;
      btnAxisDiv0.parent:= pnlAxis0;
      btnAxisBuzzer0.parent:= pnlAxis0;

      btnAxisW1.parent:= pnlAxis1;
      btnAxisDiv1.parent:= pnlAxis1;
      btnAxisBuzzer1.parent:= pnlAxis1;

      btnAxisW2.parent:= pnlAxis2;
      btnAxisDiv2.parent:= pnlAxis2;
      btnAxisBuzzer2.parent:= pnlAxis2;
    end
    else
    begin
      btnAxisW0.parent:= pnlAxis01;
      btnAxisDiv0.parent:= pnlAxis01;
      btnAxisBuzzer0.parent:= pnlAxis01;

      btnAxisW1.parent:= pnlAxis11;
      btnAxisDiv1.parent:= pnlAxis11;
      btnAxisBuzzer1.parent:= pnlAxis11;

      btnAxisW2.parent:= pnlAxis21;
      btnAxisDiv2.parent:= pnlAxis21;
      btnAxisBuzzer2.parent:= pnlAxis21;
    end;

    for var pnl in [pnlAxis01, pnlAxis11, pnlAxis21] do
    begin
      if Value then
        HidePanel(pnl)
      else
      begin
        ShowPanel(pnl);
      end;
    end;
  end

end;


procedure TForm1.HidePanel(APanel: TPanel);
begin
  APanel.TagFloat := APanel.Height;
  APanel.Height := 0;
end;

procedure TForm1.ShowPanel(APanel: TPanel);
begin
  APanel.Height := APanel.TagFloat;
end;

end.

Uwe Raabe 3. Jun 2025 14:12

AW: falsche Anordnung von TPanels
 
Ist das Absicht, dass der Anhang in deinem letzten Post exakt meinem Beispiel entspricht? Interessanter wäre ein Beispiel, bei dem es nicht funktioniert.

Geri 3. Jun 2025 15:00

AW: falsche Anordnung von TPanels
 
Ja, das war Absicht, damit es übersichtlicher wird. Meiner Ansicht stimmt hier die Reihenfolge auch nicht.
Die Anordnung sollte in der Portrait-Ansicht:

SOLL:
pnlAxis0
pnlAxis01
pnlAxis1
pnlAxis11
pnlAxis2
pnlAxis21
sein.

IST:
pnlAxis0
pnlAxis1
pnlAxis2
pnlAxis01
pnlAxis11
pnlAxis21

Uwe Raabe 3. Jun 2025 15:09

AW: falsche Anordnung von TPanels
 
In dem Code-Beispiel kommen aber gar keine pnlAxis<irgendwas> vor. Der Anhang ist exakt die Zip-Datei, die ich in meinem Anhang schon mitgeschickt hatte.

Geri 3. Jun 2025 15:18

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, hast recht, mein Fehler.

Anbei das Projekt.

Uwe Raabe 3. Jun 2025 15:32

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 3)
Wenn ich die Panel in ein TLayout setze, wie in meinem Beispiel, funktioniert es.

Geri 3. Jun 2025 16:10

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, so wie bei dir sollte es aussehen. Bei mir tut es das nicht.

Ich nutze Delphi 12 Community Edition

Die Version sollte recht aktuell sein, habe sie letzte Woche installiert.

Gibt es evtl. noch globale Einstellungen, die zu dem Verhalten führen könnten?

Geri 3. Jun 2025 16:12

AW: falsche Anordnung von TPanels
 
mit Layout geht es bei mir auch:-D

Ich probiere nun noch das komplexere Programm

Geri 3. Jun 2025 16:20

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Beim komplexeren Programm funktioniert es noch nicht.

Uwe Raabe 3. Jun 2025 16:25

AW: falsche Anordnung von TPanels
 
Die Panels sollten direkt unter dem Layout liegen. Der pnlClient als Zwischenschicht macht es wieder kaputt.

Geri 3. Jun 2025 20:54

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend

Anbei das abgespeckte Projekt mit dem Problem.
Bin schon sehr gespannt, was es sein wird.

@Uwe, Layout-so wie du meinstest hatte auch keine Besserung gebracht.

Uwe Raabe 3. Jun 2025 23:59

AW: falsche Anordnung von TPanels
 
Nun, die Panel müssen natürlich schon zur Designzeit in der richtigen Reihenfolge angeordnet sein. Zur Laufzeit werden die schmalen Panels ja nur verborgen, die Reihenfolge bleibt aber unverändert.

Die Reihenfolge der Panels muss also im Designer schon so aussehen (sortiert nach Position.Y aufsteigend): pnlAxis0, pnlAxis01, pnlAxis1, pnlAxis11, pnlAxis2, pnlAxis21

Geri 4. Jun 2025 06:50

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen

Zitat:

Zitat von Uwe Raabe (Beitrag 1549212)
Die Reihenfolge der Panels muss also im Designer schon so aussehen (sortiert nach Position.Y aufsteigend): pnlAxis0, pnlAxis01, pnlAxis1, pnlAxis11, pnlAxis2, pnlAxis21

Das ist meiner Ansicht doch bereits so,:gruebel:

Hoffe, ich übersehe nicht ganz etwas Elementares:shock:

Uwe Raabe 4. Jun 2025 08:50

AW: falsche Anordnung von TPanels
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal meine Änderungen angehängt. So funktioniert es zumindest hier: https://app.screencast.com/JrwUBgjqBV3ve

Um die schmalen Panels voneinander unterscheiden zu können habe ich bei den Buttons eine unterschiedliche Beschriftung gewählt.

Geri 4. Jun 2025 11:42

AW: falsche Anordnung von TPanels
 
Vielen Dank allen und insbesondere dir Uwe für deine große Mühe!🤗

Nachdem ich den Tab order geändert hatte und die Elemente anschließend entsprechend verschoben habe, funktioniert es nun unter Windows und Android.

Es zeigt sich wieder mal, dass es immer wieder die einfachen Dinge und die Grundlagen sind😀

Obwohl mich ChatGPT sonst sehr hilfreich dünkt ist es trotzdem sehr interessant, welche Vorschläge ich zuvor damit bekam. Auf das Naheliegende ist es auch nicht gekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 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