Итак, вернемся к нашему первому примеру, где мы создали две формы и кнопку для открытия второй формы. Какая здесь еще есть непутёвщина. Смотрите…, пользователь запустил ваше приложение, развернул на весь экран форму, и нажал кнопку(меню) для добавления каких-либо данных – открывается наша вторая форма. Казалось бы опять всё нормально, он введет данные на форме2, нажмет «Ок», форма закроется, … а нет, таких пользователей не бывает. Пока он решался ввести данные, ему пришла почта)), отвлёкся. Затем решился вернуться к нашей программе и доделать начатое, .. но формы уже нет на экране, она запущена но её нет…
Пользователь нажимает второй раз кнопку добавления данных – форма появляется. И … вот тут-то и может скрываться косяк…
Если при вызове формы добавления данных вы используете какую-либо подготовку, типа прибавления счетчика новой записи, или подготовки базы данных и т.д. или того еще хуже – перед открытием формы2 – вы очищаете все введенные данные, чтобы подготовить форму для ввода, так как вы считаете что пользователь просто хочет добавить новые данные.
Конечно найдется много скептиков и ярых сторонников того, что не нужно делать никаких предварительных подготовок перед запуском формы, или проверять открыта ли форма и просто показывать её снова, подходы разные, но самый простой – открывать окно не через .show() а через .showModal();
Замените в нашем примере show(), на showModal() и ваше окно ввода данных никуда больше не будет исчезать, тем более вы можете получить обратную связь при закрытии этого окна, чтобы соответственно правильно отработать ситуацию с закрытием формы2.
procedure TForm1.Button1Click(Sender: TObject);
begin
//Form2.Show;
Form2.ShowModal;
end;
end.
Теперь наша форма никуда не денется. При запуске формы2, наша процедура нажатия кнопки будет дожидаться пока форма отработает.
Способ2. Проблемный, но как закрытие глюков) подойдет.
Идея – при открытии формы2, делать недоступной для работы с ней – форму1, а при закрытии формы2 – возвращать доступность форме1.
Для этого перед запуском формы2 делаем вот так:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Enabled :=false;
Form2.Show;
end;
//…..
end.
И добавляем событие при закрытии формы2, onClose
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Enabled :=true;
end;
//…..
end.