E2197常量对象不能作为var参数传递

时间:2019-03-10 09:51:33

标签: delphi

我有2种形式连接Q1_u和clsPlayer,但是一旦我将两者连接起来,就会抛出错误2197

program Q1_p;
uses


 Forms,
  Q1_u in 'Q1_u.pas' {Form1},
clsPlayer in 'clsPlayer.pas';

{$R *.res}

begin

Application.Initialize;
 Application.CreateForm(Q1_u.TForm1, clsPlayer.TclsPlayer);
 Application.Run;
End.

1 个答案:

答案 0 :(得分:1)

问题在于CreateForm的第二个参数应该是一个可以容纳TForm后代对象的变量,而不是TForm类(如您所提供的)。每次对CreateForm的调用都会创建一个应用程序的自动创建表单:第一个参数指定表单类,第二个参数指定将保存对创建实例的引用的变量。因此,如果您有两个自动生成的表单,则需要两个CreateForm调用。

不过,您不应该手动编辑dpr文件,至少在这种情况下,不要这样做。 IDE为您执行此操作。

示例:

  1. 创建一个新的VCL应用程序。将主窗体的名称设置为MyMainForm,将其颜色设置为clSkyBlue
  2. 选择文件/新建/ VCL表单。将新表单的名称设置为MySecondForm,并将其颜色设置为clMoneyGreen。 IDE将使新表格自动生成。因此,它将在您的dpr文件中添加新行。
  3. 在第一种形式中,选择文件/使用单位(Alt + F11)。用新表格(可能是Unit2.pas)选择单位。
  4. TButton拖放到您的主窗体上,将其Caption设置为Show second form并在其OnClick处理程序中写入以下内容:

    procedure TMyMainForm.Button1Click(Sender: TObject);
    begin
      MySecondForm.Show;
    end;
    
  5. 如果查看项目源代码(dpr文件),您会发现IDE确实为您编写了代码:

    program Project1;
    
    uses
      Vcl.Forms,
      Unit1 in 'Unit1.pas' {MyMainForm},
      Unit2 in 'Unit2.pas' {MySecondForm};
    
    {$R *.res}
    
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TMyMainForm, MyMainForm);
      Application.CreateForm(TMySecondForm, MySecondForm);
      Application.Run;
    end.
    

Screenshot of the two forms

但是,请注意,在很多(大多数情况下)情况下,您根本不需要自动生成的表单,但这是另一回事了。