所以我和我的一个人聊了一下,觉得最好把一个被阻止的人发送的当前聊天打乱,就好像TwitchTV聊天如果有人被阻止它将会删除全部人们聊天并用***替换
现在我们服用的时间已经很晚了,所以我的大脑在早上5点工作得很好:D但是现在我起来了,我一直在考虑如何做到这一点我想它必须是字符串列表当前传入的聊天然后搜索人名,然后删除人名后的所有文本
聊天格式就是这样
西蒙:我的测试信息
所以在被静音之后,聊天出来就好像是
西蒙:** **** *******
任何人都在非常复杂的接缝处做过这件事
由于
答案 0 :(得分:2)
如果我正确理解你想做什么,它实际上应该是直截了当的;
暂时忘掉TRichEdit,因为这个问题的解决方案是关于数据结构的,RichEdit只是一种在GUI中显示你想要的东西的方法。
假设您有一个TStringList,ChatMessages,您可以在其中附加用户的名称和 他们键入的内容,以及另一个包含其名称列表的TStringList,用户。
然后,为了实现您想要的功能,您需要跟踪"谁说什么", 并且可以使用ChatMessages TStringList的Objects属性。
所以,你可能会有这样的几种方法:
function TForm1.GetUserID(const UserName : String) : Integer;
begin
Result := Users.IndexOf(UserName) + 1;
if Result = 0 then begin
Users.Add(UserName);
Result := Users.IndexOf(UserName) + 1;
end;
Assert(Result > 0);
end;
procedure TForm1.AddChatMsg(UserName, Msg : String);
var
UserID : Integer;
begin
UserID := GetUserID(UserName);
ChatMessages.Add('');
ChatMessages.AddObject(UserName + ': ' + Msg, TObject(UserID));
end;
另一个定期更新RichEdit内容的程序 来自ChatMessages。
然后,当你想要" twit"用户,您可以搜索ChatMessage的对象 寻找他们的身份证号码。然后,您可以替换其中的内容 星号的名称标记行,同样在以下行中,直到找到 另一个用户在对象中的用户ID或到达ChatMessages的末尾。对此进行编码留给读者练习。
您是否在ChatMessage文本中执行星号,或者当您执行星号时无关紧要 将其文本复制到richEdit中,除非您在RichEdit中执行此操作 你可以"解开"用户稍后通过ChatMessages刷新它而不用星号替换。
请注意,上面的GetUserID将用户ID放在用户列表中的索引上(加1以避免任何UserID为零的用户,这将与未使用AddObject的行冲突)。因此,当用户被添加到列表中时,现有用户的索引不会发生变化是很重要的。因此,您不希望对用户列表进行排序(或者,如果您需要,则需要以不同的方式派生用户ID)。
此外,我在stringlist的Objects属性中存储了数字,纯粹是为了使代码尽可能简单以便于说明。在现实世界的解决方案中,您可能希望使用"清洁剂"这样做的方法,显而易见的方法是让TUser类具有name,userid和" twit"等属性。标志和某种用户容器类等,但如果包含在这里,那些实现细节就会受到妨碍。当然,一旦你有了TUser类,那么要做的就是将用户的TUser实例存储在stringlist的Objects属性中。