【问题标题】:access violation When Form2 trying to edit form1 In delphi当Form2试图在delphi中编辑form1时访问冲突
【发布时间】:2012-02-07 06:21:58
【问题描述】:

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

form2.Edit1.text=form1.edit1.text

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

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

uses Unit1; var Form1:Tform1

到实现

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

编辑:

当我将 unit1 添加到“使用”列表中时,它似乎正在工作,而不是在实现中而是在接口下

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

简而言之就是

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

那么有没有办法在不创建其他两个单元引用的第三帧的情况下使其成为可能?

【问题讨论】:

  • 当我将unit1添加到“使用”列表中时,它似乎正在工作,而不是在实现中,而是在接口下,这意味着unit2可以编辑unit1但我现在不能将unit2添加到unit1接口的使用中简而言之 - unit2 可以编辑/查看 unit1 - unit1 无法编辑/查看 unit2 那么有没有办法让它成为可能?
  • 正如 No'am Newman 指出的那样,确保您没有重新声明 Form1 变量。另外,如果您在自动创建表单列表中同时拥有 Form1 和 Form2,请检查 Project->Options->Forms。

标签: forms delphi access-violation


【解决方案1】:

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

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

当你正确地做到这一点时,你将毫无问题地让每个单元使用另一个单元,从实施部分开始,没有循环引用问题。

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

【讨论】:

  • 同意。就我个人而言,我很少让 .dpr 初始化除应用程序主表单之外的任何其他表单。我在需要时手动初始化的其他表单。另外,我认为我认为最好不要将表单变量保留为全局变量,而是将它们保留为使用它们的其他表单的成员变量。
  • @Elling 我同意这一点并做同样的事情。但是,在向新手程序员解释这些事情时,最好采取小步骤。
【解决方案2】:

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

【讨论】:

  • @HTxL:你到底是从哪里调用代码的? Form1Form2 指针在该上下文中无效。请展示一个更完整的代码 sn-p 来显示你真正在做什么。
  • @HTxL: form1 在哪里被实例化?如果它不是主窗体,则需要确保它在 Form2 在运行时使用它之前被实例化。
【解决方案3】:

将 Unit1 置于实现中,在 Unit2 中使用。 不要在 Unit2 中声明 Form1。如果您在 Unit2 中声明 Form1,并且不为其分配值,则它将是一个空指针,在访问时会导致访问冲突。 如果您已释放 Form1 或未创建它,它也会导致访问冲突。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 尽可能在实现部分使用它们?
    • @MGH: 或者:尽可能在接口部分,必要时在实现部分
    • @Marjan, Andreas 我不认为这是正确的。如果我让两个单元在接口部分相互使用,则会创建一个循环引用。如果他们通过实现部分相互使用,它就可以工作。
    • @MGH:我们提到的是,我通常将所有内容都放在接口部分的 uses 子句中,并且只将单元放在实现部分的 uses 子句中以避免循环引用。意味着您永远不会在编译器不知道的情况下创建循环引用。
    【解决方案5】:

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

    那是因为unit1是主窗体,unit2是由unit1打开的。 所以将 unit1 添加到 unit2 的实现中是行不通的。 如果两个单元一起打开就可以了。

    【讨论】:

    • 这不是和安德烈亚斯回答的一样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多