-1

子供が複数回作成するのを防ぐ方法 (例: ログインフォーム)。ログインフォームが開かれる前に子をループせずに解決策があり、別のインスタンスが作成されているかどうかを確認してください。

4

1 に答える 1

1

デフォルトでは、各フォームにはグローバル ポインターが宣言されています。フォームを自動作成しない場合でも、そのポインターを利用できます。特定のフォームについて、起動時にそのグローバル ポインターを初期化し、そのフォームの新しいインスタンスを作成する前nilにポインターをチェックしnil、フォームが閉じられnilたときにフォームを破棄し、フォームが破棄されたときにそのグローバル ポインターをリセットします。例えば:

unit LoginForm;

interface

...

type
  TLoginForm = class(TForm)
    ...
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    ...
  end;

var
  LoginForm: TLoginForm = nil; // <-- here

implementation

...

procedure TLoginForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TLoginForm.FormDestroy(Sender: TObject);
begin
  LoginForm := nil;
end;

...

end.

procedure TMainForm.SomeProcedure;
begin
  ...
  if not Assigned(LoginForm) then
    LoginForm := TLoginForm.Create(Self);
  LoginForm.Show;
  ...
end;
于 2013-10-24T19:23:21.673 に答える