【问题标题】:How i can to make a procedure for create a form?我怎样才能制定创建表格的程序?
【发布时间】:2011-01-23 10:03:38
【问题描述】:

我有这个程序:

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;

【问题讨论】:

  • 为什么需要 MakeAForm 程序?为什么它是 TForm1 类的一部分?
  • 您希望我们猜测错误信息,对吧?我的猜测:未声明的标识符:aForm
  • 或者错误信息是“标识符重新声明”?
  • @Cosmin 如果你看一下代码,它会变得很明显。当 OP 声明类型为 aForm 的变量但 aForm 是实例而不是类型时会发生错误。
  • @David,这不是我想要表达的意思。这是一个程序员的网站。我希望用户拨打我们的帮助热线说but i receive a error,但我希望程序员了解错误消息的重要性。提示:如果您在 Delphi 2010 中尝试用户的确切代码,在标记的行,您会收到错误消息 E2007 Constant or type identifier expected。如果您在“消息”列表中突出显示错误消息并点击“F1”,您将获得一个实际有帮助的帮助页面,并提供了一个类似错误的很好示例。

标签: delphi delphi-xe


【解决方案1】:

您的原始代码将一个类 (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 参数并让父级拥有该表单。

【讨论】:

  • 如果沉默的反对者可以解释上述答案有什么问题会很有趣
  • heffernan:1-“a.setfocus”并不重要。谢谢你:)
【解决方案2】:

更好的方法是在 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;

【讨论】:

  • 这并没有做 OP 显然想要的,即传递一个类引用。它也不做任何育儿工作。
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 2017-08-11
  • 2019-04-09
  • 2018-07-17
  • 2018-01-14
  • 2011-04-27
  • 2017-07-06
  • 2022-10-24
相关资源
最近更新 更多