2011-01-23 43 views
1

我有這樣的過程:我怎樣才能創建一個窗體的程序?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    a:TForm2; 
begin 
    a := TForm2.Create(Self); 
    a.Parent := ScrollBox1; 
    a.Align := alClient; 
    a.Show; 
    a.SetFocus; 
end; 

而且我更改上面的代碼,但我收到一個錯誤,爲什麼呢? 我必須將此代碼更改爲?

procedure TForm1.MakeAform(aForm:Tform;Cmp:TComponent;Parent1:TWinControl;Align1:TAlign); 
var 
    a:aForm; // Error Here 
begin 
    a := aForm.Create(Cmp); 
    a.Parent := Parent1; 
    a.Align := Align1; 
    a.Show; 
    a.SetFocus; 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    MakeAform(Tform2,Self,Panel1,alClient); 
end; 
+0

爲什麼需要一個MakeAForm程序?爲什麼它是TForm1類的一部分? – johnny 2011-01-23 15:33:51

+1

您希望我們**猜錯**錯誤信息,對不對?我的猜測:**未聲明的標識符:aForm ** – 2011-01-23 16:11:51

+0

或者錯誤消息是「標識符重新聲明」? – 2011-01-23 16:12:45

回答

5

您的原始代碼將一個類(TForm2)傳遞給接收實例(aForm)的過程。事實上,這個例子甚至沒有初始化,但實際上這不是你的問題。

您需要做的是在MakeAform中接收一個類而不是實例。

你的代碼應該是:

//note, in Forms.pas the type TFormClass is defined as: 
// TFormClass = class of TForm; 
// 
//A variable of TFormClass holds a class (rather than an instance) 
//and that class must be derived from TForm. 

procedure TForm1.MakeAform(
    FormClass: TFormClass; 
    Owner: TComponent; 
    Parent: TWinControl; 
    Align: TAlign 
); 
var 
    a: TForm; 
begin 
    a := FormClass.Create(Owner); 
    a.Parent := Parent; 
    a.Align := Align; 
    a.Show; 
    a.SetFocus; 
end; 

一對夫婦更點:

  1. 什麼是a.SetFocus的目的是什麼?我不知道一個表單可能成爲焦點。
  2. 如果你不打算在構造它之後重新表達這個表單,那麼你可以去掉Owner參數並讓父表單擁有這個表單。
1

這樣做的一個更好的方法是在Form2中聲明一個類過程,然後在Form1上調用該程序。 Ej

TForm2 
    ... 
    public 
     class procedure ShowForm; 
    end; 

class procedure TForm2.ShowForm; 
begin 
    with TForm2.Create(Application) do begin 
    ShowModal; 
    Free; 
    end; 
end; 

而在Form1.ButtonClick(...)中。你可以這樣寫:

TForm2.ShowForm;