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 13. Jun 2025
Antwort Antwort
Seite 1 von 2  1 2      
Geri

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

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
72 Beiträge
 
Delphi 2005 Personal
 
#2

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
341 Beiträge
 
Delphi 12 Athens
 
#3

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
72 Beiträge
 
Delphi 2005 Personal
 
#4

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.599 Beiträge
 
Delphi 7 Professional
 
#5

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
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#6

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 10:45
Hallöle...

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

  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#7

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 11:01
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Geri

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

AW: falsche Anordnung von TPanels

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

Geändert von Geri ( 3. Jun 2025 um 11:08 Uhr) Grund: Tippfehler im Code
  Mit Zitat antworten Zitat
Geri

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

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 10:48
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;
Gerhard
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#10

AW: falsche Anordnung von TPanels

  Alt 3. Jun 2025, 10:35
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:43 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