访问冲突当Form2尝试编辑form1在delphi中

时间:2012-02-07 06:21:59

标签: forms delphi access-violation

例如,当我尝试做这样的事情时

form2.Edit1.text=form1.edit1.text

它给我一个访问冲突错误。

form2可以使用form1变量的方法是添加

uses Unit1; var Form1:Tform1

执行

程序编译没有错误,但是当尝试从form1实际访问edit1时,它会因错误而崩溃。

编辑:

当我将unit1添加到“使用”列表而不是在实现中但在接口

下时,它似乎正在工作

这意味着unit2可以编辑unit1但我现在无法将unit2添加到unit1的接口用途 循环单位参考

简而言之,这意味着

  • unit2可以编辑/查看unit1
  • unit1无法编辑/查看unit2

那么有没有一种方法可以在不创建第二帧的情况下使其成为可能呢?

5 个答案:

答案 0 :(得分:3)

项目中有两个名为Form1的变量。 .dpr文件中的代码会创建TForm1并将引用保存在两个Form1变量的一个中。然后你指的是另一个未分配的Form1

这解释了您获得访问冲突的原因。怎么解决?只需从Form1中删除Unit2变量即可。使用“在文件中查找”功能可确保整个项目中只有Form1Form2等声明。

当你正确地做到这一点时,你可以毫不费力地使用另一个单元,从实现部分开始,没有循环引用问题。

为了更好地学习和理解这一点,我建议您阅读.dpr文件以了解全局变量的初始化方式。我还建议您阅读有关范围解析的Delphi语言指南部分,以了解编译器如何解决在同一位置可见两个相同名称的情况。

答案 1 :(得分:2)

没有必要将form1声明为form2中的变量 - 将会有一个名为'form1'的全局变量。

答案 2 :(得分:0)

将Unit1置于实现之下,在Unit2中使用。 不要在Unit2中声明Form1。如果在Unit2中声明Form1,并且不为其赋值,则它将是一个空指针,在被监视时给出访问冲突。 如果您已释放Form1或未创建它,它也会提供访问冲突。

答案 3 :(得分:0)

事实上,您的项目编译意味着变量“Form2” 已声明,因此对编译器“已知”。它给出访问冲突的事实意味着没有为该变量分配有效对象。有几种可能性。首先,必须通过IDE(在项目选项中自动创建表单)或通过代码创建Form2。其次,不能有一个名为“Form2”的第二个变量,它将使用Form2对象“隐藏”该变量。

您可以并且必须在您的uses-clause中使用循环引用。如果可能,请在“界面”部分中使用它们。当然你可以参考两个以上的单位...

答案 4 :(得分:0)

正确的答案是将unit1添加到unit2的接口并将unit2添加到unit1的实现

这是因为unit1是主窗体,unit2由unit1打开。 所以将unit1添加到unit2的实现是行不通的。 如果两个单元一起打开,它将会起作用。