如何在Delphi中锁定克隆的表单?

时间:2013-05-07 07:01:19

标签: forms delphi chat delphi-xe2

我正在编写一个聊天程序,其中有许多客户端连接到它并将自己填充到列表视图中,我希望能够单击每个客户端并打开一个看起来像聊天的表单,但我想要能够同时为多个客户做到这一点。

我为每个实例制作了Form2(聊天窗口)克隆本身,但我需要知道如何锁定克隆表单以进行更改,例如Form2.RichEdit.Lines.Add

然而,当我尝试这样做时,它不起作用,因为我没有锁定到正确的形式,因为它被克隆我假设它不再是Form2

任何关于此的信息都将受到高度赞赏。


更新

我将继续改写我想要做的事情。

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

我希望能够连接多个客户端,并希望能够点击我想​​要的任意数量,并让它克隆privatemessageform并为2个独立的客户端提供2个单独的聊天窗口

问题是:当试图点击第二个用户时,程序会感到困惑,无法锁定该第二个用户的privatemessageform(克隆)。

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

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

1 个答案:

答案 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。那些不是“克隆”的:克隆是分离的对象。你说的是同一个表格类的几个实例。就像表单上可能有两个或多个标签一样,您的应用程序中可以有两个或更多表单。