繁体   English   中英

Form2尝试在delphi中编辑form1时发生访问冲突

[英]access violation When Form2 trying to edit form1 In delphi

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

form2.Edit1.text=form1.edit1.text

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

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

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中声明Form1。 如果您在Unit2中声明Form1,并且未为其分配值,则它将是一个空指针,访问时将给出访问冲突。 如果您已释放或未创建Form1,它也会产生访问冲突。

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

您可以并且必须避免在使用条款中使用循环引用。 如有可能,请在“界面”部分中使用它们。 当然您可以引用两个以上的单位...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM