乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 125|回复: 7

警告 CA2000 在丢失作用域之前释放对象

[复制链接]

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-6-18 23:01:33 | 显示全部楼层 |阅读模式
我收到了处置警告,我已经验证了该对象确实已被处置,但我仍然收到了警告。我错过什么了吗
私有void OptionsForm(){
选项表单对话框=新选项表单
dialog.ShowDialog()
如果(!dialog.IsDisposed){
对话框.Dispose()
}
}

此外,还有调用此函数的代码。Close(),理论上应该处理表单。
我尝试将代码包装在一个try-catch中,但错误只是说“对话框未沿所有异常路径处理”。
将代码更改为此似乎满足了错误:
private void OptionsForm(){
使用(dialog=newoptionsform){
dialog.ShowDialog()
}
}

这不是我看到这个问题的唯一形式。所有表格都有类似的错误。这是一系列需要修改的程序,以满足这只野兽的需要。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2017-6-19 01:07:14 | 显示全部楼层
怎么样在尝试,抓住,最后?
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2017-6-19 01:49:25 | 显示全部楼层
嗨,假设您从AutoCAD调用此方法,您应该使用Application。ShowModalDialog或应用程序,ShowModelessDialog而不是Form.ShowDialog.正如nullptr所说,using语句是一种try的包装...(接住)...最后。    private void option form()。
{。
使用(var dialog = new options form())。
{。
欧特克,AutoCAD . application services . application . showmodaldialog(对话框);。
}。
}。
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-6-19 09:34:12 | 显示全部楼层
除了gile所说的…
调用Form.Close()与表单本身的结果不同,这取决于表单的显示方式:
当表单显示为无模式时,即Autodesk.AutoCAD.ApplicationServices.Application.ShowModelsDialog()/Forms。Show(),Close()方法不仅可以可视地关闭表单,还可以处理表单。
当表单显示为对话框/模态时,即Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog()/form。ShowDialog(),Close()方法只可视地关闭表单,而不处理表单。也就是说,对模态表单的Close()调用等同于form.Hide()/form.Visible=False。必要时,表单调用代码负责处理显示为对话框的表单。这就是为什么通常的做法是在“使用…”块中包装对话框窗体,但不是非模态窗体。
顺便说一句,在大多数情况下,如果使用非模态窗体,则在AutoCAD中。如果不是全部,表单将被创建为单例对象(即静态实例),并且它的FormClosing甚至会被处理以取消表单关闭;相反,我们在事件处理程序中将其Visible设置为False。因此,对于用户来说,表单是关闭的。但是表单实例仍然存在于内存中,可以在需要时设置为可见。典型的例子是调色板集。
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2017-6-19 21:47:16 | 显示全部楼层
模态形式没有问题。我可以将它们包装在using语句中,以确保它们被释放。我担心的是非模态的。因为代码在form.show()调用后继续执行,所以调用函数将无法释放该对象,因为它很快就会超出范围。如果使用Autodesk。AutoCAD . application services . application . showmodelessdialog()解决了这个问题,这可能是我需要走的路。
使用Autodesk打开模态表单的好处是什么?AutoCAD . application services . application . showmodaldialog(),特别是当它们不直接与文档交互时?
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-6-20 00:49:53 | 显示全部楼层

在注册表中存储大小和位置
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2017-6-20 09:53:09 | 显示全部楼层

我认为,模态窗体(对话框)可能是AutoCAD加载项最常用的用户界面。大多数应用程序在某些时候需要用户输入,进一步的执行将依赖于用户输入,因此对话框会阻塞执行,直到用户输入完成。
OTH,使用非模态表单使事情变得相当复杂,尤其是当表单显示与特定文档相关的数据时,因为AutoCAD本身是一个多文档环境,并且活动文档可以由于多种原因而改变,因此需要相应地同步非模态表单中显示的内容。这就是为什么在我之前的回复中,我提到了创建一个单例/静态表单是很常见的,如果你想让它成为无模式表单的话。我在这里有更多关于无模式表单的讨论:
http://drive-CAD-with-code . blogspot . ca/2014/02/showing-and-closing-modeless-form dialog . html
回复

使用道具 举报

154

主题

1274

帖子

8

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1936
发表于 2017-6-20 16:22:08 | 显示全部楼层
直接从AutoCAD调用“我的表单”时,将在当前文档的当前空间中工作。交换文档也会导致应用程序交换文档。我仍然需要解决一些问题,但在很大程度上,这是因为它的实现方式。任何操作都不会导致用户更改图形或布局选项卡,从而存在应用程序在错误布局中运行的任何危险<无论如何,我已经解决了这个问题。对于直接在AutoCAD中创建的表单,我将酌情使用ShowModalDialog()/ShowModelessDialog()调用。我将继续让应用程序处理这些表单的子表单。这主要是因为我不需要在其中引用AutoCAD部件,因为它们不使用它们,而且它们是独立的项目,不需要对各种版本的AutoCAD进行特殊处理。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 13:47 , Processed in 0.305391 second(s), 79 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表