我在dll中创建一个表单.没有包裹.使用导出的过程调用dll中的表单:
procedure ShowAbout(const AppHandle: THandle); stdcall;
var
aHandle: THandle;
form: TfrmAbout; / my form in some other unit in the dll
begin
aHandle:= Application.Handle;
Application.Handle:= AppHandle;
form :=TfrmAbout.Create(Application);
form.ShowModal;
form.Free;
Application.Handle:= aHandle;
end;
Run Code Online (Sandbox Code Playgroud)
表格显示良好,没有问题.现在,我唯一希望它做的是将行为定位为poMainFormCenter(我希望它始终显示在主窗体上(调用dll的窗体).
我尝试过使用form:= TfrmAbout.Create(Application.MainForm); 等但没有运气.
任何有助于此的技巧?
VCL Position机制依赖于应用程序中的其他表单,所有表单都使用相同版本的VCL运行.这显然不是这种情况,您必须手动定位表单.
通过调用GetWindowRect()传递主窗体句柄找出主窗体的位置.然后你需要找出你的表单需要在那个表单的中心.
procedure PositionForm(Form: TForm; MainWindow: HWND);
var
MainBounds: TRect;
MainWidth, MainHeight: Integer;
begin
if GetWindowRect(MainWindow, MainBounds) then
begin
MainWidth := MainBounds.Right-MainBounds.Left;
MainHeight := MainBounds.Bottom-MainBounds.Top;
Form.Left := MainBounds.Left + (MainWidth - Form.Width) div 2;
Form.Top := MainBounds.Top + (MainHeight - Form.Height) div 2
end;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你传递的手柄是一个HWND而不是一个THandle.您应该相应地更改代码.它不会改变行为,但这样做在逻辑上是正确的.