Z オーダを任意の値に設定するには?

解決


おおさわ  2005-08-31 05:47:18  No: 17328

質問です。
コントロールの表示順序(Z オーダ)を頻繁に変える機会があるのですが、良い方法が見当たりません。
SetZOrder メソッドでは最上位・最下位にしか移動できないので、任意の位置に表示する方法が知りたいのです。
なにとぞ、ご教授よろしくお願いいたします。


deldel  2005-09-01 23:29:56  No: 17329

見えない部分のオーダはどうでもいいような気がしますが、
どうなんでしょ?
この考えで行けば、BringToFront だけで済むような・・・


おおさわ  2005-09-01 23:43:30  No: 17330

いえ、どうでもよくないから質問しているのです ;)
任意の順序に表示する方法をご存じないでしょうか。


通りすがり  2005-09-01 23:59:35  No: 17331

こんなのはどうでしょ?

(あらかじめ 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;


おっ  2005-09-02 02:13:50  No: 17332

使えるかわからないが・・・
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;  

うまくいったら、報告求む。


おおさわ  2005-09-02 06:30:58  No: 17333

>通りすがり さん
ドンピシャリです。
そんな手があったとは驚きです。ありがとうございました。

>おっ さん。
すみません。SetChildOrder はすでに試していましたが、うまくいきませんでした。
ただ、順序自体は変化するらしいので、用途によっては使えるメソッドのようです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加