Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Panelreheinfolge einhalten. (https://www.delphipraxis.net/189881-panelreheinfolge-einhalten.html)

Luckner 3. Aug 2016 14:17

Panelreheinfolge einhalten.
 
Hallo,

habe in einer Form mehrere Panels untereinander. In jedem dieser Panels sind verschiedene Datensätze. Je nach dem ob in diesen Panels Datensätze vorhanden sind oder nicht, sind diese sichtbar oder nicht. Wenn Datensätze in einem Panel vorhanden sind, dann wird entsprechendes Button markiert(Farbänderung) und Panel ist sichtbar. Das funktioniert auch gut, aber die Reiehnfolge wird nicht immer eingehalten. Hier das Besp:
Delphi-Quellcode:
procedure TFrameArtikel.Panellinksreihenfolge;
begin
 If (ButtonHaftEtikett.Color = clLime) then
     begin
       PanelArtikel.Align := alTop;
       PanelArtikel.Visible := True;
     end
 else
     begin
       PanelArtikel.Visible := false;
     end;

 If ButtonDienstleistung.Color = clLime Then
    begin
      PanelDienstleistung.Align := alTop;
      PanelDienstleistung.Visible := True;
    end
 else
    begin
      PanelDienstleistung.Visible := false;
    end;

 If ButtonNummerierung.Color = clLime Then
    begin
      PanelNummerierung.Align := alTop;
      PanelNummerierung.Visible := True;
    end
 else
    begin
      PanelNummerierung.Visible := false;
    end;

usw.
Wie kann ich die Panelreihenfolge besser platzieren. Es sind ca. 20 Stck.

Danke, Luckner

Uwe Raabe 3. Aug 2016 14:26

AW: Panelreheinfolge einhalten.
 
Delphi: How to programmatically adjust visual ordering of components with align = alTop

Luckner 3. Aug 2016 14:42

AW: Panelreheinfolge einhalten.
 
Habe vergessen noch zu erwähnen, das beim 1-ten Durchlauf die Reihenfolge immer eingehalten wird. Erst bei weiterem Aufruf dieser Routine werden die Panels durcheinander gewirbelt.

Sherlock 3. Aug 2016 14:56

AW: Panelreheinfolge einhalten.
 
Natürlich werden sie durcheinandergewirbelt, wenn sie mal sichtbar, mal unsichtbar sind. Folge einfach Uwes Link.

Sherlock

tcoman 3. Aug 2016 15:07

AW: Panelreheinfolge einhalten.
 
Ich verwende bei solchen Dingen immer die
Panel1.SetBounds(x1, y1, dx, dy); Einstellung.

Je nachdem, ob sichtbar oder nicht erhoehe ich
eine Integer Variable um den Wert der Panel1.Height,
dem ich den Wert y1 hinzufuege.

Will aber dem professionellen Tip von Herrn Raabe
nicht vorgreifen.

MfG,
Terence

Luckner 3. Aug 2016 15:28

AW: Panelreheinfolge einhalten.
 
Habe mir den Tip von Uwe Raabe angesehen, aber keine wahre Lösung gefunden. Es sind mehrere Ansätze vorgeschlagen, die jedoch nicht zur einem soliden Weg führen müssen. Bevor ich meine Sortieroutine aufrufe, setze ich ich erstmal alle Panels aud visible := false. Was ich nicht verstehe, nach welchen Kriterium entscheiden Delphi in welcher Reihenfolge die Panels sortiert werden. In meiner Routine geht es doch immer in einer festen Reihenfolge. Wan springt ein Panel vor das Andere und wann bleibt es dahinter?

Luckner

Luckner 3. Aug 2016 15:32

AW: Panelreheinfolge einhalten.
 
Hallo tcoman, wenn ich Das so machen würde, müßte ich erst herausfinden, welches von den Panels davor sichtbar sind oder nicht. Bei ca. 20 Panels ist das schon ein zeitl. Aufwand.

MichaelT 3. Aug 2016 15:57

AW: Panelreheinfolge einhalten.
 
Setze die Höhe auf 0?
Tabstop nicht vergessen auszuschalten.

Ist ein Panel mal Invisible wird es am unteren Ende angereiht. Es hilft auch nichts wenn du die Panels von unten nach oben invisible setzt, sobald du einmal eines auslässt reiht es sich unten an.




Zitat:

Zitat von Luckner (Beitrag 1344079)
Habe mir den Tip von Uwe Raabe angesehen, aber keine wahre Lösung gefunden. Es sind mehrere Ansätze vorgeschlagen, die jedoch nicht zur einem soliden Weg führen müssen. Bevor ich meine Sortieroutine aufrufe, setze ich ich erstmal alle Panels aud visible := false. Was ich nicht verstehe, nach welchen Kriterium entscheiden Delphi in welcher Reihenfolge die Panels sortiert werden. In meiner Routine geht es doch immer in einer festen Reihenfolge. Wan springt ein Panel vor das Andere und wann bleibt es dahinter?

Luckner


Luckner 3. Aug 2016 16:08

AW: Panelreheinfolge einhalten.
 
Hallo MichaelT, werde mal Dein Tipp mit der Höhe ausprobieren. Wenn ich alle Panals erst invisible mache und da in der richtigen Reihenfolge onTop und visible mache, müsste die an die richtigen Stelle springen? aber ich probiere erst mal die Höhe auf 0 setzen.

Luckner

Luckner 3. Aug 2016 16:16

AW: Panelreheinfolge einhalten.
 
Hallo MichaelT, leider funktioniert es auch nicht. Es juckt Delphi nicht, ob die Panelhöhe mal auf 0 ist.

MichaelT 3. Aug 2016 16:19

AW: Panelreheinfolge einhalten.
 
Genau das tun die Panels eben nicht tut es eben nicht, das habe ich schon probiert zuvor.

Die Höhe 0 verhindert nicht, dass das Control als solches aktiv weiterlebt. Das ist ein wenig blöd. Man müsste in eine Methode das konkrete Panel reingeben, dann die Controls durchiterieren und den Owner auf den Namen des Panels abfragen. Ganz astrein ist die Methode nicht. Erinnert an eine russische Lösung von weit hinter dem Ural. Aber wenn man den Tabstopp wie zuvor beschrieben abschaltet am versteckten Panel und allen Controls auf die auf demselben angesprungen werden können, dann sollte dieser Hack grad noch durchgehen mit allen Hühneraugen zugedrückt.


Zitat:

Zitat von Luckner (Beitrag 1344082)
Hallo MichaelT, werde mal Dein Tipp mit der Höhe ausprobieren. Wenn ich alle Panals erst invisible mache und da in der richtigen Reihenfolge onTop und visible mache, müsste die an die richtigen Stelle springen? aber ich probiere erst mal die Höhe auf 0 setzen.

Luckner


MichaelT 3. Aug 2016 16:21

AW: Panelreheinfolge einhalten.
 
Die Panels bleiben Visible, also nicht Visible:=false; setzen.


Zitat:

Zitat von Luckner (Beitrag 1344083)
Hallo MichaelT, leider funktioniert es auch nicht. Es juckt Delphi nicht, ob die Panelhöhe mal auf 0 ist.


Luckner 3. Aug 2016 16:36

AW: Panelreheinfolge einhalten.
 
Oh ja, das sieht gut aus. Werde morgen den Test mit den anderen Panels noch machen. Aber es gibt Hoffnung.

Danke!!!

mm1256 3. Aug 2016 16:36

AW: Panelreheinfolge einhalten.
 
Ich würde bei der Gelegenheit noch den Code etwas übersichtlicher machen, und anstelle der Color das Property "Tag" nehmen. Wobei das "Tag" auch keine perfekte Lösung ist :oops:

Delphi-Quellcode:
procedure TFrameArtikel.Panellinksreihenfolge;

  procedure AdjustPanel(aPanel: TPanel; aButton: TButton);
  const
    PanelHeight: array[boolean] of Integer = (0, 100);
  begin
    aPanel.Height := PanelHeight[aButton.Tag = 0];
    aPanel.Enabled := aButton.Tag = 0;
    aPanel.TabStop := aButton.Tag = 0;
  end;

begin
  AdjustPanel(PanelArtikel, ButtonHaftEtikett);
  AdjustPanel(PanelDienstleistung, ButtonDienstleistung);
  . . . usw.

Sir Rufo 3. Aug 2016 21:19

AW: Panelreheinfolge einhalten.
 
Delphi-Quellcode:
unit Unit2;

interface

uses
  Vcl.Controls;

procedure ReAlignChildControls( AParentControl: TWinControl );

implementation

uses
  System.Types;

procedure ReAlignChildControls( AParentControl: TWinControl );
var
  lIdx   : Integer;
  lBounds : TRect;
  lControl: TControl;
begin
  lBounds := AParentControl.ClientRect;

  for lIdx := 0 to AParentControl.ControlCount - 1 do
    begin
      lControl := AParentControl.Controls[ lIdx ];

      if not lControl.Visible
      then
        Continue;

      case lControl.Align of
        alTop:
          begin
            lControl.Top := lBounds.Top;
            lBounds.Inflate( 0, -lControl.Height, 0, 0 );
          end;
        alBottom:
          begin
            lControl.Top := lBounds.Bottom - lControl.Height;
            lBounds.Inflate( 0, 0, 0, -lControl.Height );
          end;
        alLeft:
          begin
            lControl.Left := lBounds.Left;
            lBounds.Inflate( -lControl.Width, 0, 0, 0 );
          end;
        alRight:
          begin
            lControl.Left := lBounds.Right - lControl.Width;
            lBounds.Inflate( 0, 0, -lControl.Width, 0 );
          end;
      end;
    end;
end;

end.
Die Ausrichtung erfolgt anhand der Z-Order (kann man über
Delphi-Quellcode:
TControl.BringToFront
oder
Delphi-Quellcode:
TControl.SendToBack
beeinflussen).

Luckner 9. Aug 2016 13:22

AW: Panelreheinfolge einhalten.
 
Hallo MichaelT,

also es funktioniert nicht. Wenn ich die Höhe mal auf 0 setze, dann auf die benötigte Grösse, dann bleiben die Panels dort wo ich sie in der Form gesetzt haben. Die sollen jedoch die Position in der richtigen Reihefolge wechseln, je nach dem welche Panel davor sichtbar sind. wenn ich noch die Eigenschalt alTop setze, dann legt mir das Programm die Panels zum Teil übereinander. Werde mir den Vorschlag von Sir Rufo vornehmen und versuchen den zu verstehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz