{
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 dobeginifnot (Control.Parent.Controls[i] is TWinControl) then inc(z);
if Control.Parent.Controls[i] = Control thenbegin
x := i;
break;
end;
end;
if x < 0 then exit;
if Up thenbeginif x = Anzahl then exit;
inc(x);
Control.BringToFront;
for i := x to pred(Anzahl) do
Control.Parent.Controls[x].BringToFront;
endelsebeginif 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 dobeginif 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 thenbegin
dec(z);
if x = z then exit;
inc(x);
Control.BringToFront;
for i := x to pred(z) do
Control.Parent.Controls[x].BringToFront;
endelsebeginif 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;
beginif Control.Parent = nilthen
result := false
elsebegin
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);
beginifnot BringToNext(Panel5, false) then beep; // fensterorientiertend;
// oder
procedure TForm1.Button3Click(Sender: TObject);
beginifnot BringToNext(Image3, false) then beep; // nicht fensterorientiertend;