如何获取Delphi IDE的主窗体?

3
我正在为Delphi编写属性编辑器,希望它能在多屏幕支持下显示在正确的屏幕上。为了定位它,我想要一个对Delphi IDE的“主”窗体的引用。
我尝试使用Application的MainForm属性和Application对象本身,但似乎都不起作用。我认为这是因为MainForm实际上是Nathanial Woolls在这篇文章中提到的隐藏的TApplication实例(搜索“application form”)。

http://www.installationexcellence.com/articles/VistaWithDelphi/Original/Index.html

有人知道如何获取IDE的可见主窗体的句柄吗?我试图避免像迭代所有窗体并在标题中搜索“CodeGear RAD Studio”这样的低劣方法。


我期望属性编辑器会出现在与对象检视器或窗体设计器相同的屏幕上,取决于我用哪个来调用属性编辑器。谁关心应用程序表单呢? - Rob Kennedy
我同意,但我不知道如何获取对象检查器窗口的句柄,所以我从一个更容易的任务开始,这对大多数用户来说可能是正确的。我也考虑过只获取鼠标位置,然后监视它当前所在的位置,并使用它。 - Jeremy Mullin
@Jeremy Mullin:你能分享一下你的发现吗? - menjaraz
我的发现在被接受的答案评论中。 - Jeremy Mullin
2个回答

4

集成开发环境(IDE)的主要窗体是Application.MainForm。我的快速测试设计包:

procedure DoStuff(Form: TCustomForm);
var
  S: string;
begin
  S := Form.Caption;
  Form.Caption := S + ' - this one';
  try
    ShowMessage(Format('%s [%s] on monitor %d', [Form.Name, Form.ClassName, Form.Monitor.MonitorNum]));
  finally
    Form.Caption := S;
  end;
end;

initialization
  DoStuff(Application.MainForm);

在我的情况下,它显示为“AppBuilder [TAppBuilder] on monitor 0”,我可以在主窗体的标题中看到“ - this one”后缀。在你的情况下似乎不起作用?

我将其分配为表单的所有者,然后尝试使用Form.Position将表单正确定位到poOwnerCenter。当我上班时,我会验证我是否获取了正确的表单,并像您一样检查Form.Monitor属性。谢谢! - Jeremy Mullin
我已经解决了,这是一个作用域问题。我在我的设计时BPL中没有引用Application.MainForm,而是在它加载的DLL中引用。在那个范围内,它返回nil。我无法在DLL中创建的窗体上使用TForm.Position属性(我认为是由于相同的作用域原因),但我能够使用在BPL中检索到的Application.MainForm.Monitor位置和尺寸手动定位窗体。感谢您给予正确方向的推动! - Jeremy Mullin

2

据我所知,主要窗体被称为TAppBuilder,因此像FindWindow('TAppBuilder',nil)这样的语句可能是您的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接