创建表单//选项卡//访问表单上的方法

时间:2016-06-07 14:28:17

标签: forms delphi procedure

我正在编写这样的应用程序:

有一个带有PageControl的主窗体, 在页面控件中我创建了Tabsheets, 在Tabsheets中,放置表格。

这有帮助,因为用户可以多次创建一种类型的表单,例如在多个选项卡中打开的标准pdf查看器,但显示不同的数据,实质​​上是相同的表单。

这非常有用,非常实用!不幸的是,重要的是不起作用,这就是问题所在:

此代码可以正常工作:

'_set'

但是,如果我想改为调用方法,那么标题会改变:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := 'Hello';  
end;

我在Form1.Label1.Caption:= str中遇到访问冲突;在程序中

以下是我创建表单的方式:

Procedure changeLabel(str : String);
Begin
  Form1.Label1.Caption := str;
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  changeLabel('Hello');
end;

我按照每个人在这里说的做了一切:another stackoverflow question

我的问题,如何将新创建的表单固定到Tabsheet,访问自己的程序而不抛出异常?另一件可能很重要的部分:当我有delphi自动创建表单时,没有访问冲突但该方法对表单没有任何作用,所以我认为该过程可能正在改变错误形式的东西,一个尚未创建的东西(它给了AV),而不是我刚刚创建的那个,或者应用程序没有在我的新表单上调用方法,而是调用那个尚未创建该表单的地方。

如果我自动创建表单,调用该过程可能会更改应用程序启动时创建的表单上的标签,而不是新表单。

任何帮助都会受到赞赏,因为我一直在谷歌搜索几个小时,对此问题没有任何实际帮助

提前致谢:)

1 个答案:

答案 0 :(得分:1)

如果您计划创建TForm1类的多个实例,则不自动创建Form1是正确的。实际上,您应该完全删除Form1: TForm1声明以降低出错的风险。 您可能希望保留对f.ex创建的表单的引用。在TList中,可能由TfrmPage实例托管,具体取决于TfrmPage。 (见下文关于AV的讨论)

访问冲突

TForm1中创建TfrmPage.CDMAClick()的实例时,您已将创建的表单的引用分配给本地变量frmTest,然后在标签页中显示它。您可以点击Button1并更改Label1的标题。但是,当您调用ChangeLabel程序时,请说明

  Form1.Label1.Caption := str;

但从未分配Form1变量,因此nil并触发AV。现在,由于您已将表单引用分配给frmTest中的本地TfrmPage.CDMAClick()变量,因此您不再对该表单有任何引用,并且无法访问它(实际上,因为您将其作为标签页,您可以在标签页控件中搜索它。这就是为什么我建议保留对您在列表中创建的表单的引用。然后,您可以在需要时通过该列表访问表单。

  

我的问题,如何将新创建的表单固定到Tabsheet,   访问自己的程序而不抛出异常?

您始终可以从对象本身访问对象方法,字段和属性,而无需使用引用变量。实际上,您永远不应该在对象中使用对象引用变量:

  Label1.Caption := 'Whatever'; // correct from within the form

有时可能需要在对象中使用引用,为此目的,您可以使用self f.ex。:

  self.Label1.Caption := 'Whatever'; // self can be used if needed

从外部方法/过程/函数中,您需要使用对象的引用

  Form1.Label1.Caption := 'Whatever'; // assuming Form1 has been assigned