2016-02-08 1 views
-3

Итак, я поговорил с одним из моих людей, и там чувствую, что было бы неплохо хэшировать весь текущий чат, который был отправлен заблокированным человеком, похожим на то, как TwitchTV chat работает, если человек заблокирован, он удалит все чаты с людьми и заменит их на ***Richedit и удалить весь текст из личного содержания

теперь было уже поздно, когда мы принимали так, что мой мозг не работал так хорошо в 5 утра: D, но теперь я уже думал еще больше о том, как это сделать. Я думаю, что это должен был быть список строк с текущим входящим чатом, затем поиск имени лица, а затем удалить весь текст после имени человека.

формат чата такой же

Simon: мое тестовое сообщение

так после того, как приглушенный чат из приходят будет выглядеть

Simon: ** **** *******

любой когда-либо делал это на всех швах очень сложных

Благодаря

+0

Если у вас уже есть входящий поток в TSTringList, почему бы не начать строить свой код. Тогда, если это не сработает, обратитесь к нам здесь ** с кодом **. Вот как работает SO. Прямо сейчас у нас есть ** нет ** идеи, о чем вы говорите, в каком чате, каком коде у вас уже есть и т. Д. –

+0

В чем вопрос? Это ваша программа. Поместите все, что угодно, в элемент управления редактирования. –

ответ

2

Если я правильно понимаю, что вы хотите сделать, это должно быть прямолинейно;

Забудьте о 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.

+0

Если вы будете использовать реальный объект, процесс обновления станет намного проще и чище. IMHO поддельные экземпляры из целого числа являются одним из худших шаблонов, которые я видел –

+1

@SirRufo: Спасибо за эти добрые слова. Серьезно, я знаю, что вы имеете в виду, лично я бы не использовал свойство Objects для хранения чисел. Идея делает мои пальцы ног такими же, как когда я вижу свойство Tag. Итак, я добавил пункт ответа на мой ответ, чтобы было ясно, что я сделал это только так, как для простоты иллюстрации. Но я думаю, что это отвлекает немного от основного вопроса моего ответа, а именно то, что, по-видимому, хочет OP, на самом деле довольно просто сделать, но TRichEdit - это не то место, где нужно начинать. – MartynA

+0

не IMData.UserID возвращает имя usersname строки и я просто добавить нормальный richline.lines.add (IMData.UserID + «:» + Message): сообщения является просто строкой непосредственно от клиента к серверу для других клиентов нет фантастические работы –

Смежные вопросы