1 (edited by mikhail_a 2021-02-07 12:32:25)

Topic: Как открывать немодальную форму с любой другой формы?

Есть главная форма MainForm.
На ней кнопка, которая по клику открывает немодально HistoryForm (HistoryForm.Show).
В результате можно работать одновременно на обеих формах.
На главной форме также есть таблица, с которой модально открывается форма редактирования проекта ProjectForm.
На форме проекта тоже есть кнопка, которая открывает немодально HistoryForm (HistoryForm.Show).
Если немодальную форму HistoryForm, открытую  с главной формы, не закрыть вручную перед открытием проекта, то с формы проекта к ней нет доступа, т.к. ее родительская форма не форма проекта, а главная.
Можно ли как-то организовать  программно изменение родительской формы у HistoryForm.?
Т.е. надо иметь возможность немодально открывать форму HistoryForm с любой другой формы, не заботясь об ее ручном закрытии если она перед этим была вызвана с другой формы.

Re: Как открывать немодальную форму с любой другой формы?

Что за "родительская форма"? ))))


Речь идёт о стеке модальных форм, который определяется порядком открытия форм. Если вы открыли HistoryForm до открытия модального окна, то она будет недоступной. Ручное закрытие HistoryForm можно заменить автоматическим переоткрытием данной формы, которое можете добавить в обработчик события onShow:

procedure ProjectForm_onShow(Sender:TObject);
begin
  if HistoryForm.Visible then
  begin
     HistoryForm.Close;
     HistoryForm.Open;
  end;
end;
Визуальное программирование: блог и телеграм-канал.

Re: Как открывать немодальную форму с любой другой формы?

Нет такого оператора "open".
Если его заменить на Show, то так тоже не работает.
Немодальная форма  доступна только с того окна, с которого открылась первой.

Re: Как открывать немодальную форму с любой другой формы?

mikhail_a wrote:

На главной форме также есть таблица, с которой модально открывается форма редактирования проекта ProjectForm.

так откройте ее не модально...

Re: Как открывать немодальную форму с любой другой формы?

mikhail_a wrote:

Нет такого оператора "open".
Если его заменить на Show, то так тоже не работает.
Немодальная форма  доступна только с того окна, с которого открылась первой.

Вы правы, я ошибся. Нужно добавить таймер, который будет запускаться перед открытием модальной формы:

procedure ReopenHistory (Sender: TObject; );
begin
  HistoryForm.Show;
  TTimer(Sender).Free;
end;

procedure frmMain_Button2_OnClick (Sender: TObject; var Cancel: boolean);
// открытие модальной формы
var
  Timer:TTimer;
begin
  if HistoryForm.Visible then
  begin
    HistoryForm.Close;
    Timer := TTimer.Create(frmEdit);
    Timer.Interval := 1;
    Timer.OnTimer := @ReopenHistory;
    Timer.Enabled := True;
  end;
  ProjectForm.ShowModal; 
end;
Визуальное программирование: блог и телеграм-канал.