2011-01-07 7 views
1

我在我的項目中有2個窗體(Form1和Form2),Form1是自動創建窗體,但Form2是可用窗體。 我如何創建Form2並卸載Form1?如何從內存銷燬(免費)表單?

我在此代碼中收到「訪問驗證」錯誤。

這裏是Form 1代碼:

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並釋放(釋放)Form1。我怎麼能這樣?

+0

您正在從構造函數調用析構函數。 – 2011-04-23 19:43:40

+0

看看這篇文章關於application.mainform: 2016-09-24 10:39:52

回答

10

當你銷燬一個表單時,最好使用Release。

版本幾乎與免費版本相同,但它等待掛起的消息以避免崩潰。

你不應該使用Destroy。釋放/釋放調用析構函數。

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; 

但是你爲什麼要在第第一種形式的創建。爲什麼不完全刪除第一個表單並僅使用第二個表單(自動創建)?

+0

謝謝你Gamecat。 在我的項目中,我有很多forms.form1是一個窗體,用於在我的應用程序啓動時設置一些配置。我想要顯示form1,並且當用戶設置該配置時,然後卸載form1並顯示form2。你有什麼更好的主意? – User 2011-01-07 08:25:34

+0

當我使用您的修改代碼,Form1可見約1秒,然後隱藏。爲什麼? (我想完全隱形form1) – User 2011-01-07 13:38:09

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; 

,這將使窗體2應用程序的主要形式。正如已經回答你應該使用釋放方法來釋放表單。

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; 
0
begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

...

procedure TForm1.FormClose(Sender: TObject; var CanClose: Boolean); 
begin 
    if MessageDlg ('Are you want to exit?', mtConfirmation, 
     [mbYes, mbNo], 0) = mrNo then 
    CanClose := False; 
end; 

所以,這是所有...

0

如果所有Form1都應該做的是初始化某些內容但未顯示,請考慮使用數據模塊。這些不能顯示,但仍可以自動處理。