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

解決


おおさわ  2005-08-30 20:47:18  No: 17328  IP: 192.*.*.*

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

編集 削除
deldel  2005-09-01 14:29:56  No: 17329  IP: 192.*.*.*

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

編集 削除
おおさわ  2005-09-01 14:43:30  No: 17330  IP: 192.*.*.*

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

編集 削除
通りすがり  2005-09-01 14:59:35  No: 17331  IP: 192.*.*.*

こんなのはどうでしょ?

(あらかじめ 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-01 17:13:50  No: 17332  IP: 192.*.*.*

使えるかわからないが・・・
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-01 21:30:58  No: 17333  IP: 192.*.*.*

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

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

編集 削除