Delphi:将表单放在dll中

Lob*_*uno 3 forms delphi dll

我在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); 等但没有运气.

任何有助于此的技巧?

Dav*_*nan 7

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.您应该相应地更改代码.它不会改变行为,但这样做在逻辑上是正确的.