主页
Top.Mail.Ru Yandeks.Metrika
论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

向下

关闭程序时访问冲突。 找到类似的分支


Дельфятник   (2002-07-15 10:52) [0]

当程序关闭时,窗口关闭,当程序试图关闭其中一个窗口时,此时此窗口可见时出现问题 - FormHide事件上的这个窗口导致在主窗体上绘制图片。 并弹出访问冲突。 当然,我在try..except中调用重绘,并且用户没有看到此错误,但我想了解为什么会出现此错误。 消息是:
项目prj.exe引发异常类EAccessViolation,消息“模块中地址为77F81B4D的访问冲突”ntdll.dll“。读取地址000003A0”。 流程停止了。 使用步骤或运行继续。
我在调试器中找到了一条弹出此消息的行。 它看起来像这样:
canvas.brush.style:=bsSolid;
就在这一行的上方是bm_w do begin,也就是说,Canvas指的是TBitmap类型的bm_w。 同时我查了一下
bm_w = nil - 返回False,
Bm_w.Canvas = nil - 返回False,
Bm_w.Canvas.Brush = nil - 返回False,
Bm_w.Canvas.Brush.Style = nil - 返回False。
可能有什么不对?



Digitman   (2002-07-15 12:36) [1]

>> Bm_w.Canvas.Brush.Style = nil - 返回False。

这是无稽之谈。 Sv-in Style不是指针类型,它是一个Sv-in Tipo“转移”



AL2002   (2002-07-15 13:05) [2]

try..except - 一切都很好。
canvas.brush.style:=bsSolid;
原来,这行错误?
扔掉它。



valery_f   (2002-07-15 13:22) [3]

> Delfyatnik(15.07.02 10:52)......关闭程序时......

看起来有一种形式试图在它已经被杀死时被转向第二种形式(被杀死,但是指针保持不变并且检查nil没有给出任何东西)。

如果我理解正确,那么简单, - 假设Form1是主要的,而Form2 - 试图在OnHide上绘制主要的:

procedure TForm1.FormDestroy(Sender:TObject);
开始
Form1:= nil;
结束;

程序TForm2.FormHide(发件人:TObject);
开始
//也许Form1不再存在?
如果Form1 <> nil则开始
//画
Form1.Canvas ...
...
结束;
结束;



Дельфятник   (2002-07-15 15:05) [4]

对于valery_f:
我的主要形式称为fm_main,因此:

procedure TFm_main.FormDestroy(Sender:TObject);
开始
fm_main:= nil
结束;

程序TForm2.FormHide(发件人:TObject);
开始
尝试
if(fm_main <> nil)和fm_main.Visible然后//重绘调用

结束
结束;

它没有帮助。 如果你先关闭Form2(手动),然后关闭程序,那么一切都很好。 但我不能要求用户提供此信息。



valery_f   (2002-07-15 15:20) [5]

2 Delphi

肥皂来源,我们会看到。



Дельфятник   (2002-07-15 16:40) [6]

对于源代码,您需要一个基础~700Mb。



valery_f   (2002-07-15 17:00) [7]

>源代码需要一个基础~700Mb

一切都有多糟糕......如果绘图(有一个新兴的AV)没有连接到基础,你可以复制项目并抛弃基础,如果连接紧密,你可以在表格中留下1-2演示记录,并且会有几千字节。 ..

至少显示TForm2.FormHide中重绘的全文,并解释这两种形式是如何相关的。



Дельфятник   (2002-07-15 17:58) [8]

绘图与基础相关联 - 数据来自基础。 另外,基数超过75表。
表单连接如下 - 在主窗体上,当Form2可见时,Form2中的数据被绘制,而当Form2不可见时,不绘制数据。 因此,通过关闭Form2,您需要重绘图像。

重绘开始如下:
开始
obj_priz_ris;
用bm_w做
开始
width:= Fm_main.width;
height:= Fm_main.height;
pen_width:= fm_main.Im1.Canvas.Pen.Width;
pen_color:= fm_main.Im1.Canvas.Pen.color;
brush_Color:= fm_main.Im1.Canvas.brush.Color;
pen_Style:= fm_main.Im1.Canvas.Pen.style;
canvas.brush.style:= bsSolid; // AV刚出现在这里
以及任何进一步的绘图

Im1:TImage - 一切都在它上面绘制 - 它首先在bm_w上绘制,然后在重绘结束时,bm_w被复制到fm_main.Im1:

fm_main.Im1.Canvas.draw(0,0,bm_w)



BAY   (2002-07-15 18:03) [9]

> Delfyatnik
而且我试图不在Delfey下运行,而是直接exe-shnik?



Дельфтник   (2002-07-15 18:05) [10]

好吧,我写了我试试.except set,结果,用户没有看到任何AV。 因此,如果您运行exe,则不会出现错误。 但问题是如何以正常方式摆脱这个错误,而不是通过try..except。



BAY   (2002-07-15 18:10) [11]

> Delftnik
我的意思是没有try ..except



Дельфятник   (2002-07-15 18:16) [12]

2 BAY:是的,它仍然会弹出。



Дельфятник   (2002-07-16 09:48) [13]

顺便说一下,我在这里看到Form2.OnHide事件的处理早于Fm_main.FormDestroy。 这就是Valeria的第一个建议没有帮助的原因(valery_f(15.07.02 13:22))。



valery_f   (2002-07-16 11:45) [14]

> Delfyatnik(15.07.02 17:58)...当Form2可见时,主窗体从Form2中提取数据...关闭Form2后,您需要重新绘制图片...

您想说绘制主窗体的代码是否焊接到另一种形式? 它不是很漂亮。 每种形式都必须自己绘制所需的一切,其他可能的glukavah变体,并且在大多数情况下,恰恰在这样的时刻 - 形式的创造和破坏。 尝试摆脱交叉引用和链接,否则它不仅不是OOP,甚至不是模块化编程......

在你的例子中,并非一切都很清楚。 首先 - 谁“属于”bm_w? 何时创建bm_w以及何时销毁? 也许 - 当时的OnHide位图已经存在?

来吧 看看 - 如果bm_w在故障的那一刻还活着(在我看来没有任何故障),如果一切正常,我正在为主窗口和第二种形式丢弃DFM和PAS。



Дельфятник   (2002-07-17 13:53) [15]

当然可以。 通过TFm_main.FormClose,发生了bm_w.Free并且数组被归零,从中绘制了图片中的数据。 并且TFm_main.FormClose发生在Form2.FormHide之前,因此弹出错误。 我在TFm_main.FormClose中评论了这些归零,一切正常。
谢谢!



Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.07.29;
下载:[xml.tar.bz2];

楼上









内存:0.61 MB
时间:0.039 c
1-95404
AFROLOV
2002-07-16 10:00
2002.07.29
如何最好地制作类似于Delphi中的Code Assistant的表单


4-95622
Aliev adil
2002-05-23 16:03
2002.07.29
Windows目录


14-95549
为......而死
2002-07-02 19:43
2002.07.29
掩码下的密码......


6-95478
NUC
2002-05-18 00:20
2002.07.29
b / s数据速率限制器(在网络上)???


3-95251
的Weare
2002-07-08 18:14
2002.07.29
提示网格视图





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский