Вызов Show() встроенной формы должен показать родительскую форму

Я использую встроенные формы в своем приложении, и я пытался что-то вроде этого:

Во время разработки форма является нормальной формой, которая ничего не знает о встраивании / закреплении. С помощью ButtonClick я могу сделать форму видимой, вызвав метод Show() формы. Во время выполнения может случиться так, что форма будет пристыкована к другой форме и станет встроенной формой. Когда я нажимаю кнопку для повторного отображения формы (которая теперь встроена), ничего не происходит, потому что я должен вызвать Show() для формы, которая теперь содержит встроенную форму.

Я ищу метод для принудительного отображения родительской формы при вызове метода Show() встроенной формы. Я мог бы справиться с этим, проверив наличие родительской формы перед вызовом Show(), но я не хочу включать эту конкретную обработку.

Я бы предпочел сделать эту обработку в родительской форме, которая получает уведомление, когда форма пристыкована.

Метод Show() только устанавливает для свойства Visible значение true (Справка RAD Studio), поэтому я не думаю, что сообщение отправляется...?

Вы знаете способ реализовать что-то подобное?

редактировать

Я хочу поместить некоторую информацию о моем приложении, потому что я предполагаю, что это скорее проблема проектирования, чем проблема программирования.

Приложение использует несколько плагинов для адаптации к подключенному оборудованию. Exe предоставляет среду drag&dock и содержит базовый класс для закрепляемых форм. Плагины не имеют никаких знаний о реализации стыковки. При создании закрепляемой формы и встраивании формы из плагина форма плагина становится закрепляемой. Вот почему я хочу, чтобы родительская форма отображалась, когда где-то вызывается метод Show() встроенной формы.

2 ответа

Решение

Вы можете создать общего предка для ваших встроенных форм или даже для всех форм в приложении, а затем извлечь из него ваши формы:

type
  TEmbeddedForm = class(TForm)
  public
    procedure Show;
  end;

procedure TEmbeddedForm.Show;
var
  ParentForm: TCustomForm;
begin
  inherited Show;
  ParentForm := GetParentForm(Self);
  if ParentForm <> Self then
  begin
    // Form is Embedded
    Update;        
    ParentForm.Show;
    // You might alternatively consider to send custom 
    // message to the Parent form, and let it decide what to do e.g.
    // SendMessage(ParentForm.Handle, CM_MY_EMBEDED_FORM_SHOW, 0, 0);
  end;
end;

Затем, когда вы звоните:

procedure TForm1.Button1Click(Sender: TObject);
begin
  // MyEmbeddedForm is derived from TEmbeddedForm 
  MyEmbeddedForm.Align := alClient;
  MyEmbeddedForm.BorderStyle := bsNone;

  MyEmbeddedForm.Parent := Form3.Panel1;
  MyEmbeddedForm.Show;
end;

Form3 показывает.


Другой вариант (который я подтвердил только в Spy++) - перехват WM_CHILDACTIVATE или же WM_WINDOWPOSCHANGING в TEmbeddedForm, оно отправляется ему при вызове дочерней формы TEmbeddedForm.Showи действовать соответственно, т.е. GetParentForm(Self).Show,

Использование SetFocus вместо Show on the embedded form.

This will enforce showing of the parent form too.

Другие вопросы по тегам