質問です。
コントロールの表示順序(Z オーダ)を頻繁に変える機会があるのですが、良い方法が見当たりません。
SetZOrder メソッドでは最上位・最下位にしか移動できないので、任意の位置に表示する方法が知りたいのです。
なにとぞ、ご教授よろしくお願いいたします。
見えない部分のオーダはどうでもいいような気がしますが、
どうなんでしょ?
この考えで行けば、BringToFront だけで済むような・・・
いえ、どうでもよくないから質問しているのです ;)
任意の順序に表示する方法をご存じないでしょうか。
こんなのはどうでしょ?
(あらかじめ FZOrder: Integer をフィールドとして追加)
function ZOrderCompare(Item1, Item2: Pointer): Integer;
begin
Result:= TCmp(Item1).FZOrder - TCmp(Item2).FZOrder;
end;
procedure TCmp.SetZOrderPosition(Value: Integer);
var
i: Integer;
AList: TList;
begin
FZOrder:= Value;
AList:= TList.Create;
try
for i:=0 to Owner.ControlCount-1 do
if Owner.Controls[i] is TCmp then AList.Add(Owner.Controls[i]);
AList.Sort(ZOrderCompare);
for i:=0 to AList.Count-1 do begin
TCmp(AList[i]).BringToFront;
end;
finally
AList.Free;
end;
end;
使えるかわからないが・・・
protected
TWinControl.SetChildOrder(Child: TComponent; Order: Integer); override;
推測で書いてみますが、こんなクラス一個用意して、
SetChildOrderの第一引数(Child)に、オーダを変更したいコントロール、
第二引数(Order)に順序を与えると、自由に変えることができる気がする。
(気がするだけで、もちろんためしてはいません)
Orderは、0〜Child.Parent.ControlCount - 1 の範囲と思われる。
type
TZOrderCtrl=class(TWinControl)
public
SetChildOrder(Child: TComponent; Order: Integer); override;
end;
TZOrderCtrl.SetChildOrder(Child: TComponent; Order: Integer);
begin
inherited SetChildOrder(Child, Order);
end;
うまくいったら、報告求む。
>通りすがり さん
ドンピシャリです。
そんな手があったとは驚きです。ありがとうございました。
>おっ さん。
すみません。SetChildOrder はすでに試していましたが、うまくいきませんでした。
ただ、順序自体は変化するらしいので、用途によっては使えるメソッドのようです。
ツイート | ![]() |