如果我正確地理解你想要做的事情,那實際上應該是直截了當的;
暫時忘掉TRichEdit,因爲這個問題的解決方案是關於數據結構的,RichEdit僅僅是一種在GUI中展現你想要的東西的方法。
假設您有一個TStringList,ChatMessages,您將追加用戶名和 他們鍵入的內容以及另一個包含其名稱列表的TStringList,Users包含在其中。
然後,要實現您想要的功能,您需要跟蹤「誰說什麼」, 和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;
和另一個程序,定期從ChatMessages更新RichEdit中的內容 。
然後,當你想「嘲弄」一個用戶時,你可以通過ChatMessage的對象 搜索他們的ID號碼。然後,您可以用星號代替 名稱標籤行中後面的內容,如下所示,直到在對象中找到 其他用戶的用戶標識或到達ChatMessages的結尾。編碼是留給讀者的一個練習。
不要緊,你是否在ChatMessage文本做了星號,或者因爲你 複製其文成RICHEDIT,除非當然,如果你在RichEdit中做 可以「untwit」用戶以後通過從ChatMessages刷新而不用星號替換。
請注意,上面的GetUserID基於用戶的ID在用戶列表的索引中(加1以避免任何用戶的UserID爲零,這會與不使用AddObject的行發生衝突)。因此,當用戶添加到列表中時,現有用戶的索引不會更改很重要。所以,你不希望用戶列表被排序(或者,如果你需要的話,你需要以不同的方式派生UserID)。
此外,我已經將數字存儲在stringlist的Objects屬性中,純粹是爲了使此代碼儘可能簡單,以供說明之用。在現實世界的解決方案中,您會希望使用「更乾淨」的方式來做到這一點,而做到這一點的顯而易見的方法是讓TUser類具有屬性,如名稱,用戶標識和「twit」標誌以及某種用戶容器類等,但如果包含在這裏的話,那些實現細節就會受到阻礙。當然,一旦你有一個TUser類,那麼要做的就是將用戶的TUser實例存儲在字符串列表的Object屬性中。
如果您已經在TSTringList中有傳入流,爲什麼不開始構建您的代碼。然後,如果它不起作用,請使用代碼**在此處尋求幫助。這就是SO的工作原理。現在我們有** no **想法你在說什麼,什麼聊天,你已經有什麼代碼等。 –
問題是什麼?這是你的程序。把你喜歡的任何東西放在編輯控件中。 –