Delphi: позиционирование формы в dll - PullRequest
3 голосов
/ 20 октября 2011

Я создаю форму в 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;

Форма отображается хорошо и проблем нет.Теперь единственное, что я хотел бы сделать, это вести себя как poMainFormCenter (я хочу, чтобы он всегда отображался поверх главной формы (формы, которая вызывает dll).

Я пытался использовать форму:= TfrmAbout.Create (Application.MainForm) и т. Д., Но не повезло.

Какие-нибудь хитрости, которые могли бы помочь здесь?

Ответы [ 3 ]

7 голосов
/ 20 октября 2011

Механизм 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;

Кстати, передаваемая вами ручка - HWND, а не THandle. Вы должны изменить свой код соответственно. Это не изменит поведение, но это логично правильно.

2 голосов
/ 20 октября 2011

Поскольку вы не используете pacakges, ваш EXE и DLL имеют отдельный экземпляр TApplication. TApplication.MainForm в вашем EXE не отображается в вашей DLL. Изменение TApplication.Handle не вносит изменения в MainForm. Найдите другие способы правильно расположить форму, но еще лучше: используйте пакеты, если у вас не возникнет проблем, вы столкнетесь с большим количеством проблем.

1 голос
/ 20 октября 2011

Вы пробовали установить form.ParentWindow для дескриптора родительского окна? Вы должны передать его как параметр в ShowAbout, или вы могли бы выкопать его из объекта Application (что-то вроде Application.ActiveForm), но я не уверен, что это сработает.

Вызов TfrmAbout.Create(Application.MainForm) просто указывает, что Application.MainForm отвечает за уничтожение формы, он не должен иметь ничего общего с иерархией окон, также я не уверен, что вам следует использовать автоматическое уничтожение, если вы создаете форму в отдельном длл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...