1

Delphi で MDI アプリケーションを作成しました。画面に表示されるアプリケーションに多数の MDIChild フォームがあると仮定します。これらのフォームでループを実行し、各フォームが画面に表示される順序を確認したいと思います。

たとえば、3 つの MDICHild フォームがある場合:

FormAFormBFormC

FormB部分的に重複FormAし、FormC部分的に FormB と重複する

次のように Z プロパティ (深さ) をマークしたいと思います。

FormB.Z = 2 // that form is between FormA and FormC
FormA.Z = 3 // that form's distance is longest from user, form is overlapped by FormB and 
FormC.Z = 1 // that form is at the top of all forms in my application 

御時間ありがとうございます。

4

2 に答える 2

4

Jの答えは Screen.Forms をループします。これには、非 MDI フォームを含む、アプリケーション内のすべてのフォームが含まれます。コメントからわかるように。メイン フォームと [About] ボックスを手動でフィルター処理できますが、これは面倒です。また、他のフォームに対しても同じことを行う必要があります。エラーが発生しやすいように見えるので、私は本当にそうしなければならないのは好きではありません。

あなたの質問は、親内の MDI 子フォームの z オーダーのみを知りたいと言っています。この場合、はるかに優れた解決策があります。

MDI の子は、MDI 親フォームの MDIChildren プロパティに z ソート順にリストされます。Z 深度を検出するコードは、次のようになります (未テスト)。

function FindChildDepth(Child : TForm) : Integer;
var
  i : Integer;
begin
  Result := -1; // Form not found
  for i := 0 to MDIChildCount-1 do
  begin
    if (MDIChildren[i] == Child) then
    begin
      Result := i;
      Exit;
    end;
  end;
end;

これは、0 と n-1 の間の子の深さを返す必要があります。ここで、0 は上であり、フォームが MDIChildren 配列に見つからない場合は -1 です。"1" を 0 ではなくトップを意味するようにするには、単純に Result を i+1 に設定します。

于 2009-11-11T01:05:18.270 に答える
1

Screen.Forms プロパティを使用して、アプリケーション内のフォームを反復処理します。必要に応じて、Z オーダーでそれらを返します。

たとえば、1 つの MDIForm と 3 つの MDIChild フォームを含むアプリケーションを作成します。

メイン フォームのメニュー オプションで、次のように入力します。

procedure TForm1.mnuFormOrder2Click(Sender: TObject);
var
  i: Integer;
  s: String;
begin
  s := '';
  for i := 0 to Pred(Screen.FormCount) do
  begin
    s := s + Screen.Forms[i].Caption+#13;
  end;

  MessageBox(Self.Handle, PChar(s),
    PChar(Self.Caption), MB_OK or MB_ICONINFORMATION or MB_TASKMODAL);
end;

これにより、フォームの名前を Z シーケンスで一覧表示するメッセージが表示されます。メインフォームもリストされますが、これをコーディングできます。別の子フォームをアクティブにし、メニュー オプションをもう一度クリックすると、フォームの順序が変更されていることがわかります。

于 2009-11-10T15:03:56.357 に答える