| 
 
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Моторокер 
 
  
 Joined: 06 May 2005
 Posts: 1517
 Location: г. Пермь (читается Перьмь)
 
 | 
			
				|  (Separately) Posted: Wed Jun 06, 2007 09:55    Post subject: Динамическое создание формы в DLL |   |  
				| 
 |  
				| Подскажите, как надо правильно создавать модальную форму? Раньше делал так:
 
  	  | Code: |  	  | var
fmSetup: TfmSetup;
 begin
 fmSetup:= TfmSetup.Create(nil);
 fmSetup.ShowModal;
 fmSetup.Free;
 | 
 Сделал nil, т.к. на Delphi ругалась на незнание Self
 Затем вычитал про необходимость использования Release вместо Free – якобы ждёт, когда все потоки отработают, вся память освободится:
 
  	  | Code: |  	  | var
fmSetup: TfmSetup;
 begin
 fmSetup:= TfmSetup.Create(nil);
 fmSetup.ShowModal;
 fmSetup.Release;
 | 
 в Тотале всё работает, а PlugMan вылетает с ошибкой
 Подключил модуль Forms, добавил Application в Create:
 
  	  | Code: |  	  | var
fmSetup: TfmSetup;
 begin
 fmSetup:= TfmSetup.Create(Application);
 fmSetup.ShowModal;
 fmSetup.Free;
 | 
 Вроде бы работает.
 Так как надо делать правильно?
 _________________
 плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
 ПармаСруб - строительство домов и бань в Перми
 |  |  
		| Back to top |  |  
		|  |  
		| Dec 
 
 
 Joined: 07 Sep 2006
 Posts: 466
 
 
 | 
			
				|  (Separately) Posted: Wed Jun 06, 2007 11:13    Post subject: |   |  
				| 
 |  
				| Мой код, может быть пригодится 
  	  | Code: |  	  | 
type
 TWinArray = array of THandle;
 
 function TdecFSRoot.ExecuteProperties(AMainWin: Cardinal; ARemoteName: PAnsiChar): Integer;
 var
 NotTC: boolean;
 Thr: THandle;
 WinArray: TWinArray;
 
 function DoDisableWindow(Window: HWnd; Data: Longint): Bool; stdcall;
 begin
 if IsWindowVisible(Window) and IsWindowEnabled(Window) then
 begin
 SetLength(WinArray, Length(WinArray) + 1);
 WinArray[Length(WinArray) - 1] := Window;
 EnableWindow(Window, False);
 end;
 Result := True;
 end;
 
 procedure EnableTaskWindows;
 var i: integer;
 begin
 for i := 0 to Length(WinArray) - 1 do
 if IsWindow(WinArray[i]) then EnableWindow(WinArray[i], True);
 SetLength(WinArray, 0);
 end;
 
 procedure DisableTaskWindows(AThread: THandle);
 begin
 try
 EnumThreadWindows(AThread, @DoDisableWindow, 0);
 except
 EnableTaskWindows;
 raise;
 end;
 end;
 
 begin
 if not HaveProperties then
 begin
 Result := FS_EXEC_YOURSELF;
 exit;
 end;
 try
 if decGetClassName(AMainWin) <> 'TTOTAL_CMD' then
 begin
 NotTC := true;
 Thr := GetWindowThreadProcessId(AMainWin);
 SetLength(WinArray, 0);
 DisableTaskWindows(Thr);
 end
 else
 NotTC := false;
 try
 ShowProperties(AMainWin);
 Result := FS_EXEC_OK;
 finally
 if NotTC then
 EnableTaskWindows;
 end;
 except
 Result := FS_EXEC_ERROR;
 end;
 end;
 
 procedure TdecFSClipboardRoot.ShowProperties(AMainWin: Cardinal);
 var AboutForm: TAboutForm2;
 begin
 Application.Handle := AMainWin;
 AboutForm := TAboutForm2.Create(Application);
 try
 AboutForm.ShowModal(IniFile);
 finally
 AboutForm.Free;
 Application.Handle := 0;
 end;
 end;
 
 | 
 |  |  
		| Back to top |  |  
		|  |  
		| Моторокер 
 
  
 Joined: 06 May 2005
 Posts: 1517
 Location: г. Пермь (читается Перьмь)
 
 | 
			
				|  (Separately) Posted: Fri Jun 08, 2007 08:38    Post subject: |   |  
				| 
 |  
				| Ответили здесь 
 
  	  | Quote: |  	  | использовать Release рекомендуется для корректного освобождения формы в случае, если ее необходимо освободить в одном из ее методов-обработчиков событий...
 т.е. в этом случае использование Release вместо Free роли не играет, более того, если в обработчике формы OnClose выставить CloseAction := caFree, то и во Free после ShowModal необходимость так же отпадет.
 | 
 
 
  	  | Quote: |  	  | так что лучше имхо оставить первый способ: | 
 _________________
 плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
 ПармаСруб - строительство домов и бань в Перми
 |  |  
		| Back to top |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |