Keith™ 发表于 2020-4-1 21:12:44

由于未引用对象而导致的 Autocad 崩溃

这是另一个头脑。
我有一个形式c
**** Hidden Message *****

MickD 发表于 2020-4-1 22:13:55

这就是我对类似的情况下,汉族

Keith™ 发表于 2020-4-1 22:41:25

你创建的事件如何?形式?如果y

gile 发表于 2020-4-1 23:05:02


在窗体中,但是现在我已经查看了MickD提供的示例,我想我应该将它移到commandmethod中。这将确保只有一个事件处理程序,并且设置bool可以防止多个处理程序。
谢谢你的想法...现在看看这是否能解决我的问题。

gile 发表于 2020-4-2 02:25:13

嗨,也许我误解了这个问题,但是在我看来,总是在使用后处理模式对话框更安全,你可以从对话框实例的属性中获取数据,并将它们作为静态成员存储在包含CommandMethod的类中,这样就可以在绘图之间访问它们。这是一个带有某种输入框的极简示例,Dilaog类:   使用系统。Windows . Forms。

命名空间分隔OfConcernSample。
{。
公共分部类DialogBox : Form。
{。
公共字符串Data1 => textBox1,文本;。

公共对话框(字符串数据1)。
{。
initialize component();。
textBox1,Text = data1。
}。
}。
}。
命令类:   使用Autodesk,AutoCAD . Runtime。

使用系统,Windows . Forms。

使用AcAp = Autodesk,AutoCAD . application services . application;。

命名空间分隔OfConcernSample。
{。
公共类命令。
{。
静态字符串data1 =。


公共静态void InputCmd()。
{。
使用(var dialog = new dialog box(data1))。
{。
if (AcAp,ShowModalDialog(dialog)= = dialog result,好)。
{。
data1 =对话框,数据1;。
}。
}。
}。


公共静态void OutputCmd()。
{。
AcAp,ShowAlertDialog(data1);。
}。
}。
}。

MickD 发表于 2020-4-2 05:26:43

我会尝试这个,这样形式就拥有了反应器公共分部类MyForm:Form。
{。
公共 MyForm()。
{。
InitializeComponent();。
Bricscad.ApplicationServices.Application.DocumentManager.。
文档当前 += DocumentManager_DocumentBecameCurrent;。
}。

private void DocumentManager_DocumentBecameCurrent(object sender, Bricscad.ApplicationServices.DocumentCollectionEventArgs e)。
{。
//。
}。
}。
和 partial class MyForm。
{。
/// 。
必需的设计器变量,。
/// 。
private System.ComponentModel.IContainer components = null;。

/// 。
清理正在使用的任何资源,。
/// 。
如果应释放托管资源,则为 true;否则为 false。。
受保护的覆盖 void Dispose(bool disposing)。
{。
if (disposal && (components != null))。
{。
Bricscad.ApplicationServices.Application. 。
DocumentManager.DocumentBecameCurrent -= DocumentManager_DocumentBecameCurrent; //。

组件,处置();。
}。
基础,处置(处置);。
}。

#region Windows 窗体设计器生成的代码。

/// 。
设计器支持所需的方法 - 不修改。
/// 此方法的内容与代码编辑器,。
/// 。
private void InitializeComponent()。
{。
this.components = new System.ComponentModel.Container();。
这,AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;。
这,ClientSize = new System.Drawing.Size(800, 450);。
这,文本 = “MyForm”;。
}。

#endregion。
}。

Keith™ 发表于 2020-4-2 08:11:33

是的,你可以。
如果你想要存储的数据

MickD 发表于 2020-4-2 17:24:52

不论真假,我发布的代码已经被我们

Keith™ 发表于 2020-4-2 19:02:11


实际上,当窗体关闭时,我会在窗体上强制一个dispose。事件处理程序不释放,但几乎所有其他变量和控件都释放。我相信这是因为它是静态的。
问题是当窗体被释放时,事件处理程序仍然是活动的。我通过在关闭时抓住窗户的把手来确定这一点。在释放窗体并重新初始化一个新窗体后,事件处理程序给了我已释放窗体的句柄,而不是当前窗体的句柄,尽管窗体已被释放并且错误处理程序已在窗体中定义。
好的,所以我实际上没有在绘图之间存储数据。我正在处理几幅图中的数据。几乎所有东西都是作为调色板构建的。打开、关闭或激活图纸应强制应用程序从当前图纸中读取某些数据,并通过将其放入另一张图纸的选项显示出来,或者在一个函数的情况下,如果满足某些标准,更改一张图纸中的属性值将提示在另一张打开的图纸中进行更新。
因此,我的问题的解决方案是将事件处理程序移到带有commandmethods的类中,然后在那里处理事件。当应用程序卸载时,无论打开还是关闭的绘图,该类都会被释放。这解决了我的问题。
最后,我认为问题在于,一旦在静态类中定义了变量,这些变量显然不会因为保存它们的窗体被释放而超出范围。不过,现在它开始工作了。

MickD 发表于 2020-4-2 19:44:45


有趣的是,你真的尝试过在处置时移除反应堆吗?无论如何,如果您的表单没有被处理,那么您可以在FormClosing上卸载反应器。
DocumentManager.DocumentBecameCurrent -= DocumentManager_DocumentBecameCurrent.
MickDs Static也可以工作。
我一直使用这种模式
Class
{
Class()
{
   Load reactor
}
~Class()
{
   Unload reactor
}
}

页: [1] 2
查看完整版本: 由于未引用对象而导致的 Autocad 崩溃