Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi ZOrder von Controls ändern (https://www.delphipraxis.net/5173-zorder-von-controls-aendern.html)

sakura 26. Mai 2003 15:06


ZOrder von Controls ändern
 
Hi, desöfteren wurde bereits nachgefragt, wie sich die Z-Order (Reihenfolge) von Controls ändern läßt.

Im Design-Modus kann dieses einfach durch das Anklicken der entsprechenden Control mit der rechten Maustaste -> entsprechender Menüpunkt geändert werden.

Im Code kann man die Befehle
Delphi-Quellcode:
Control.BringToFront;
Control.SendToBack;
nutzen, aber leider ist es nicht direkt möglich die Control nur um eine Position zu verschieben.

Folgender Code hilft dabei. Der erste Parameter is die Control, welche verschoben werden soll, der zweite bestimmt die Richtung.

Delphi-Quellcode:
procedure ChangeControlZOrder(Sender: TObject; MoveUp: Boolean = True);
var
  I, Curr: Integer;
  Control: TControl;
  List: TList;
begin
  if Sender is TControl then
  begin
    // sender kann z-order ändern
    Control := Sender as TControl;
    // sender ist einer Control (zur Darstellung) zugeordnet
    if Control.Parent = nil then
      // nee
      Exit;
    // position der control ermitteln
    Curr := -1;
    for I := 0 to Pred(Control.Parent.ControlCount) do
      if Control.Parent.Controls[I] = Sender then
      begin
        Curr := I;
        Break;
      end;
    if Curr < 0 then
      // hm, position nicht gefunden
      Exit;
    List := TList.Create;
    try
      if MoveUp then
      begin
        for I := Curr + 2 to Pred(Control.Parent.ControlCount) do
          // die restlichen controls merken
          List.Add(Control.Parent.Controls[I]);
        // control nach vorne bringen
        Control.BringToFront;
        for I := 0 to Pred(List.Count) do
          // die restlichen controls wieder vorholen
          TControl(List[I]).BringToFront;
      end else
      begin
        for I := 0 to Curr - 2 do
          // die restlichen controls merken
          List.Add(Control.Parent.Controls[I]);
        // control nach vorne bringen
        Control.SendToBack;
        for I := Pred(List.Count) downto 0 do
          // die restlichen controls wieder vorholen
          TControl(List[I]).SendToBack;
      end;
    finally
      List.Free;
    end;
  end;
end;
...:cat:...

[edit=Matze] Mfg, Matze[/edit]


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