gpt4 book ai didi

forms - 如何关闭(以代码形式)IDE已打开的窗体,而不关闭其关联的.Pas文件

转载 作者:行者123 更新时间:2023-12-03 18:36:09 24 4
gpt4 key购买 nike

下面的代码是从我在D7的设计时.BPL中所做的工作简化而来的。

更新:自发布以来,我已经找到了一种执行所需操作的方法,即仅向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 BUT
-它具有明显有效的窗口句柄// // Arrghh! [一分钱掉下来的声音...请参阅上面的更新]

我敢说这与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;

最佳答案

它所需要的只是:

AForm := TForm(INTAComp.GetComponent);
SendMessage(AForm.Handle, WM_Close, 0, 0);
//AForm.Close;


但是我仍然想知道是否有官方的方法来这样做,因为
我的“解决方案”感觉像是围绕OTA和NTA服务进行了最终运行。 Otoh,用户始终可以在屏幕上手动关闭表单,所以也许我不用担心

关于forms - 如何关闭(以代码形式)IDE已打开的窗体,而不关闭其关联的.Pas文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com