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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2011, 18:50   #661
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

И еще такой вопрос, когда я отссылаю личное сообщение с сервера на клиент, то оно хоть и отсылается в приватный канал, но не отображается в динамическом Memo, можешь тоже глянуть код:
Код:
  procedure TForm2.SendBitBtnClick(Sender: TObject);
    var
      i:integer;
      TabSheet: TTabSheet;
      Memo:TMemo;

  begin
        // Если активная вкладка "Общий чат", то сообщение для всех
      if   pagecontrol1.TabIndex=0
          then
            // Отправляем сообщение всем пользователям
              For i:=0 to SS2.Socket.ActiveConnections-1 do
                  Begin
                      SS2.Socket.Connections[i].SendText('0'+FontName  // 1 байт - шрифт
                                                            +FontSize  // 1 байт - размер
                                                            +FontColor // 2 байта - цвет
                                                            +'['+TimeToStr(Time)
                                                            +']  '+Niks
                                                            +':  '+TextEdit.Text);
                 //end;
            // отображаем отправленное сообщение в ChatRichEdit
              ShowColorMassage('0'
                           +FontName
                           +FontSize
                           +FontColor
                           +'['+TimeToStr(Time)
                           +']  '+Niks
                           +':  '+TextEdit.Text, 0);
              TextEdit.Clear;
        end
            else
                 Begin
                    // создаем цикл перебора приватного пользователя
                    For i:=0 to SS2.Socket.ActiveConnections-1 do
                    Begin
                      // если пользователь найден и его ник соотвествут открытой страницы
                     If TUserList(SS2.Socket.Connections[i].Data).Name = pagecontrol1.ActivePage.Caption then
                      Begin
                        // отсылаем сообщение в канал приватного пользователя
                        SS2.Socket.Connections[i].SendText('3'
                                                            +Niks+Chr(152)
                                                            +'>> ['+TimeToStr(Time)
                                                            +']  '+Niks
                                                            +':  '+TextEdit.Text);
                        // отобразим сообщение в Memo
                        Memo.Lines.Add('<< ['+TimeToStr(Time)
                                              +']  '+Niks
                                              +':  '+TextEdit.Text);
                                    // сбрасываем цикл
                                            break;
                                        end;
                                end;
                        end;
           end;
выскакивает ошибка, рисунок ниже, и выделяет синим строку:
Код:
     Memo.Lines.Add('<< ['+TimeToStr(Time)+']  '+Niks+':  '+TextEdit.Text);
Но когда приходит ЛС от клиента то сообщение отображается в Мемо

Вот если надо, сам код создания динамической страницы с мемо:
Код:
 
Var
    TabSheet: TTabSheet;
    ToolBar: TToolBar;
    Memo: TMemo;
     begin
                     TabSheet := TTabSheet.Create(Self);
                     TabSheet.Caption := UserListView.Selected.Caption;
                     TabSheet.PageControl := PageControl1;
                     TabSheet.Show;
                     Memo:= TMemo.Create(Self);
                     Memo.Parent := TabSheet;
                     Memo.Align := alClient;
                     Memo.ReadOnly:=true;
                     Memo.ScrollBars := ssVertical;
                     ToolBar := TToolBar.Create(Self);
                     ToolBar.Parent := TabSheet;
                     ToolBar.Align := alTop;
                     TabSheet.ImageIndex:=0;
      end;
Изображения
Тип файла: jpg Безымянный.jpg (30.4 Кб, 98 просмотров)

Последний раз редактировалось darek13; 11.06.2011 в 18:56. Причина: добавил картинку с ошибкой
darek13 вне форума Ответить с цитированием
Старый 11.06.2011, 23:39   #662
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Это ты пока на сервере организовываешь вкладки, как я понял. Так у тебя есть массив UserMas, добавляй в тип TUserList еще одну запись, пусть это будет Page: Boolean; - "по умолчанию" у каждого пользователя она False, при клике в списке, перед непосредственным кодом создания вкладки бери индекс записи, записывай в n, проверяй ячейку массива и эту запись: если UserMas[n].Page = False, то можно создавать вкладку и в конце пометить UserMas[n].Page := True, иначе - вкладка не нужна.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.06.2011, 00:00   #663
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

У меня нет массива UserMas и таймера ж нет, у меня за массив пользователей отвечает
Код:
TUserList(Socket.Data).Name:=Copy(txt,2,len);
у меня ж все в обработчике ServerSocketClientRead
darek13 вне форума Ответить с цитированием
Старый 12.06.2011, 14:48   #664
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от darek13 Посмотреть сообщение
У меня нет массива UserMas и таймера ж нет, у меня за массив пользователей отвечает TUserList
Ох как зря! ...UserMas - структура хранения данных, целостная, в нее можно добавлять любые данные и системные флаги, как например для отслеживания вкладок, ...а теперь что? ...ты не знаешь как с помощью ущербного списка выполнить те или иные проверки. Верни назад UserMas, его нельзя удалять.

