今天去面试了一家软件公司,技术总监问了我这样一个问题,不知咋回答,求助。问题是:在delphi里有两个窗体,一个窗体与另外一个窗体进行通讯,接受数据的窗体里把接受的数据以字符串的形式显示在listview控件里,但在接受的瞬间,接受数据的窗体正好被关闭,也就是说listview控件已经被销毁(Free掉了listview的内存0)这个时候势必回发生异常,请问怎么避免这个异常的发生,求助中。。

解决方案 »

  1.   

    避免这个异常的发生,这句话很关键,所以我想会不会是两个程序通过XML等方式交换数据?
      

  2.   

    孒淵,你好,就算是XML方式传输数据,但是这个时候接受数据的窗体都已经不存在了啊。
      

  3.   

    我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。
      

  4.   

    在接收窗体关闭前,主动向Listview中的信息发送出去不行吗?
    即在OnClose事件中把Listview中的信息传给相应的信息收集者!
      

  5.   

    假设窗体A通知窗体B,要窗体B中的ListView显示某字符串窗体A发布事件OnXXChange,窗体B创建时订阅该事件,销毁时取消该事件的订阅感觉怎么这么别扭啊,其实一般直接用简单办法,使用窗体B的OnClose事件得了
      

  6.   

    A窗体通过发送消息给B窗体,由B窗体来实现。 不要直接通过单元间的引用来实现。B.ListView1.....
      

  7.   

    两个窗体之间互相调用传递数据先用 Assigned(frm) 判断一下窗体是否被创建,如果没创建可以在 Application.CreateForm(Tfrm, frm);或者提示.
      

  8.   

    如果是接收窗体内部写入LISTVIW, 在单程的情况下不会发生错误的.如果接收数据的对象A是一个独立的并不属于LISTVIEW所在的窗体B,并且是A在调用B.ListView.AddItem 的话
    是有可能出错的.A在调用时候要检查B是否FREE掉了.在一个方法就是用消息,接收数据的对象A在收到数据后给窗体B PostMessage 的方式发送一个消息.
    窗体B在收到消息后从A处取得内容写入LISTVIEW
      

  9.   

    为什么不在接收窗体里面直接在赋值方法中判断LISTVIEW对象是否存在呢?
    不管理是你瞬间还是什么时候。只要不存在LISTVIEW我就不赋值,会有异常吗?
    if assigned(ListViewOBJ)<>nil then
    begin
       //进行赋值
       ListView.item.add....
    end;个人认为,只要判断了不存在异常。
    如果不做判断,直接listview.item.add肯定存在异常,因为LISTVIEW销HUI了,对象不存在了就没有了后面的ADD方法。不知道这样可否可行。
      

  10.   

    个人还是比较赞同主动接收 发送方窗体先给接收方窗体一个消息,告诉接收方窗体可以接收数据。 
    如果接收方收到这个消息就可以请求接收数据了,不会因为窗体不存在出异常了8楼 孒淵 的比喻很贴切
    我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。
      

  11.   

    个人还是比较赞同主动接收 发送方窗体先给接收方窗体一个消息,告诉接收方窗体可以接收数据。 
    如果接收方收到这个消息就可以请求接收数据了,不会因为窗体不存在出异常了8楼 孒淵 的比喻很贴切
    我说的主动接收意思是:A把一个变量指针或一个函数指针传给B,告诉B你要的东西在我的包里,你来拿吧,B就通过指针到A的包里拿他想要的东西,这时B死了,A也不会受影响。
      

  12.   

    应该是发送消息最好的,只要PosMessage或SendMessage给指定的窗口句柄,有指定的的窗体进行消息处理过程,这样就跟当前窗体没有关系了。
    至于那个使用Assigned和异常处理则是一种被动的处理方式。