Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2008, 05:55   #51
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Вопрос

Ребят у меня такой вопрос:
Вопрос про приват - как сделать чтобы приватное сообщение было другим цветом, например синим????
Вопрос по части пользователей - как реализовать такую фишку, чтобы пользователь выбрал себе цвет, и чтобы все его сообщения были под этим цветом и причем этот цвет должны видеть все пользователи. короче как на "веб" чатах, выбрал цвет и все твои сообщения под этим цветом, вот.....
И еще... можно ли сделать смайликов???

заранее премного благодарен!

Последний раз редактировалось IIpopoK; 24.08.2008 в 08:37.
IIpopoK вне форума Ответить с цитированием
Старый 25.08.2008, 22:13   #52
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Модернизация, цветные сообщения...

Про все дела с цветами.

Вместо компонента Memo, отображающего текст сообщения, примените RichEdit (вкладка Win32), имя задать "ChatRichEdit". Вот пример его использования:

Код:
with ChatRichEdit do
  begin
    Lines.Add('');  // переход на новую строку
    SelAttributes.Color := clWhite;  // цвет текста
    SelAttributes.Size  := 8;  // размер шрифта
    SelAttributes.Name  := 'Tahoma';  // название шрифта
    SelAttributes.Style := [fsBold];  // стиль (полужирный)
// стили можно комбинировать, указать их через запятую, или просто
// оставить квадратные скобки пустыми
    SelText:=text;  // строковая переменная с текстом сообщения
  end;
Чтобы сервер и клиент понимали какой цвет стиль и шрифт применить, нужно ввести в команду отправки сообщения расширенный заголовок. Вот так выглядит команда, которую сервер и клиент понимают как сообщение:

'0'+text

'0' - это заголовок, код команды сообщения;
text - строка с ником отправителя и сообщением.

Добавим в заголовке после кода команды еще несколько байт:
2-й байт - шрифт;
3-й байт - размер;
4-й байт - цвет;
5-й байт - стиль.

...у вас есть 10 вариантов шрифтов, размеров, цветов, ...а для стиля нужно любые 4 значения. Как вы все это себе представите - ваше личное дело, ...создайте таблицу (на листке бумаги) и задайте под каждый параметр свою цифру от 0 до 9.

Создайте еще одну форму в проекте, поместите туда поля с выбором шрифтов, ...аналогичные действия вы можете посмотреть в статье "Создание клиент-сервера", во второй ее части. Все данные с полей оперативно собираете в строку, добавляете код команды, и может получиться нечто подобное:

'00571'+text

Как только эта команда приходит на сервер или клиент, начинаете разбирать ее на части. Вы точно знаете, что 1-й символ - код команды, сработает case, в нем все варианты для задания шрифтов. Используйте переменные соответствующего типа, а затем при создании текста в ChatRichEdit используйте их.

Про смайлики.


Для этого вам нужен расширенный ричэдит, он называется TRxRichEdit, ищите в Интернете, устанавливайте и разбирайтесь, найдете массу примеров его использования, я наслышан о нем, но не сталкивался с ним, ...как-то не нужно, другими методами пользуюсь, сложными.

Надеюсь вы сможете сами создать код, ...если будут затруднения или вопросы, пишите, выкладывайте участки проблемного кода.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.08.2008, 06:23   #53
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Печаль

Извините конечно, не думайте что я тупой, но я не очень понимаю
Непонимаю как, что сделать.
Непонимаю как реализовать цвет сообщения.
Нет, ну конечно я понимаю как изменить цвет, но как сделать, чтобы пользователь выбрал цвет, и все его сообщения шли под этим цветом,
причем, чтобы цвет его сообщений видели остальные пользователи!=((
Как в ICQ или MAgent. пипец, не доганяю я чета=((
или, лидно фиг с ним... забьем на это.
Но как изменить цвет приватного сообщения???

Последний раз редактировалось IIpopoK; 26.08.2008 в 06:26.
IIpopoK вне форума Ответить с цитированием
Старый 26.08.2008, 22:24   #54
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Модернизация до версии 2.0: Часть 1

Появилось предложение внедрить в чат изменяемый шрифт, теоретическое описание было выше, перейдем к практике.

Добавляем в форму кнопку BitBtn1, меняем имя на FontBitBtn, в Caption запишем "F", чтобы было понятно, что эта клавиша вызова параметров шрифта.
Создаем новую форму (Form2) сохраним ее как FontUnit, в заголовке запишем "Параметры шрифта". Кидаем в форму два компонента ComboBox и компонент ColorBox, над каждым, соответственно, Label (метка) с пояснением, что это за параметр. Применение стиля к шрифту выполнять не будем, ...лучше пусть стиль будет системным свойством, для определения приватности, например, можно сделать шрифт полужирным, а в простых сообщениях использовать обычный.
Вот так расположим компоненты (стандартное имя, новое имя, метка):

ComboBox1 - FontComboBox - "Шрифт"
ComboBox2 - SizeComboBox - "Размер шрифта"
ColorBox1 - ColorBox - "Цвет шрифта"

Отключим все "левые" цвета в ColorBox (свойство Slyle, все False, кроме cbStandardColors). В итоге у нас 16 цветов, как их уместить в ограниченные 10? Выделим под цвет 2 байта в заголовке команды. Тут получается 100 вариантов цвета, если мы будем использовать цвет с номером 3, то два байта будут выглядеть как "03", а 16 как "16", не совсем удобно, ...невозможно сразу скопировать 2 символа и перевести в Integer (StrToInt). Прибегнем к хитрости, будем прибавлять к исходному варианту 10, тогда все числа кода будут двухзначными и будут легко переводиться в числа без дополнительной обработки. Соответственно, при применении кода будем отнимать 10.
Добавим глобальных переменных в коде главной формы (Form1, MainUnit):

Код:
threadvar
  FontName, FontSize, FontColor: String;
Обязательно нужно связать pas-файлы форм между собой. Для этого сразу в теле после implementation запишем:

для главной формы - uses FontUnit;
для второй формы - uses MainUnit;

Смотрим вторую форму (Form2, FontUnit). Заполняем процедуру создания формы командами, которые запишут в списки все параметры шрифтов:

Код:
procedure TForm2.FormCreate(Sender: TObject);
begin
// создаем 10 записей с названиями шрифта
  FontComboBox.Items.Add('Arial');
  FontComboBox.Items.Add('Courier New');
  FontComboBox.Items.Add('Crystal');
  FontComboBox.Items.Add('GothicI');
  FontComboBox.Items.Add('Izhitsa');
  FontComboBox.Items.Add('MS Sans Serif');
  FontComboBox.Items.Add('Parsek');
  FontComboBox.Items.Add('Tahoma');
  FontComboBox.Items.Add('Times New Roman');
  FontComboBox.Items.Add('Verdana');
// по-умолчанию укажем MS Sans Serif
  FontComboBox.Text:='MS Sans Serif';

// создаем 10 записей с размерами шрифта
  SizeComboBox.Items.Add('7');
  SizeComboBox.Items.Add('8');
  SizeComboBox.Items.Add('9');
  SizeComboBox.Items.Add('10');
  SizeComboBox.Items.Add('11');
  SizeComboBox.Items.Add('12');
  SizeComboBox.Items.Add('13');
  SizeComboBox.Items.Add('14');
  SizeComboBox.Items.Add('16');
  SizeComboBox.Items.Add('18');
// по-умолчанию укажем 8
  SizeComboBox.Text:='8';

// по умолчанию для текста
  FontName:='5';      // шрифт MS Sans Serif
  FontSize:='1';      // размер 8
  FontColor:='10';    // цвет черный clBlack
end;
Идем дальше. Смотрим на главной форме код, ...отправка сообщения с сервера, заменяем код на следующий:

Код:
    ServerSocket.Socket.Connections[i].SendText('0'
                                                                   +FontName  // 1 байт - шрифт
                                                                   +FontSize  // 1 байт - размер
                                                                   +FontColor // 2 байта - цвет
                                                                   +'['+TimeToStr(Time)
                                                                   +']  '+NikEdit.Text
                                                                   +':  '+TextEdit.Text);
Как это теперь применить без ошибок?

Продолжение следует...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 26.08.2008 в 22:59.
Beermonza вне форума Ответить с цитированием
Старый 26.08.2008, 22:49   #55
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Модернизация до версии 2.0: Часть 2

Давайте снова заглянем на вторую форму (Form2, FontUnit). Очень удобно записывать глобальные переменные по событию OnChange списков, таковых 3, значит пишем три процедуры:

Код:
procedure TForm2.FontComboBoxChange(Sender: TObject);
begin
// узнаем текущий индекс шрифта
  FontName:=IntToStr(FontComboBox.ItemIndex);
end;

procedure TForm2.SizeComboBoxChange(Sender: TObject);
begin
// узнаем текущий индекс размера
  FontSize:=IntToStr(SizeComboBox.ItemIndex);
end;

procedure TForm2.ColorBoxChange(Sender: TObject);
begin
// узнаем текущий индекс цвета, прибавляем 10
  FontColor:=IntToStr(ColorBox.ItemIndex+10);
end;
Отправив сообщение с сервера, клиент получит нечто подобное:

5110[16:29:54] Ананим: Привет!

...последовательность 5110 - это и есть параметры шрифта, ура получилось!! ) ...только ни клиент ни сервер пока еще не умеют с ней работать. Давайте их "учить" этому.
Алгоритм разбора кода на параметры и применение к сообщению встретится в коде не раз, поэтому логично и рационально написать одну процедуру и затем вызывать ее там где необходимо. Вот как она может выглядеть:

Код:
procedure TForm1.ShowColorMassage(msg: String; index: Byte);
begin
// работаем с полем чата
  With ChatRichEdit do
    Begin
// переход на новую строку
      Lines.Add('');
// название шрифта, смотрим соответствие в списке
      SelAttributes.Name:=Form2.FontComboBox.Items.Strings[StrToInt(Copy(msg,2,1))];
// размер шрифта, смотрим соответствие в списке
      SelAttributes.Size:=StrToInt(Form2.SizeComboBox.Items.Strings[StrToInt(Copy(msg,3,1))]);
// цвет текста, смотрим соответствие в списке (не забываем про хитрость с десяткой)
      SelAttributes.Color:=Form2.ColorBox.Colors[StrToInt(Copy(msg,4,2))-10];
// условия применения стиля к тексту
      If index = 0 then SelAttributes.Style := [];        // обычный (сообщения)
      If index = 1 then SelAttributes.Style := [fsBold];  // полужирный (приват)
      If index = 2 then SelAttributes.Style := [fsItalic];  // курсив (системное)
      // стили можно комбинировать, указать их через запятую, или просто
      // оставить квадратные скобки пустыми
      // может быть 256 вариантов индекса сообщения (0 - 255), ...вольному - воля!
// добавляем текст сообщение в поле чата, только его содержательную часть
      SelText:=Copy(msg,6,Length(msg)-5);
    end;
end;
Синтаксис такой: ShowColorMassage({текст},{индекс})
Особо следует обратить внимание на текст, который передается в процедуру, ...1-й его символ это код команды, 2-й - код шрифта, 3-й - код размера, 4-й и 5-й в сумме - цвет шрифта.
Остается правильно использовать процедуру в коде, вот так:
Код:
// отобразим сообщение в ChatRichEdit
ShowColorMassage('0'
                           +FontName
                           +FontSize
                           +FontColor
                           +'['+TimeToStr(Time)
                           +']  '+NikEdit.Text
                           +':  '+TextEdit.Text, 0);
Несколько нюансов для наглядности. При отправке приватного сообщения у того кто отправил в начале строки добавляются символы "<<" , а у того кто принимает это сообщение - ">>", и индекс стиля, соответственно 1 (полужирный). Если приват для себя (бред полнейший ), то добавляются символы "||". Вот эти случаи:

Код:
// отсылаем сообщение в канал приватного пользователя
ServerSocket.Socket.Connections[i].SendText('3'
                                                               +FontName
                                                               +FontSize
                                                               +FontColor
                                                               +PrivateEdit.Text+Chr(152)
                                                               +'>> ['+TimeToStr(Time)
                                                               +']  '+NikEdit.Text
                                                               +':  '+TextEdit.Text);
Или вот:

Код:
// если выбран свой ник
If PrivateEdit.Text=NikEdit.Text then
  Begin
// отобразим сообщение в ChatRichEdit
     ShowColorMassage('3'
                               +FontName
                               +FontSize
                               +FontColor
                               +'|| ['+TimeToStr(Time)
                               +']  '+NikEdit.Text
                               +':  '+TextEdit.Text, 1);
  end;
Что касается системных сообщений, ...лучше придать им определенный стандарт.


Продолжение следует...
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.08.2008, 22:56   #56
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Модернизация до версии 2.0: Часть 3

Например такой:

Код:
// добавим в ChatRichEdit сообщение с временем подключения клиента
// сразу зададим параметры шрифта (Arial, 8, красный, курсив)
  ShowColorMassage('00119['+TimeToStr(Time)+']  Подключился клиент.', 2);
Еще масса изменений и доработок нужно выполнить, прежде чем это все заработает как нужно .
На счет смайликов, ...я вообще не сторонник этого дела, хватает и простых скобок и знаков припинания, но желающие все же оснастить чат рисуночками или просто помочь кому-то это сделать, могут разобраться с TRxRichEdit и выложить алгоритмы.

В архиве опробованная 2-я версия программы.
Вложения
Тип файла: zip BZChat 2_0.zip (22.1 Кб, 170 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 27.08.2008, 04:40   #57
IIpopoK
Пользователь Подтвердите свой е-майл
 
Аватар для IIpopoK
 
Регистрация: 03.01.2008
Сообщений: 49
Восклицание

Спасибо большое! то что нужно! просто огромное спасибо, вы мне очень помогли!
IIpopoK вне форума Ответить с цитированием
Старый 08.09.2008, 22:12   #58
GHO§T
Пользователь
 
Аватар для GHO§T
 
Регистрация: 25.04.2008
Сообщений: 14
По умолчанию

У меня проблема с процедурой ShowColorMessage;
Всё работает, но когда сообщение {клиента/сервера} высвечивается в окне сообщений, то оно отображается цветом сообщения которое было первым.
GHO§T вне форума Ответить с цитированием
Старый 10.09.2008, 22:04   #59
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ищите ошибку в заголовке приходящих/уходящих команд (сообщений).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 11.09.2008, 20:19   #60
GHO§T
Пользователь
 
Аватар для GHO§T
 
Регистрация: 25.04.2008
Сообщений: 14
По умолчанию

Спасибо, проблема уже решена =)
Прилепил на OnRead клиента и сервера черный цвет.
Код:
SelAttributes.Color:=clBlack;
ChatWnd.Lines.Add(Socket.ReceiveText());
GHO§T вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17