У клиента тоже нужен подобный массив, для хранения всех настроек хозяина приложения для конкретного пользователя.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.06.2011, 15:29   #665
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Та у меня уже все отлично работает , и страницы создаются и переключаются, тока осталась одна единственная проблема, это клиент получает коряво сообщения, как то я не правильно собрал сообщение, на сервере, или на клиенте не правильно описал получение, идет сначала часть ника, потом время, потом от кого, а уж потом тока сообщение, так вот я понял что роль играет, еще , какой ник на сервере и на клиенте, тока до конца понять не могу, что там не так. И подскажи пожалуйста, как закрыть тему, если проблема в ней разрешенная, просто написать там что все уже реализовано?
darek13 вне форума Ответить с цитированием
Старый 12.06.2011, 17:17   #666
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от darek13 Посмотреть сообщение
осталась одна единственная проблема, это клиент получает коряво сообщения, как то я не правильно собрал сообщение, на сервере, или на клиенте не правильно описал получение, идет сначала часть ника, потом время, потом от кого, а уж потом тока сообщение, так вот я понял что роль играет, еще , какой ник на сервере и на клиенте, тока до конца понять не могу, что там не так.
В пакете привата после системного ника есть байт конца, ищи его, он будет указателем на начало содержимого сообщения:

Код:
  // отсылаем сообщение в канал приватного пользователя
  SS2.Socket.Connections[i].SendText('3'
                                     + Niks + Chr(152)
                                     + '>> [' + TimeToStr(Time)
                                     + ']  ' + Niks
                                     + ':  ' + TextEdit.Text);
Цитата:
Сообщение от darek13 Посмотреть сообщение
И подскажи пожалуйста, как закрыть тему, если проблема в ней разрешенная, просто написать там что все уже реализовано?
Пишешь: "Помощь больше не нужна, всем спасибо." Закрывает темы только администратор и модераторы по особым причинам.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.06.2011, 05:45   #667
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
Восклицание

Beermonza
Я так и делал, но все же бред какой-то, проблемы тока у клиента, когда клиент отправляет другому клиенту сообщение, то у получателя почему то создается вместо одной сразу 2, одна с нормлаьным названием (т.е. считывает нормально ник и присваивает его к старницу), а друга страница создается с корявым названием, часть ника и время, иногда и часть сообщение может тоже быть, но когда отсылаешь но когда отсылаешь еще сообщения, то сообщение записывается в нормальную страницу (где нормальный ник, без лишнего текста), а друга вкладка просто существует и там текст даже не отображается. А когда сообщение приходи с сервера, то вкладка 1 создается и все отлично, но что когда сервер отсылает сообщение или какой то клиент, то у получателя (клиента) текс отображется не так как надо.
Вот выложу код, можешь глянуть может найдешь где то ошибку.
Исходник сервера на событие SS2ClientRead, на отправку сообщения в привтный канал, когда ЛС не серверу
Код:
Begin
// создаем цикл перебора пользователей
                         For b:=0 to SS2.Socket.ActiveConnections-1 do
                           Begin
// если пользователь найден
                             If TUserList(SS2.Socket.Connections[b].Data).Name=PrivateUser then
                               Begin
// отсылаем сообщение в канал приватного пользователя
                     SS2.Socket.Connections[b].SendText('3'
                                                           +TUserList(Socket.Data).Name+Chr(152)
                                                           +'['+TimeToStr(Time)
                                                           +']  '+TUserList(Socket.Data).Name
                                                            +':  '+Copy(txt,6,Length(txt)-5));
                          // сбрасываем цикл
                                 break;
end;
end;
end;
Вот код, для отправки ЛС сна сервере
Код:
// отсылаем сообщение в канал приватного пользователя
                    SS2.Socket.Connections[i].SendText('3'
                                                      +Niks+Chr(152)
                                                      +'>> ['+TimeToStr(Time)
                                                      +']  '+Niks
                                                      +':  '+TextEdit.Text);
Вот если что исходники, малоли надо будет
Вложения
Тип файла: rar Copy.rar (830.4 Кб, 40 просмотров)

Последний раз редактировалось darek13; 13.06.2011 в 11:54.
darek13 вне форума Ответить с цитированием
Старый 13.06.2011, 05:47   #668
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Вот коды Клиента на процедуру ClientSocket2Read

