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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.600 Beiträge
 
Delphi 7 Professional
 
#1

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

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

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

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
 
#5

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
342 Beiträge
 
Delphi 12 Athens
 
#6

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
 
#7

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.600 Beiträge
 
Delphi 7 Professional
 
#8

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 Uwe Raabe
Uwe Raabe

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

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


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 18:06 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