2010-05-04 33 views
1

我有一个问题,那就是奇怪,我这,但希望不是太奇怪了别人。 :)一些背景:我正在开发一个简单的IM客户端,它允许用户将消息广播给多个收件人。目标是为包含广播消息文本的每个收件人创建一个聊天表单,然后仅在收件人响应广播时才显示该表单。但是,当应用程序收到响应后,尝试找到特定聊天会话的表单(使用Application.OpenForms)时,无法找到它,除非我在创建时显示它。我想避免在创建时显示此表单,因为这意味着用户将在屏幕上看到闪光灯。形式似乎没有真正创建,直到我告诉它,但它似乎必须有一个办法做到这一点,而不显示第一。任何人都可以协助实例化一个形式,后来发现它,没有表现出最初

,如果需要,我可以提供代码片段,我没有在这个岗位,因为这感觉更像是对我而言比在代码中的错误观念误区。提前致谢!

回答

2

而不是使用形式作为基类的,做它的其他方式,创建可以引用表单的类。这样,你就可以随时向班级通报内容,并在表格中反映出来(如果已初始化),而不是反过来。 您不应该依赖表单作为对象的基础。使用Application.OpenForms 应该是不必要的。

public class Contact 
{ 
    string displayname = String.Empty; 
    List<Message> history = new List<Message>(); 
    MessageForm theform = new MessageForm(this); 

    public void OnEvent(Message msg) 
    { 
     if(msg.Sender != me && !theform.Visible) 
      theform.Show(); 

    } 

    public void Tell(string message) 
    { 
    } 

} 

请某种名单的联系人,事情应该是比较简单的。 (请注意,Windows窗体是不是线程安全的,如果你尝试从不同的线程比主改变的任何控件的任何属性会抛出异常)

+0

谢谢大家的意见。 @Jarle Moe,这似乎是最容易融入现有代码的建议,我会继续努力。由于我的问题已经得到解答(我做错了),我相信这个问题可以结束。 – awilson53 2010-05-04 17:22:04

0

Windows窗体有一个像隐藏(),显示()和激活方法()。使用这些方法解决您的问题。

0

为什么不存储与聊天会话形式的参考,并用它来打电话.Show()当你需要显示的形式:

session.form.Show(); 

然后,您可以创建窗体,不显示它和你不每次要引用它时,都需要调用Application.OpenForms的开销。

我知道这是说明明显,但OpenForms不会发现,并没有显示出,因为它是不开放的形式。

0

由于形式手柄还没有生成,直到所示的形式,你可以手动分配它像这样:

mf = new MainForm(); 

     /* Need to assign a handle to MainForm instance manually 
     as handle does not get created until form is shown */ 
     IntPtr handle = mf.Handle; 
相关问题