我正在编写一个聊天程序,其中有许多客户端连接到它并将自己填充到列表视图中,我希望能够单击每个客户端并打开一个看起来像聊天的表单,但我想要能够同时为多个客户做到这一点。
我为每个实例制作了Form2
(聊天窗口)克隆本身,但我需要知道如何锁定克隆表单以进行更改,例如Form2.RichEdit.Lines.Add
然而,当我尝试这样做时,它不起作用,因为我没有锁定到正确的形式,因为它被克隆我假设它不再是Form2
任何关于此的信息都将受到高度赞赏。
更新
我将继续改写我想要做的事情。
我将解释我想要做什么:我有一个聊天程序(服务器)正在侦听客户端通过Indy10套接字进行连接当客户端连接它时,用用户名填充ListView,当我点击用户名时(服务器)打开privatemessageform,我可以在那里与客户聊天。
我希望能够连接多个客户端,并希望能够点击我想要的任意数量,并让它克隆privatemessageform并为2个独立的客户端提供2个单独的聊天窗口
问题是:当试图点击第二个用户时,程序会感到困惑,无法锁定该第二个用户的privatemessageform(克隆)。
如果需要更多信息,我的意思是任何事情,请不要犹豫,问我将持续几个小时,并不断检查这个帖子。
我已经坚持了3天,所以我真的很想解决这个问题并继续推进我的项目。任何信息都非常感谢。 提前致谢!
答案 0 :(得分:4)
打开“项目选项”并从自动创建列表中删除Form2。不要再使用该变量了。
将TForm2
重命名为某个有意义的名称。一旦你的程序中有大约10个表单,你就会忘记你的数字2,5,7 ...
总是给变量有意义的名称,包括组件,包括表单。在这里,我将TForm2
命名为TPrivMessageForm
使用特殊的变量数组来保存多个表单,而不是单个全局变量。例如:
Type TChatUser = string;
// to begin with, user is a name. Then it may become URL, or GUID or something
// complex like `record` or `class` or whatever
Type TPMForms = TDictionary<TChatUser, TPrivMessageForm>;
PMForms := TPMForms.Create;
点击用户后创建新的私人消息窗口:
if not PMForms.ContainsKey(ClickedUser)
then PMForms.Add(ClickedUser, TPrivMessageForm.Create(Application) );
PMForms[ClickedUser].ChatWith := ClickedUser; // variable in ex-TForm2 to tell several instances apart
关闭此类表单时,应通过其OnClose
PMForms
列表中删除自己(因此不会留下任何悬空指针)caRelease
进行结束操作(使VCL实际上释放表单对象)另见
PS。请编辑您的问题,并使用您的特定Delphi版本添加TAG。
PPS。下载现成的FLOSS聊天程序,只需阅读并了解他们是如何做到的。也许不是打开自由浮动(混乱的桌面)表单,而是最好在PageControl
中打开Tab。 “使用来源,卢克”
对于后者找到来源,必须在www.google.com上输入两个单词“Visual IRC”并获取http://sourceforge.net/p/visualirc/mercurial/ci/default/tree/ - 我确实遗漏了这个重要信息,相信一个人<强烈>感兴趣在寻找来源时可以自己做。
PPPS。那些不是“克隆”的:克隆是分离的对象。你说的是同一个表格类的几个实例。就像表单上可能有两个或多个标签一样,您的应用程序中可以有两个或更多表单。