关于表单:访问冲突当Form2尝试在delphi中编辑form1时

access violation When Form2 trying to edit form1 In delphi

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

1
form2.Edit1.text=form1.edit1.text

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

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

1
uses Unit1; var Form1:Tform1

执行

程序可以正常编译,没有错误,但是当尝试从form1实际访问edit1时,它崩溃并出现错误。

编辑:

当我将unit1添加到" uses"列表中而不是在实现中但在接口

下时,它似乎正在工作

这意味着unit2可以编辑unit1,但是我现在不能将unit2添加到unit1的接口使用中
循环单位参考

简而言之意味着

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

那么有没有一种方法可以在不创建其他两个单元引用的第三帧的情况下实现呢?


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

这说明了为什么您遇到访问冲突。如何解决?只需从Unit2中删除Form1变量。使用"在文件中查找"功能来确保整个项目中只有一个Form1Form2等声明。

正确执行此操作后,从实现部分开始,使每个单元都使用另一个单元将不会有任何问题,而不会出现循环引用问题。

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


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


对我来说正确的答案是将unit1添加到unit2的接口中,并将unit2添加到unit1的实现中

那是因为unit1是主窗体,而unit2由unit1打开。
因此将unit1添加到unit2的实现中将不起作用。
如果两个单元一起打开,那会起作用。


您的项目进行编译的事实意味着,已声明变量" Form2 ",从而使编译器\\"已知"。它提供了acces违规这一事实意味着,没有有效的对象分配给该变量。有几种可能性。首先,必须通过IDE(在项目的选项中自动创建表单)或您的代码来创建Form2。其次,必须没有第二个名为" Form2"的变量,该变量将"隐藏"带有Form2对象的变量。

您可以而且必须避免在使用条款中使用循环引用。如有可能,请在"接口"部分中使用它们。当然,您可以引用两个以上的单元...


将正在执行的Unit1,在Unit2中使用。
不要在Unit2中声明Form1。如果您在Unit2中声明Form1,并且未为其分配值,则它将是一个空指针,访问时将给出访问冲突。
如果您已释放或未创建Form1,它也会产生访问冲突。