Delphi 如何创建表单的过程?

Delphi 如何创建表单的过程?,delphi,delphi-xe,Delphi,Delphi Xe,我有以下程序: 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

我有以下程序:

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;

原始代码将类TForm2传递给接收表单实例的过程。事实上,这个实例甚至没有初始化,但这实际上不是您的问题

您需要做的是在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;
还有几点:

设置焦点的目的是什么?我不知道一张表格能保持焦点。 如果您不打算在构建表单后重新设置该表单的父级,那么您最好取消Owner参数,让父级拥有该表单。
原始代码将类TForm2传递给接收表单实例的过程。事实上,这个实例甚至没有初始化,但这实际上不是您的问题

您需要做的是在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;
还有几点:

设置焦点的目的是什么?我不知道一张表格能保持焦点。 如果您不打算在构建表单后重新设置该表单的父级,那么您最好取消Owner参数,让父级拥有该表单。
更好的方法是在Form2中声明一个类过程,然后在Form1上调用该过程。Ej

TForm2
    ...
    public 
      class procedure ShowForm;
    end;

class procedure TForm2.ShowForm;
begin
  with TForm2.Create(Application) do begin
    ShowModal;
    Free;
  end;
end;
在表单1中,单击按钮。。。。你可以写:

TForm2.ShowForm;

更好的方法是在Form2中声明一个类过程,然后在Form1上调用该过程。Ej

TForm2
    ...
    public 
      class procedure ShowForm;
    end;

class procedure TForm2.ShowForm;
begin
  with TForm2.Create(Application) do begin
    ShowModal;
    Free;
  end;
end;
在表单1中,单击按钮。。。。你可以写:

TForm2.ShowForm;

如果沉默的选民能够解释上述答案的错误,那将是一件有趣的事情。赫弗南:1-a.setfocus并不重要。谢谢:如果沉默的选民能够解释上述答案的错误,那将是一件有趣的事情。赫弗南:1-a.setfocus并不重要。谢谢:为什么需要MakeAForm程序?为什么它是TForm1类的一部分?你想让我们猜测错误消息,对吗?我的猜测:未声明的标识符:A或者错误消息是标识符已重新声明?@Cosmin如果您查看代码,它将变得很明显。当OP声明一个aForm类型的变量,但aForm是一个实例而不是一个类型时,就会发生错误。@David,这不是我想说的重点。这是一个程序员的网站。我希望一个用户拨打我们的帮助热线说,但我收到了一个错误,但我希望程序员理解错误消息的重要性。提示:如果您在Delphi2010中尝试用户的确切代码,在标记行,您会得到错误消息E2007常量或预期的类型标识符。如果您突出显示消息列表中的错误消息并点击F1,您将获得一个实际有帮助的帮助页面,并给出一个类似错误的好例子。为什么需要MakeAForm过程?为什么它是TForm1类的一部分?你想让我们猜测错误消息,对吗?我的猜测:未声明的标识符:A或者错误消息是标识符已重新声明?@Cosmin如果您查看代码,它将变得很明显。当OP声明一个aForm类型的变量,但aForm是一个实例而不是一个类型时,就会发生错误。@David,这不是我想说的重点。这是一个程序员的网站。我希望一个用户拨打我们的帮助热线说,但我收到了一个错误,但我希望程序员理解错误消息的重要性。提示:如果您在Delphi2010中尝试用户的确切代码,在标记行,您会得到错误消息E2007常量或预期的类型标识符。如果您突出显示消息列表中的错误消息并点击F1,您将获得一个实际有帮助的帮助页面,并给出一个类似错误的好例子。这显然不是OP想要的,即传递类引用。它也不做任何育儿的事情,也不做OP想要做的事情,那就是传递一个类引用。它也不做任何育儿工作。