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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2009, 17:21   #171
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

В исходной программе применен составной ключ команд, первый байт указывает на тип команды, дальше 4 байта - параметры шрифта, дальше данные сообщения, ...удалите байты шрифта, но переработав все коды где выполняется сканирование ключа. Очевидно вы пропустили один обработчик, он ищет число в ключе, но там его нет, натыкается на символ "[" и не может применить его как число, ...смотрите процедуру ShowColorMassage.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.05.2009, 21:26   #172
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Подозрения падают на эту строчку
Код:
ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
Боюсь без вашей помощи в коде не разобраться. Тяжело такие операции с чужими проектами проделывать.

Последний раз редактировалось Shouldercannon; 25.05.2009 в 21:41.
Shouldercannon вне форума Ответить с цитированием
Старый 25.05.2009, 23:03   #173
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Будем учиться разбирать чужие коды. ShowColorMassage - процедура рукописная, я ее сам написал, ...идем дальше, смотрим ее код:
Код:
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;
Сам объект отображения текста (поле чата) - это ChatRichEdit. Работаем с объектом. Lines.Add(''); - просто добавляет пустую строку, попросту делает отступ от предыдущих сообщений, иначе все пойдет слитно. Дальше идет обработка ключа, и последней строкой вывод текста через SelText:=Copy(msg,6,Length(msg)-5);
Фактически, чтобы от всего избавиться, нужно просто вместо вызова процедуры ShowColorMassage(); написать вот эти две строчки:
Код:
ChatRichEdit.Lines.Add('');
ChatRichEdit.SelText := {тут переменная типа string};
В оригинале пришедший текст хранится в переменной text, легко видеть это в процедуре ServerTimerTimer и ClientSocketRead.
Чтобы не показывать ключ команды, достаточно скопировать пакет со второго байта и до конца пакета, вот так:
Код:
ChatRichEdit.Lines.Add('');
ChatRichEdit.SelText := Copy(text,2,Length(text)-1);
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.05.2009, 16:12   #174
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

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

Последний раз редактировалось Shouldercannon; 26.05.2009 в 16:30.
Shouldercannon вне форума Ответить с цитированием
Старый 26.05.2009, 20:06   #175
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Да, первая цифра - номер команды, 0 - команда "сообщение". FontName, FontSize, FontColor не нужны.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.05.2009, 20:14   #176
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Код:
ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(PrivateUser),len-Length(PrivateUser)-1), 1);
Код:
ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
хочу узнать что в этих строках отлавливается с 1 по 5
Код:
text,1,5
и
Код:
text,7
Shouldercannon вне форума Ответить с цитированием
Старый 27.05.2009, 00:33   #177
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

С 1 по 5 символы в пакете text это, соответственно, ключ команды (1 байт) и данные шрифта (4 байта), всего 5 байт. Для чего нужно вообще такую сложность писать:
Код:
ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
Давайте вспомним как создается пакет на приватное сообщение, допустим с клиента. Вот он:
Код:
ClientSocket.Socket.SendText('3'
                                           +FontName
                                           +FontSize
                                           +FontColor
                                           +PrivateEdit.Text+Chr(152)
                                           +'>> ['+TimeToStr(Time)
                                           +']  '+NikEdit.Text
                                           +':  '+TextEdit.Text);
Число 3 отвечает за приват, FontName - имя шрифта, число, 1 байт, FontSize - размер шрифта, число, 1 байт, FontColor - цвет шрифта, число, 2 байта, ...дальше идет имя приватного получателя, т.е. кому идет приват, и символ конца имени (это нужно, чтобы брать точно имя из пакета), и следом содержимое пакета со всевозможными вспомогательными знаками.
Смотрим снова запись:
Код:
ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
ShowColorMassage требует полный ключ, это 5 байт, ...пожалуйста, вот он Copy(text,1,5). Дальше, в пакете идет имя приватного получателя, это ваш ник, другой клиент или сервер ввел ваше имя через список, и вам не нужно видеть свое имя в сообщении привата, поскольку сообщение вам уже доставлено безошибочно, поэтому мы начинаем копировать пакет с длины равной длине вашего клиентского имени плюс знак разделения, и того Copy(text, 7+Length(NikEdit.Text), len-Length(NikEdit.Text)-1). len - полная длина пакета. А суммированием двух операций Copy, мы слепляем новую сточку без ненужных данных.
Аналогично и для сервера:
Код:
ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(PrivateUser),len-Length(PrivateUser)-1), 1);
PrivateUser - переменная, хранит имя пользователя, отправившего приват.
Подумайте, с какого символа начинать копировать, если 4-х байт в ключе у вас не будет.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 27.05.2009 в 00:39.
Beermonza вне форума Ответить с цитированием
Старый 27.05.2009, 17:42   #178
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Будет так
Код:
ShowColorMassage(Copy(text,1,1)+Copy(text,3+Length(PrivateUser),len-Length(PrivateUser)-1), 1);
Shouldercannon вне форума Ответить с цитированием
Старый 28.05.2009, 17:15   #179
Vii
Новичок
Джуниор
 
Регистрация: 28.05.2009
Сообщений: 2
По умолчанию

Приветствую всех. Дело вот в чем- требуется сделать систему обмена мгновенными сообщениями. Причем должен быть отдельно сервер и отдельно клиент (аналог ICQ, только упрощенный конечно, нет всяких фич- только обмен сообщениями между онлайн клиентами). Просмотрел сделанный товарищем Beermonza чат- не понятно мне что нужно отдельно для сервера?
Vii вне форума Ответить с цитированием
Старый 28.05.2009, 21:24   #180
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

У серверного приложения удалите ClientSocket и все коды связанные с ним, у клиентского - наоборот ServerSocket.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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