Действие в Form1 после закрытия Form2

Я пытаюсь сделать файловый менеджер в Delphi, и мне нужно иметь возможность создавать новые папки.

Итак, я получил свою Основную форму, и когда я нажимаю кнопку Create New Folder, появляется другая форма, где я могу ввести имя новой папки и подтвердить или отменить создание.

Поэтому я создал новую форму для создания папки и сделал ее невидимой.

Я сделал это так - здесь у меня есть процедура в Главной форме

procedure TfolderFrame.CreateFolder;
begin
  newFolderDialog.Visible:=true;
end;

А вот и новая форма папки

unit FolderDialog;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,fileOperations, StdCtrls;

type
  TnewFolderDialog = class(TForm)
    edtName: TEdit;
    lblName: TLabel;
    btnOK: TButton;
    btnCancel: TButton;
    procedure btnOKClick(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    FolderName:String;
    kindOfAction:char;
    hasUpdated:Boolean;
  end;

var
  newFolderDialog: TnewFolderDialog;

implementation

{$R *.dfm}

procedure TnewFolderDialog.btnOKClick(Sender: TObject);
begin
  FolderName:=edtName.Text;
  if CreateDir(FolderName)
  then begin
    ShowMessage('New folder created!');

  end
  else begin
    ShowMessage('Creation failed. Error : '+ IntToStr(GetLastError));
  end;
  newFolderDialog.edtName.Clear;
  newFolderDialog.Close;
  hasUpdated:=True;
end;

procedure TnewFolderDialog.btnCancelClick(Sender: TObject);
begin
  newFolderDialog.edtName.Clear;
  newFolderDialog.Close;
end;

procedure TnewFolderDialog.FormActivate(Sender: TObject);
begin
  hasUpdated:=false;
end;

end.

Проблема в том, что при вызове TfolderFrame.CreateFolder; просто сделайте форму новой папки видимой, и тогда процедура завершится. Но мне нужно сделать некоторые другие вещи после того, как папка будет создана, что-то вроде Refresh или что-то в этом роде.

Я пытался сделать это так:

 procedure TfolderFrame.CreateFolder;
    begin
      newFolderDialog.Visible:=true;
     while not (newFolderDialog.hasUpdated) do begin
       if(newFolderDialog.hasUpdated) then
       RefreshAllStuff;
     end;
    end;

Но программа просто застряла из-за этого.

Как я мог вызвать процедуру Refresh в Form1 только после подтверждения создания папки в Form2?


person DanilGholtsman    schedule 29.09.2013    source источник


Ответы (1)


Измените свой код, чтобы использовать вместо него TForm.ShowModal(), например:

procedure TfolderFrame.CreateFolder;
begin
  if newFolderDialog.ShowModal = mrOk then
    RefreshAllStuff;
end;

procedure TnewFolderDialog.btnOKClick(Sender: TObject);
begin
  FolderName := edtName.Text;
  if CreateDir(FolderName) then
  begin
    ShowMessage('New folder created!');
    ModalResult := mrOk;
  end
  else
    ShowMessage('Creation failed. Error : '+ IntToStr(GetLastError));
end;

procedure TnewFolderDialog.btnCancelClick(Sender: TObject);
begin
  ModalResult =: mrCancel;
end;

procedure TnewFolderDialog.FormShow(Sender: TObject);
begin
  edtName.Clear;
end;
person Remy Lebeau    schedule 29.09.2013
comment
Спасибо! Это сработало! Но почему с такой вещью, как ShowModal(), это так работает? Я имею в виду, если бы были другие условия, процедура была бы похожа на проверку if, а затем заканчивалась, не так ли? И еще один момент, когда delphi 7 не обнаружил метод FormShow, но я использовал Activate - person DanilGholtsman; 29.09.2013
comment
ShowModal() заставляет вызывающего абонента ждать закрытия модальной формы. Установка ModalResult приводит к закрытию модальной формы. FormShow — это обработчик события OnShow формы. Вы должны использовать это событие вместо события OnActivate. Когда форма отображается, OnShow срабатывает только один раз, но OnActivate может срабатывать несколько раз, всякий раз, когда форма теряет, а затем восстанавливает фокус ввода. - person Remy Lebeau; 30.09.2013
comment
О, интересно! Спасибо еще раз! Кстати, я использую метод OnShow(), поэтому использую его сейчас. - person DanilGholtsman; 30.09.2013