我正在编写这样的应用程序:
有一个带有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),而不是我刚刚创建的那个,或者应用程序没有在我的新表单上调用方法,而是调用那个尚未创建该表单的地方。
如果我自动创建表单,调用该过程可能会更改应用程序启动时创建的表单上的标签,而不是新表单。
任何帮助都会受到赞赏,因为我一直在谷歌搜索几个小时,对此问题没有任何实际帮助
提前致谢:)
答案 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