«форма уже существует» после закрытия формы и открытия другого экземпляра. Delphi - PullRequest
1 голос
/ 07 июля 2010

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

Если это поможет, я все еще использую Delphi 6.Есть какая-то известная причина, почему это происходит, или что я могу сделать, чтобы предотвратить это?

Ответы [ 3 ]

4 голосов
/ 07 июля 2010

Вы уверены, что форма не скрыта, когда она закрыта?

Это значение по умолчанию для форм MDI, но я видел, что другие люди делают то же самое (чтобы ускорить повторное отображение формы).

Редактировать (спасибо Cosmin Prund за комментарий!):

Подцепите событие OnClose вашей формы и посмотрите, чтозначение параметра CloseActionЕсли это caHide, то форма скрыта.

Временный хак может назначить caFree для CloseAction, но лучшим решением будет наблюдение за стеком в вашем событии OnCloseобработчик, чтобы увидеть, как вы там оказались, и то, что заставляет CloseAction быть в первую очередь caHide.

Примечание: в этих ситуациях вы часто хотите увидеть, что делает VCL.Поэтому разумно включить debug DCUs для вашего проекта;см. статью блога как это сделать (найдите debug DCUs в ссылке).

- jeroen

0 голосов
/ 26 апреля 2012
 function ShowOnce( AFormClass:TFormClass;AShowing:Boolean=True):TForm;
 var 
   i : integer;
 begin
   Result := nil;

   for i := 0 to Screen.FormCount -1 do
     if Screen.Forms[i] is AFormClass then Result := Screen.Forms[i] as TForm;


   if not assigned(Result) then
     Result := AFormClass.Create(Application.MainForm); // Application or a parameter
   if Showing then
      Result.Show;
 end;

образец 1:

ShowOnce(TForm3); 

образец 2:

Form3:=ShowOnce(TForm3,False) as TForm3;
Form3.SomeProperty:=32;
Form3.Show;
0 голосов
/ 07 июля 2010

Вы не предоставили код, но, похоже, вы даете обоим экземплярам формы одно и то же имя компонента, а владелец обеих форм совпадает (вероятно, объект Application).

У вас не может быть компонентов с таким же именем, принадлежащих другому компоненту. Вы должны либо присвоить разные имена каждому экземпляру формы, либо просто не указывать какое-либо значение для свойства Name, и позволить RTL выбрать уникальное имя компонента для вновь создаваемых экземпляров.

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

...