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
|