{
Die Reihenfolge, in der die Steuerelemente
(Controls)übereinandergestapelt werden (die sogenannte Z-Order), hängt von der Reihenfolge ab, in der die Steuerelemente in das Formular eingefügt wurden. Wenn Sie beispielsweise eine Beschriftung und ein Bild so in ein Formular einfügen, dass ein Element auf dem anderen liegt, kommt das Objekt, das zuerst plaziert wurde, zuunterst zu liegen. Da sowohl Beschriftungen als auch Bilder nicht fensterorientierte Steuerelemente sind, werden sie in der bekannten Weise übereinandergestapelt. Durch einen Aufruf der Methode BringToFront können Sie das verdeckte Objekt ganz nach vorn bringen, mit SendToBack das oberste ganz nach unten verlagern.

Die Stapelreihenfolge für fensterorientierte Steuerelemente ist identisch mit der Reihenfolge für nicht fensterorientierte Steuerelemente. Wenn Sie beispielsweise ein TMemo in ein Formular einfügen und dann ein TEdit auf ihm ablegen, bleibt das TEdit oben. Erst ein Aufruf der Methode
BringToFront bringt das TMemo in den Vordergrund.

Fensterorientierte und nicht fensterorientierte Steuerelemente werden getrennt gestapelt. Wenn Sie beispielsweise ein TMemo (ein fensterorientiertes Steuerelement) und danach eine Beschriftung (TLabel: ein nicht fensterorientiertes Steuerelement) in ein Formular einfügen, verschwindet die Beschriftung hinter dem TMemo. Fensterorientierte Steuerelemente kommen immer über nicht fensterorientierten Steuerelementen zu liegen. Hier bewirkt also der Aufruf der Methode BringToFront nicht das Gewünschte. Die Beschriftung bleibt hinter dem TMemo verborgen.

Um nun ein Control (innerhalb seiner Kategorie) um nur eine einzige Stufe in der ZOrder zu verschieben, habe ich den nachfolgenden Code geschrieben.
}


// Getestet mit D4 unter XP

function WCntrl(Control: TControl; Up: Boolean; Anzahl: integer): Boolean; 
var 
  i, x, z: Integer; 
begin 
  result := false; 
  z := 0; 
  x := -1; 
  for i := 0 to Anzahl do begin 
    if not (Control.Parent.Controls[i] is TWinControl) then inc(z); 
    if Control.Parent.Controls[i] = Control then begin 
      x := i; 
      break; 
    end; 
  end; 
  if x < 0 then exit; 
  if Up then begin 
    if x = Anzahl then exit; 
    inc(x); 
    Control.BringToFront; 
    for i := x to pred(Anzahl) do 
      Control.Parent.Controls[x].BringToFront; 
  end else begin 
    if x = z then exit; 
    dec(x); 
    Control.SendToBack; 
    for i := x downto succ(z) do 
      Control.Parent.Controls[x].SendToBack; 
  end; 
  result := true; 
end; 
 
function Cntrl(Control: TControl; Up: Boolean; Anzahl: integer): Boolean; 
var 
  i, x, z: Integer; 
begin 
  result := false; 
  z := 0; 
  x := -1; 
  for i := 0 to Anzahl do begin 
    if Control.Parent.Controls[i] is TWinControl then break; 
    inc(z); 
    if Control.Parent.Controls[i] = Control then x := i; 
  end; 
  if x < 0 then exit; 
  if Up then begin 
    dec(z); 
    if x = z then exit; 
    inc(x); 
    Control.BringToFront; 
    for i := x to pred(z) do 
      Control.Parent.Controls[x].BringToFront; 
  end else begin 
    if x = 0 then exit; 
    dec(x); 
    Control.SendToBack; 
    for i := x downto 1 do 
      Control.Parent.Controls[x].SendToBack; 
  end; 
  result := true; 
end; 
 

 
function BringToNext(Control: TControl; Up: Boolean): Boolean; 
var 
  Anzahl: integer; 
begin 
  if Control.Parent = nil then 
    result := false 
  else begin 
    Anzahl := Pred(Control.Parent.ControlCount); 
    if Control is TWinControl then 
      result := WCntrl(Control, Up, Anzahl) 
    else result := Cntrl(Control, Up, Anzahl); 
  end; 
end; 
 
 
// Beispielaufruf 
 
procedure TForm1.FormClick(Sender: TObject); 
begin 
  if not BringToNext(Panel5, false) then beep;  // fensterorientiert
end; 
 
// oder 
 
procedure TForm1.Button3Click(Sender: TObject); 
begin 
  if not BringToNext(Image3, false) then beep;  // nicht fensterorientiert
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke