2

以下のコードは、D7 の設計時の .BPL で行っていることを簡略化したものです。

更新:これを投稿してから、私が求めていることを行う 1 つの方法を見つけました。つまり、フォームに WM_Close メッセージを送信するだけですが、もっと「公式な」方法があるかどうかを知りたいと思っています。 WM_Close を使用すると、IDE の足元が間違っている可能性があるように思われるためです。

このコードで問題を引き起こしているのは、IDE で開いているすべてのファイルを閉じてから、.Dfm ファイルが関連付けられている特定の .Pas ファイルを開くことだけです。.Dfm で定義されたフォームを画面上で開いたくないので、.Pas ファイルも閉じにフォームを閉じようとしています。IDE フォーム デザイナーとこのフォームを邪魔にならないようにしたいだけです。 .

最終的に、私は .BPL のコードで OTA + NTA サービスを介してフォームにアクセスする方法を見つけました。単純に、しかしそれを行う他の明らかな方法が欲しかったので、このスニペットで .Close を呼び出してみました。

AForm := TForm(INTAComp.GetComponent);
AForm.Close;

ただし、フォームは閉じません。CPU ウィンドウから TCustomForm.Close をトレースしましたが、明らかに閉じない理由は、Visible プロパティが既に False になっているためです。これは、AForm.Close の前に Visible を評価しても返されるものです。

AForm.Close の前に他のさまざまなプロパティを評価すると、所有者は Nil ですが、明らかに有効なウィンドウ ハンドルを持っていることがわかります。[ペニーが落ちる音...上記の更新を参照]

これは、IDE のフォーム デザイナの動作に関係していると言えます。

私の質問は単純です: フレームの [x] ボタンをクリックしたときのように、フォームを閉じるにはコードで何をする必要がありますか?

ところで、AForm := [...] を介して取得しているフォームのインスタンスが、OI で画面上のインスタンスのキャプションを変更することにより、画面上のインスタンスであることを確認しました。

procedure TOTAForm.CloseAForm;
var
  IServices : IOTAServices;
  IActionServices : IOTAActionServices;
  IModuleServices : IOTAModuleServices;
  IEditorServices : IOTAEditorServices60;
  IModule : IOTAModule;
  i : Integer;
  IEditor : IOTAEditor;
  ISourceEditor : IOTASourceEditor;
  IFormEditor : IOTAFormEditor;
  IComponent : IOTAComponent;
  INTAComp : INTAComponent;
  AForm : TForm;
begin
  IServices := BorlandIDEServices as IOTAServices;

  IServices.QueryInterface(IOTAACtionServices, IActionServices);
  if IActionServices <> Nil then begin
    IServices.QueryInterface(IOTAModuleServices, IModuleServices);
    IModuleServices.CloseAll;
    if IActionServices.OpenFile(EditorFileName) then begin
      IModule := IModuleServices.Modules[0];
      ISourceEditor := Nil;
      for i := 0 to IModule.ModuleFileCount - 1 do begin
        IEditor := IModule.ModuleFileEditors[i];
        IEditor.QueryInterface(IOTAFormEditor, IFormEditor);
        if IFormEditor <> Nil then begin
          IComponent := IFormEditor.GetRootComponent;
          IComponent.QueryInterface(INTAComponent, INTAComp);
          AForm := TForm(INTAComp.GetComponent);
          AForm.Close;
        end;
      end;
    end;
  end;
end;
4

1 に答える 1