У меня есть приложение MDI, написанное на Delphi 2007.
Если пользователь выходит из формы внутри нее во время выполнения кода, это вызывает исключение, поскольку код пытается обновить компонент или использовать объект, который был освобожден с помощью формы.
Могу ли я в любом случае сказать, выполняется ли код в событии exit или есть стандартный способ справиться с этой ситуацией?
Обновление с дополнительной информацией
Исключение обычно происходит при следующих обстоятельствах.
Нажата кнопка на дочерней mdi-форме, это активирует функцию в форме, функция перейдет в базу данных и получит данные, затем переформатирует ее и отобразит в визуальном компоненте формы ( можно использовать TListView).
Если выполнение кода занимает много времени (скажем, если нужно обработать много данных), пользователь потеряет интерес и нажмет кнопку закрытия (скорость кода обрабатывается, чтобы попытаться избежать этого). ).
Код внутри функции все еще выполняется, хотя форма, к которой она принадлежит, была освобождена (код находится в закрытом разделе формы), теперь, когда она пытается обновить визуальные компоненты, они больше не существуют (так как они были освобождены с помощью формы), и это исключение.
Код в дочерней форме обычно используется в цикле, когда это происходит, циклически изменяя записи и соответственно обновляя представление списка, циклы содержат код, который выглядит так
inc(i);
if (i mod 25) = 0 then
begin
StatusPnl.Caption := 'Loading ' + intToStr(i) + ', Please wait';
application.ProcessMessages;
end;
Другие образцы кода
событие fromClose выглядит так
//Snip
if (Not (Owner = nil)) then
with (Owner as IMainForm)do
begin
//Snip
DoFormFree(Self,Self.Name);
end
else
//Snip
DoFormFree - это функция в основной родительской форме mdi, которая выглядит так
//Snip
(G_FormList.Objects[x] as TBaseForm).Release;
G_FormList.Objects[i] := nil;
G_FormList.Delete(i);
//Snip
Все формы хранятся в списке, по разным причинам, и все дочерние формы расширяют класс TBaseForm.
В идеале я хотел бы узнать, выполняется ли код в форме, и запретить пользователю закрывать форму, или скрыть ее до тех пор, пока код не будет завершен, поскольку в некоторых случаях он может генерировать отчет и обновлять как Панель состояния, когда происходят исключения, в этом случае отчет будет неполным.
, поскольку все формы являются подклассами TbaseFrom, какой-то глобальный способ сделать это будет идеальным, поэтому я могу добавить код в базовую форму и заставить его работать на всех дочерних формах.