Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Динамическое создание формы в DLL

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Моторокер



Joined: 06 May 2005
Posts: 1482
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Wed Jun 06, 2007 09:55    Post subject: Динамическое создание формы в DLL Reply with quote

Подскажите, как надо правильно создавать модальную форму?
Раньше делал так:
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
View user's profile Send private message
Dec



Joined: 07 Sep 2006
Posts: 466

Post (Separately) Posted: Wed Jun 06, 2007 11:13    Post subject: Reply with quote

Мой код, может быть пригодится
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
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1482
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Fri Jun 08, 2007 08:38    Post subject: Reply with quote

Ответили здесь

Quote:
использовать Release рекомендуется для
корректного освобождения формы в случае, если ее необходимо освободить в одном из ее методов-обработчиков событий...
т.е. в этом случае использование Release вместо Free роли не играет, более того, если в обработчике формы OnClose выставить CloseAction := caFree, то и во Free после ShowModal необходимость так же отпадет.


Quote:
так что лучше имхо оставить первый способ:

_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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