面试的问题,加急求助!! 今天去面试了一家软件公司,技术总监问了我这样一个问题,不知咋回答,求助。问题是:在delphi里有两个窗体,一个窗体与另外一个窗体进行通讯,接受数据的窗体里把接受的数据以字符串的形式显示在listview控件里,但在接受的瞬间,接受数据的窗体正好被关闭,也就是说listview控件已经被销毁(Free掉了listview的内存0)这个时候势必回发生异常,请问怎么避免这个异常的发生,求助中。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 避免这个异常的发生,这句话很关键,所以我想会不会是两个程序通过XML等方式交换数据? 孒淵,你好,就算是XML方式传输数据,但是这个时候接受数据的窗体都已经不存在了啊。 我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。 在接收窗体关闭前,主动向Listview中的信息发送出去不行吗?即在OnClose事件中把Listview中的信息传给相应的信息收集者! 假设窗体A通知窗体B,要窗体B中的ListView显示某字符串窗体A发布事件OnXXChange,窗体B创建时订阅该事件,销毁时取消该事件的订阅感觉怎么这么别扭啊,其实一般直接用简单办法,使用窗体B的OnClose事件得了 A窗体通过发送消息给B窗体,由B窗体来实现。 不要直接通过单元间的引用来实现。B.ListView1..... 两个窗体之间互相调用传递数据先用 Assigned(frm) 判断一下窗体是否被创建,如果没创建可以在 Application.CreateForm(Tfrm, frm);或者提示. 如果是接收窗体内部写入LISTVIW, 在单程的情况下不会发生错误的.如果接收数据的对象A是一个独立的并不属于LISTVIEW所在的窗体B,并且是A在调用B.ListView.AddItem 的话是有可能出错的.A在调用时候要检查B是否FREE掉了.在一个方法就是用消息,接收数据的对象A在收到数据后给窗体B PostMessage 的方式发送一个消息.窗体B在收到消息后从A处取得内容写入LISTVIEW 为什么不在接收窗体里面直接在赋值方法中判断LISTVIEW对象是否存在呢?不管理是你瞬间还是什么时候。只要不存在LISTVIEW我就不赋值,会有异常吗?if assigned(ListViewOBJ)<>nil thenbegin //进行赋值 ListView.item.add....end;个人认为,只要判断了不存在异常。如果不做判断,直接listview.item.add肯定存在异常,因为LISTVIEW销HUI了,对象不存在了就没有了后面的ADD方法。不知道这样可否可行。 个人还是比较赞同主动接收 发送方窗体先给接收方窗体一个消息,告诉接收方窗体可以接收数据。 如果接收方收到这个消息就可以请求接收数据了,不会因为窗体不存在出异常了8楼 孒淵 的比喻很贴切我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。 个人还是比较赞同主动接收 发送方窗体先给接收方窗体一个消息,告诉接收方窗体可以接收数据。 如果接收方收到这个消息就可以请求接收数据了,不会因为窗体不存在出异常了8楼 孒淵 的比喻很贴切我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。 应该是发送消息最好的,只要PosMessage或SendMessage给指定的窗口句柄,有指定的的窗体进行消息处理过程,这样就跟当前窗体没有关系了。至于那个使用Assigned和异常处理则是一种被动的处理方式。 DELPHI如何调用.net remoting 高分求一店名 Delphi7读取DBF数据,无法找到字段内容 100分求教!如何把两个不同的表的数据进行导入??!! 等待高手指教,(我是新手,怎么不让我给分了呀!?) 如何将数据库中的某个字段的所有记录读入到一个ComboBox中? Delphi对数据库访问时如何对图形字段进行插入、修改,用Sql来实现。 关于DBGrid中控制日期型字段的输入!在线等待! 如何在adoquery的属性sql中写出带参数的sql语句?? 如何从数据库中随机取一个值? 怎么解决字符串中有“&”符号的问题 监控数据库更新
即在OnClose事件中把Listview中的信息传给相应的信息收集者!
是有可能出错的.A在调用时候要检查B是否FREE掉了.在一个方法就是用消息,接收数据的对象A在收到数据后给窗体B PostMessage 的方式发送一个消息.
窗体B在收到消息后从A处取得内容写入LISTVIEW
不管理是你瞬间还是什么时候。只要不存在LISTVIEW我就不赋值,会有异常吗?
if assigned(ListViewOBJ)<>nil then
begin
//进行赋值
ListView.item.add....
end;个人认为,只要判断了不存在异常。
如果不做判断,直接listview.item.add肯定存在异常,因为LISTVIEW销HUI了,对象不存在了就没有了后面的ADD方法。不知道这样可否可行。
如果接收方收到这个消息就可以请求接收数据了,不会因为窗体不存在出异常了8楼 孒淵 的比喻很贴切
我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。
如果接收方收到这个消息就可以请求接收数据了,不会因为窗体不存在出异常了8楼 孒淵 的比喻很贴切
我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。
至于那个使用Assigned和异常处理则是一种被动的处理方式。