Вызов 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.