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

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

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

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

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

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

А, понял что ты имеешь в виду. Сервер шлет приват так:

Код:
ServerSocket.Socket.Connections[i].SendText('3'
                                            +FontName
                                            +FontSize
                                            +FontColor
                                            +PrivateEdit.Text+Chr(152)
                                            +'>> ['+TimeToStr(Time)
                                            +']  '+NikEdit.Text
                                            +':  '+TextEdit.Text);
Клиент этого не делает, ...добавь по аналогии в отправке привата с клиента вместо PrivateEdit.Text содержимое окошка с ником, ...как оно у тебя называется в клиенте. Тогда с клиента на клиент придет пакет с именем отправителя, ...вырезку уже показал в цикле.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 09.06.2011, 15:49   #652
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

та мне надо не мой ник, он выбирает ник того, кому собщение, т.е. любой кто напишет сообщение клиенту 111, то при создание страниц запишется ник не от кого пришло личное сообщение а кому оно предназначалось,
Код:
// укажем начальный символ
  pos := 6;
  // обнулим счетчик символов
  x := 0;

  // пробегаем по длине принятой строки
  For j := pos to len + 1 do
    Begin
      // записываем в счетчик сдвиг
      Inc(x);

      // если найден ключ (конец части ника в строке)
      If Copy(nettext, j, 1) = Chr(152) then
        Begin
          // сохраняем ник приватного пользователя
          niktemp := Copy(nettext, pos, x-1);

          // сброс цикла
          break;
        end;
    end;
это код кому мообщенеи предназначается,
а мне нужно от того кто прислал, на сервере это получается под командой 1, сохраняет ник в переменной
1: Begin
//запишем в массив полученный ник
TUserList(Socket.Data).Name:=Copy(t xt,2,len);
TUserList(Socket.Data).Image:=0;
// обновляем список
UpdateUserList;
end;

пробывал так на клиенте не получилось тоже
darek13 вне форума Ответить с цитированием
Старый 09.06.2011, 16:12   #653
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Так у клиента ж и так реализованная передача своего ника

Код:
procedure TForm2.SendBitBtnClick(Sender: TObject);

begin
 if TextEdit.Text<>'' then
 begin
// если сообщение для всех
      If PrivateEdit.Text='Всем' then
        Begin
// отправляем сообщение для всех
          ClientSocket2.Socket.SendText('0'
                                       +FontName
                                       +FontSize
                                       +FontColor
                                       +'['+TimeToStr(Time)
                                       +']  '+Nik
                                       +':  '+TextEdit.Text);
// отобразим сообщение в ChatRichEdit
          ShowColorMassage('0'
                           +FontName
                           +FontSize
                           +FontColor
                           +'['+TimeToStr(Time)
                           +']  '+Nik
                           +':  '+TextEdit.Text, 0);

              // очищаем TextEdit
                  TextEdit.Clear;
        end
      else
        Begin
// если выбран не свой ник
          If PrivateEdit.Text<>Nik then
            Begin
// отправляем приватное сообщение
              ClientSocket2.Socket.SendText('3'
                                           +FontName
                                           +FontSize
                                           +FontColor
                                           +PrivateEdit.Text+Chr(152)
                                           +'['+TimeToStr(Time)
                                           +']  '+Nik
                                           +':  '+TextEdit.Text);

// отобразим сообщение в ChatRichEdit что кому-то отправлено приватное сообщение
              ShowColorMassage('0'
                               +FontName
                               +FontSize
                               +FontColor
                               +'<< ['+TimeToStr(Time)
                               +']  '+Nik
                               +':  '+TextEdit.Text, 1);

              // очищаем TextEdit
              TextEdit.Clear;
            end;

        end;
    end;
end;
мне надо что бы оно считывало Nik
я только что сделал как ты говорил +PrivateEdit.Text заменить на ник отправителя я так и сдела
Код:
Begin
// если выбран не свой ник
          If PrivateEdit.Text<>Nik then
            Begin
//отсылаем приватное сообщение
              ClientSocket2.Socket.SendText('3'
                                           +FontName
                                           +FontSize
                                           +FontColor
                                           +Nik+Chr(152)
                                           +'['+TimeToStr(Time)
                                           +']  '+Nik
                                           +':  '+TextEdit.Text);
то клиент отправляет сообщение и это сообщенеи само к себе приходит, т.е. создается у себя же в кладка с твоим же ником, я если честно запуталася уже слегка, какие сможешь еще дать советы?
darek13 вне форума Ответить с цитированием
Старый 09.06.2011, 17:10   #654
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Прикол в том что огда на сервере заменил +PrivateEdit.Text+Chr(152) на +Niks+Chr(152), Niks-это ник сервера, то когда сервер отсылает ЛС клиенту, то у клиента все отлично, создается страница с именем сервера, но когда ЛС сообщение от клиента к клиенту то не помогает этот способ
darek13 вне форума Ответить с цитированием
Старый 09.06.2011, 17:30   #655
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

Привет Beermonza, слушай есть такая проблема, я ж привезал к списку пользователей popupmenu и когда сервер хочет просмотреть информацию о клиенте то он клацает на него правой кнопкой и выскакивает меню, и там выбирает кнопку "просмотреть инфу" вот процелура этой нопки

Код:
procedure TForm2.N11Click(Sender: TObject);

begin
ChatRichEdit.Lines.Add('Пользователь: ' + TUserList(SS2.Socket.Data).Name + '. Host: ' + ss2.Socket.RemoteHost + '. IP: ' +ss2.Socket.RemoteAddress);
end;
но выскакивает ошибка, как сделать так что бы узнать по нажатию на пользователя его информацию, можешь подсказать?
Изображения
Тип файла: jpg 1.jpg (31.7 Кб, 90 просмотров)
darek13 вне форума Ответить с цитированием
Старый 10.06.2011, 18:08   #657
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Так нельзя. Ты знаешь, что такое Data параметр у сокета? ...причем серверного (!) ...это pointer, т.е. указатель на область данных, с его помощью можно привязать сокет для конкретного пользователя к некому массиву данных, созданному самостоятельно.

Узнать все о клиенте можно только зная его канал. Нельзя кликая по объекту, не связанному с сокетами, узнать параметры соединения с клиентом. Вот так хотя бы укажи:

Код:
  // если список пользователей не пустой и выделена запись
  If (UserListView.Items.Count > 0) And (UserListView.SelCount > 0) then
    Begin

      // считывание номера записи
      n := UserListView.Selected.Index;
      
      // если выделен не сервер
      If n > 0 then
        Begin
 
           ChatRichEdit.Lines.Add('Пользователь: ' + UserMas[n].Name
                                  + '. Host: ' + ss2.Socket.Connections[n-1].RemoteHost
                                  + '. IP: ' + ss2.Socket.Connections[n-1].RemoteAddress);
        end;
    end;
...проверь, должно работать.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 10.06.2011, 20:41   #658
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

спасибо помогло ))))
значит что бы при выборе пользователя узнать его индекс необходимо
// считывание номера записи
n := UserListView.Selected.Index;
???
darek13 вне форума Ответить с цитированием
Старый 10.06.2011, 22:40   #659
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Именно в моей программе массив пользователей при каждом подключении обновляется. Список привязан к массиву, и его индексы совпадают с номером ячейки для всех пользователей. Каналы серверного сокета нумеруются от нуля, а так как в списке есть еще и сервер с номером 0, то нужно брать только пользователей, а они начинаются с индекса 1, а канал для них на 1 меньше. Берем индекс выделенной записи в списке, записываем в n, теперь имя пользователя можно узнать из массива UserMas, а номер канала будет n - 1, обращайся к нему и узнаешь всю системную информацию по соединению с клиентом.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 11.06.2011, 17:59   #660
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Beermonza
Я организовую для каждого привата отдельную вкладку, но столкунулся с такой проблемой что, когда я выбираю ник из списка пользователей и нажимаю его 2-а раза, то создается вкладка с его именем, но проблема тут в том что, когда клацаешь второй раз на тот же самый ник в списке, то он создает еще одну вкладку с таким же пользователем, мне надо сделать так что бы перед созданием вкладки осуществлялась проверка, открыт ли уже чат с таким пользователем.
Вот код без проверки, Niks - это имя сервера:
Код:
 
procedure TForm2.UserListViewDblClick(Sender: TObject);
  Var
    TabSheet: TTabSheet;
    ToolBar: TToolBar;
    Memo: TMemo;
  begin
      // если список пользователей не пустой и выделена запись
    If (UserListView.Items.Count>0) And (UserListView.SelCount>0) then
      Begin
        If UserListView.Selected.Caption<>Niks  then
                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;
      end;

 end;
Я написал эту проверку, но почему то она происходит как то каряво.
Когда есть тока только одна постоянная вкладка - "общий чат" и выбираю пользователя "юзер", и клацаю на него - то создается вкладка с ним, и на проверке когда активная вкладка "общий чат" и клацаеешь опять на этот ник "юзер", то его вкладка активируется, все замечательно, но когда выбираю другого клиента "юзер2", хоть его вкладки и нет созданой, она все равно не создается, но когда приходит ЛС от "юзер3", то создается еще одна вкладка, и их уже 3 у нас ("общий чат", "юзер", "юзер3") и между ними проверка осуществляется, я выбираю в списке пользователей "юзер3" или "юзер" и эта вкладка активной становится, но хочу написать сообщение другому клиенту - реакции ноль, не создается больше вкладка.
Будь так любезен, подскажи где у меня ошибки, а то я как не пробывал, то еще хуже становится.
Вот код:
Код:
     procedure TForm2.UserListViewDblClick(Sender: TObject);
  Var
    TabSheet: TTabSheet;
    ToolBar: TToolBar;
    Memo: TMemo;
    pc:integer;
  begin
     // если список пользователей не пустой и выделена запись
    If (UserListView.Items.Count>0) And (UserListView.SelCount>0) then
      Begin
        If UserListView.Selected.Caption<>Niks  then
           Begin
             if pagecontrol1.PageCount > 1 then
                begin
                   for pc := 0 to PageControl1.PageCount - 1 do
                      begin
                        if pagecontrol1.Pages[pc].Caption = UserListView.Selected.Caption  then
                            begin
                              PageControl1.ActivePageIndex:=pc;
                            end;
                      end;
                end
                  else
                    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 ;
          end;
      end;
  end;
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