1

我正在编写一个聊天程序,它有一堆客户端连接到它并将自己填充到列表视图中,我希望能够单击每个单独的客户端并打开一个看起来像聊天的表单,但我希望能够同时对多个客户执行此操作。

我已经Form2为每个实例(聊天窗口)克隆了自己,但是我需要知道如何锁定克隆的表单以进行更改,例如Form2.RichEdit.Lines.Add

但是,当我尝试这样做时,它不起作用,因为我没有锁定正确的表单,因为它被克隆了,我假设它不再是Form2

任何有关此的信息将不胜感激。


更新

我将继续改写我正在尝试做的事情。

我将解释我要做什么:我有一个聊天程序(服务器)正在侦听客户端通过 Indy10 套接字连接当客户端连接时,它会使用用户名填充 ListView 并且当我单击用户名时(服务器) 打开 privatemessageform,我可以在其中与客户聊天。

我希望能够连接多个客户端,并且我希望能够点击任意数量的客户端并让它克隆 privatemessageform 并有 2 个单独的聊天窗口到 2 个单独的客户端

问题是:当试图单击第二个用户时,程序会感到困惑,无法锁定第二个用户的私人消息表单(克隆)。

如果需要更多信息,我的意思是任何事情,请不要犹豫,问我会持续几个小时并不断检查这个线程。

我已经坚持了 3 天,所以我真的很想解决这个问题并继续我的项目。任何信息都非常感谢。提前致谢!

4

1 回答 1

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。

聚苯乙烯。下载现成的 FLOSS 聊天程序,然后阅读并了解他们是如何做到的。也许与其打开一个自由浮动(杂乱的桌面)表单,不如在PageControl. “使用源头,卢克”

要让后者找到来源,必须在 www.google.com 上键入两个词“Visual IRC”并获取http://sourceforge.net/p/visualirc/mercurial/ci/default/tree/ - 这个重要信息我确实忽略了一个公平的信念,一个有兴趣寻找资源的人可以自己做。

购买力平价。那些不是“克隆的”:克隆的是分离的对象。你说的是同一个表单类的几个实例。就像表单上可能有两个或更多标签一样,您的应用程序中也可以有两个或更多表单。

于 2013-05-07T10:06:21.327 回答