以下のコードは、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;