Если я правильно понимаю, что вы хотите сделать, это должно быть прямолинейно;
Забудьте о TRichEdit на какое-то время, потому что решение этой проблемы связано с структурами данных, а RichEdit - это всего лишь способ всплытия того, что вы хотите в своем графическом интерфейсе.
Предположим, у вас есть TStringList, ChatMessages, к которому вы добавляете имя пользователя и , что они набрали, и другой TStringList, Пользователи, который содержит список их имен.
Для достижения требуемой функциональности вам необходимо отслеживать, «кто сказал что», , и свойство объектов ChatMessages TStringList может быть использовано для этого.
Таким образом, вы можете иметь несколько методов, как это:
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 , ища свой идентификационный номер. Затем вы можете заменить то, что следует, в их строках с именем-тегами, звездочками, аналогично следующим строкам, пока не найдете идентификатор пользователя другого пользователя в объектах или достигнете конца ChatMessages. Кодирование этого оставлено как упражнение для читателя.
Это не имеет значения, делаете ли вы звездочку в тексте ChatMessage, или, как вы скопировать его текст в RichEdit, за исключением, конечно, что если вы делаете это в RichEdit вы можете «untwit» пользователем позже обновив его из ChatMessages без замены звездочки.
Обратите внимание, что GetUserID выше основывает идентификатор пользователя на свой индекс в списке «Пользователи» (плюс 1, чтобы избежать любого пользователя с идентификатором пользователя, равным нулю, который столкнулся бы с строками, в которых не использовался AddObject).Из-за этого важно, чтобы существующие пользовательские индексы не менялись при добавлении пользователя в список. Таким образом, вам не нужно сортировать список пользователей (или, если вам это нужно, вам нужно получить идентификатор пользователя по-другому).
Кроме того, я сохранил числа в свойстве объектов stringlist, чтобы сделать этот код максимально простым для иллюстрации. В реальном мире вы хотели бы использовать «более чистый» способ сделать это, и очевидный способ сделать это - иметь класс TUser со свойствами, такими как имя, идентификатор пользователя и флаг «twit» и некоторые виды user-container class и т. д., но результирующие подробности этих действий будут только мешать, если они включены здесь. Разумеется, если у вас есть класс TUser, то задача должна состоять в том, чтобы хранить экземпляр пользователя TUser в свойстве объектов stringlist.
Если у вас уже есть входящий поток в TSTringList, почему бы не начать строить свой код. Тогда, если это не сработает, обратитесь к нам здесь ** с кодом **. Вот как работает SO. Прямо сейчас у нас есть ** нет ** идеи, о чем вы говорите, в каком чате, каком коде у вас уже есть и т. Д. –
В чем вопрос? Это ваша программа. Поместите все, что угодно, в элемент управления редактирования. –