我正在编写一个聊天程序,它有一群客户端连接到它,并将它们填充到一个列表视图中,我希望能够单击每个客户端,打开一个看起来像聊天的表单,但我希望能够同时对多个客户端这样做。
我已经为每个实例克隆了Form2 (聊天窗口),但是我需要知道如何锁定克隆的表单来进行更改,比如Form2.RichEdit.Lines.Add。
然而,当我尝试这样做时,它不工作,因为我没有锁定到正确的形式,因为它是克隆的,我假设它不再是Form2
任何有关这方面的信息将是非常感谢的。
更新
我要重述一下我想做的事。
我将解释我试图做什么:我有一个聊天程序(服务器),它侦听客户端通过Indy10套接字进行连接,当客户端连接它时,它用用户名填充ListView,当我单击用户名(服务器)打开私有信息表单时,我可以在那里与客户机聊天。
我希望能够有多个客户端连接,我希望能够点击多少我想要的,让它克隆私密的形式,并有两个单独的聊天窗口,以两个不同的客户端。
问题是:当试图单击seccond用户时,程序会变得混乱,无法锁定到这个seccond用户的私密形式(克隆)。
如果需要更多的信息,我的意思是任何事情,请不要犹豫,问我会开几个小时,并不断检查这条线。
我已经被困在这上面三天了,所以我真的很想解决这个问题,并继续我的项目。如有任何资料,敬请见谅。,提前谢谢!
发布于 2013-05-07 10:06:21
打开项目选项并从自动创建列表中删除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。请编辑您的问题,并添加标签与您的具体德尔菲版本。
PPS。下载现成的牙线聊天程序,只需阅读和学习他们是如何做到的。也许,与其打开一个自由浮动(乱糟糟的桌面)表单,不如在PageControl中打开Tab。“利用源头,卢克”
对于后者来说,要找到来源,就必须在www.google.com上键入两个单词"Visual“,并获得http://sourceforge.net/p/visualirc/mercurial/ci/default/tree/ --这是我忽略了的重要信息,因为我确信,一个对查找源感兴趣的人()能够自己完成这个任务。
公私伙伴关系。这些不是“克隆”:克隆是分开的对象。您所说的是同一个表单类的几个实例。就像表单上可能有两个或多个标签一样,应用程序中也可以有两个或两个以上的表单。
https://stackoverflow.com/questions/16413071
复制相似问题