2011-01-23 113 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; 
相关问题