Код:
// создадим страницу добавим в Memo приватное сообщение с сервера
    3: begin
     // укажем начальный символ
          poss := 2;
          // обнулим счетчик символов
          x := 0;
          // пробегаем по длине ринятой строки
          For j:=poss to len + 1 do
          Begin
          // записываем в счетчик сдвиг
            Inc(x);
            // если найден ключ (конец части ника в строке)
            If Copy(txt, j, 1) = Chr(152) then
              Begin
          // сохраняем ник приватного пользователя
          niktemp := Copy(txt, poss, x-1);
                // -- сперва проверяем есть ли такой уже tabsheet сравнивая Caption и niktemp
                // -- разрешаем на пока создание вкладки, если что
                bCreateTabSheet := true;
                if PageControl1.PageCount > 0 then
                  begin
                    for iCount := 0 to PageControl1.PageCount-1 do
                      begin
                        if PageControl1.Pages[iCount].Caption = niktemp then
                          begin
                            // -- есть уже закладка с таким ником, значит флаг создания закладки bCreateTabSheet ставим
                            // -- false и выходим из фора, при этом в iCount будет находится индекс этой закладки
                            bCreateTabSheet := false;
                            Break;
                          end;
                      end;
                  end;
                // -- итак, если надо создавать вкладку, то сосздаем, а если нет - активируем уже
                // -- существую вкладку
                if bCreateTabSheet then
                  begin
                    TabSheet := TTabSheet.Create(Self);
                    TabSheet.Caption := niktemp;
                    TabSheet.PageControl := PageControl1;
                    Memo:= TMemo.Create(TabSheet);  // -- <<<< В скобках надо указывать владельца компонента, в данном случае это TabSheet
                    Memo.Parent := TabSheet;
                    Memo.Align := alClient;
                    Memo.ReadOnly:=true;
                    Memo.ScrollBars := ssVertical;
                    ToolBar := TToolBar.Create(TabSheet);  // -- <<<< В скобках надо указывать владельца компонента, в данном случае это TabSheet
                    ToolBar.Parent := TabSheet;
                    ToolBar.Align := alTop;
                    TabSheet.ImageIndex:=0;
                    // -- вставляем сообщение
                    Memo.Lines.Add(Copy(txt, 7+Length(Nik), len-Length(Nik)-1));
                  end
                  else
                    begin
                      // -- Переключаемся на вкладку номер которой лежит в iCount
                       PageControl1.Pages[iCount].ImageIndex:=8;
                      // -- Если найденый TabSheet владеет хоть какими-то компонентами, то среди них надо найти Memo и вставить туда сообщение
                      if PageControl1.Pages[iCount].ComponentCount > 0 then
                        begin
                          for iCompCount := 0 to PageControl1.Pages[iCount].ComponentCount-1 do
                            begin
                              // -- Если этот контрол есть TMemo....
                              if (PageControl1.Pages[iCount].Components[iCompCount] is TMemo) then
                                begin
                                  // -- ...вставляем сообщение
                                  (PageControl1.Pages[iCount].Components[iCompCount] as TMemo).Lines.Add(Copy(txt, 7+Length(Nik), len-Length(Nik)-1));
                                end;
                            end;
                        end;
                    end;
              end;
          end;
       end;
А вот код, отправки сообщений с клиента (кгда клиент отсылает серверу сообщене приват, то никаких лагов нет)
Код:
  Begin
              // отправляем приватное сообщение
              ClientSocket2.Socket.SendText('3'
                                           +pagecontrol1.ActivePage.Caption+Chr(152)
                                           +'>> ['+TimeToStr(Time)
                                           +']  '+Nik
                                           +':  '+TextEdit.Text);
    end;
тут pagecontrol1.ActivePage.Caption выступает в роли ника, кому сообщение предназначается. Будь так любезен, подскажи чем сможешь!
darek13 вне форума Ответить с цитированием
Старый 13.06.2011, 15:52   #669
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Beermonza, подскажи пжл еще такую вещь, у меня шифруются сообщения, и расшифровывается все отлично, вот есть переменная tmpstr типа string, т.е. я перед тем как отобразить сообщение его считываю и разшифровываю вот этот кусок кода, и это тока для личных сообщений
Код:
var
    strtmp, tmpstr:string;
    nomd,xz:integer;

  begin
      // получаем текс, номер команды и длину строки
  txt:=Socket.ReceiveText();
  com:=StrToInt(Copy(txt,1,1));
  len:=Length(txt)-1;

  // вынимаем зашифрованный текс
  nomd:=1;
   xz:=0;
      while ((not((txt[nomd]=':')and(xz=6)))and(nomd<=len)) do begin
      if (txt[nomd+1]=':') then inc(xz);
      inc(nomd);

    end;
if (nomd<=len)    then
begin
inc(nomd);
  strtmp:=trim(Copy(txt,nomd,len-nomd+2));
  showmessage(strtmp);  //показывает зашифрованное ЛС
  tmpstr:=DecodeBase64(strtmp);
  showmessage(tmpstr); //показывает разшифрованное ЛС
  end;
тут проблем вообще нет, все правильно оно отображае.
Проблема в том что как втулить разшифрованное сообщение в отображаемый текс МЕМО, я как не пытался у меня получалось тока 3 варианта, и все неправильные:
1) либо вообще ничего не отображается, пустая строка (без времени, без ника и самого сообщения);
2) либо отображается зашифрованное сообщение а после него сразу разшифрованное
3) все равно отображается зашифрованнное сообщение

Вот код отображаения сообщения в поле МЕМО
Код:
Memo.Lines.Add(Copy(txt, 7+Length(Nik), len-Length(Nik)-1));
darek13 вне форума Ответить с цитированием
Старый 13.06.2011, 16:19   #670
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Все на счет шифрования я разобрался все хорошо, осталось ток апроблема с отображением текста(убрать лишнее), вот тут я никак не могу разобратся (((
darek13 вне форума Ответить с цитированием
Ответ


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