1

プロジェクトに 2 つのフォーム (Form1 と Form2) があり、Form1 は自動作成フォームですが、Form2 は使用可能なフォームです。Form2 を作成して Form1 をアンロードするにはどうすればよいですか?

このコードで「アクセス検証」エラーを受け取りました。

Form1 コードは次のとおりです。

1.  uses Unit2;
//*********
2.  procedure TForm1.FormCreate(Sender: TObject);
3.  var a:TForm2;
4.  begin
5.      a := TForm2.Create(self);
6.      a.Show;
7.      self.free;  // Or self.destory;
8.  end;

ありがとう。


その「Serg」コードを次のように変更しました。

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2);
  Release;
end;

end.

///

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Form1:= TForm1.Create(Application);
  Application.Run;
end.

しかし、このプロジェクトは自動的に開始して終了します。なぜですか? Form1 を表示したいのですが、Button1 をクリックすると、Form2 と free(Release) Form1 が表示されます。どうすればこれにできますか?

4

5 に答える 5

13

フォームを破棄する場合は、Release を使用することをお勧めします。

Release は Free とほぼ同じですが、保留中のメッセージを待機してクラッシュを回避します。

Destroy は絶対に使用しないでください。Free/Release はデストラクタを呼び出します。

Self は現在のオブジェクトです (コード Form1 では、self.Free は現在のフォームを強制終了します。その結果、アクセス違反が発生します。Form1 は自動作成され、自動破棄されるため、自分で破棄しないでください。欲しくないなら隠す。

また、後で処理する場合は、新しく作成したフォームへの参照を保持する必要があります。

変更されたコードは次のようになります。

uses Unit2;

TForm1 = class (TForm)
private
  FChild : TForm2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FChild := TForm2.Create(nil);
  Hide; // Hides form 1
  FChild.Show;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  FChild.Release;
end;

しかし、最初のフォームのフォーム作成で別のフォームを作成したいのはなぜですか。最初のフォームを完全に削除して、2 番目のフォーム (自動作成) のみを使用しないのはなぜですか?

于 2011-01-07T07:36:21.413 に答える
2

あなたは何か奇妙なことをしようとしています。

アプリケーションを閉じずにメイン フォームを解放することはできないため、Form1 は自動作成フォームではなく、Form1 と Form2 の両方を手動で作成する必要があります。

まず、プロジェクト ソースを次のように編集して、Form1 を手動で作成する必要があります。

program Project9;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Form1:= TForm1.Create(Application);
  Application.Run;
end.

Form1.OnCreate は次のように記述します。

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2);
  Release;
end;

これにより、Form2 がアプリケーションのメイン フォームになります。すでに回答されているように、 Release メソッドを使用してフォームを解放する必要があります。

于 2011-01-07T08:03:45.760 に答える
0

Form1 が「autocreate」の場合、それはアプリケーション オブジェクトによって所有されているため、コード内で解放しないでください。Form1 が Form2 を所有している場合、アプリケーションは両方をクリーンアップします。

私はこのようにしますが、それがあなたの要件を満たしているかどうかはわかりません:

procedure TForm1.FormCreate(Sender: TObject);
var a:TForm2;
begin
  a := TForm2.Create(nil);
  try
    a.Show;
 finally
   freeandNil(a);
 end; 
end;
于 2011-04-23T19:32:15.347 に答える
0

Form1 が行う必要があるのは何かを初期化するだけで、表示されない場合は、代わりにデータモジュールを使用することを検討してください。これらは表示できませんが、自動作成することはできます。

于 2016-09-01T10:17:57.157 に答える