Einzelnen Beitrag anzeigen

Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.413 Beiträge
 
Delphi 12 Athens
 
#1

ZOrder von Controls ändern

  Alt 26. Mai 2003, 15:06
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;
......

[edit=Matze] Mfg, Matze[/edit]
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat