我们单位要组织信息化知识竞赛,要编一个类似抢答器的程序,就是主持人和数位抢答者各有一台电脑,彼此联网。主持人宣布完题目后,说开始(考虑在此时让主持人同时点击程序的开始按钮),各位抢答者找到答案后点击自己桌面上的程序的回答按钮,最先发送信息的在主持人的桌面上弹出一个消息框,如“*号最先回答”之类,同时主持人方的程序自动记录第二、三位回答者,以备第一位回答不正确时依序回答。

解决方案 »

  1.   

    相当于区域内的聊天程序。见delphi的demo
      

  2.   

    C:\Program Files\Borland\Delphi6\Demos\Internet\Chat
      

  3.   

    to pl5th2001(白牙):我看了例程,很有帮助。就是有一句看不懂,还请解释一下。在TCPServer的OnAccept事件中,有一句DataThread.TargetList := memRecv.lines;,注释是set the TagetList to the gui list that you with to synch with.(将TagetList与主界面中的LIST关联起来),但是我觉得应该是memRecv.lines:= DataThread.TargetList;才对啊。或者将这句去掉,在TClientDataThread.synchAddDataToControl方法中加入form1.memRecv.Lines:=TargetList;。很可惜我的两种方法都会出现EAccessException异常。
    如果分不够我再加。
      

  4.   

    1。DataThread.TargetList := memRecv.lines表示DataThread.TargetList是memRecv.lines的引用,Datathread在OnAccept事件里刚刚初始化,DataThread.TargetList = null,如果颠倒过来有何意义?
    2。TargetList没有赋值当然不能访问了,要改可以将方法TClientDataThread.synchAddDataToControl的实现改成Form1.memRecv.Lines.Add(ListBuffer);但这样违反OO原则,破坏程序结构
      

  5.   

    谢谢 largewang、pl5th2001、benbenliu!
    To benbenliu:
    1.你的意思是说DataThread.TargetList := memRecv.lines只是将TargetList的内存地址(引用)赋给memRecv.lines,而不是值传递?
    2.改成Form1.memRecv.Lines.Add(ListBuffer);也不行(我试了),Lines.Add要求TSring类型。
    3.什么是00原则?
    4.怎么加分?要不我另开一帖?
      

  6.   

    1.Delphi中除了值类型,其他的都是引用类型,传递的都是对象的引用。
    2.Form1.memRecv.Lines.AddStrings(ListBuffer);就可以了
    3.OO就是面向对象,在那个例子中,TClientDataThread类的对象负责接受信息,并利用TClientDataThread对象的方法更新它自己的数据成员TargetList,这样整个现程对象是一个独立的整体,使其自身具有复用性