На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Контакт лист , в TICQClient
    Ещё раз извиняюсь за беспкойство, но неподскажите как в C++ Builder реализовать контакт лист с TICQClient, если можно с кодом!
    Спасибо! :lol:
      ahmed170, контакт-лист хранится на сервере icq и высылается по запросу
      ExpandedWrap disabled
          ICQClient1->RequestContactList();// запрашиваем контакт-лист с сервера

      Как ты будешь отображать полученный список -это дело твоего вкуса: можно использовать ListView, TreeView, VirtualTreeView - последний используется, например в QIPе.
      Приведу пример для TreeView и недоделанный для VirtualTreeView(занимался около двух лет назад, но специально проверил перед тем как печатаю этот текст, пример рабочий!!). Виртуальнео деерво заполняется просто списком контактов, TreeView - типа как в QIPе.

      ExpandedWrap disabled
         // создаем струкутру для хранения информации о клиенте
        // в процессе работы приложения
         typedef struct  {
           AnsiString Nick;
           long int   c_UIN;
         } TContactInfo;
        //-----------------------------------------------------------------------------
        void __fastcall TFormMain::ICQClient1ServerLisrRecv(TObject *Sender,
              TList *SrvContactList)
        {
        unsigned short i,NameGroup;
          unsigned short idxGroup=0,idxContact=0,j=0;
          TTreeNode* Node;
         
          PVirtualNode NewNode;
          TContactInfo *ptr;       //указатель на структуру
         
          /* Заполнение структуры TreeView из сервер-листа*/
         if(SrvContactList->Count>0) {    // если лист не пуст
           do {
               UserInfo=*PUINEntry(SrvContactList->Items[j]);
               if (UserInfo.CType==U_VISIBLE_LIST) ICQClient1->VisibleList
                                                     ->Add(UserInfo.UIN); // добавляем в видимый список
               else if(UserInfo.CType==U_INVISIBLE_LIST) ICQClient1->InvisibleList->
                                                          Add(UserInfo.UIN);
               j++;
              } while (UserInfo.CGroupID==0);
         
           UserInfo=*PUINEntry(SrvContactList->Items[j-1]);
           NameGroup=UserInfo.CGroupID;
           TreeView1->Items->Add(NULL,UserInfo.Nick);  
         
         
            for(i=j;i<=SrvContactList->Count-1;i++) {
               UserInfo=*PUINEntry(SrvContactList->Items[i]); // получаем указатель на структуру
                 if(UserInfo.CGroupID!=NameGroup)
                  { // так как первой следует название группы
         
                     TreeView1->Items->Add(TreeView1->Selected,UserInfo.Nick);
                     Node->ImageIndex=8; // отдельная картинка
                     Node->SelectedIndex=8;
                     NameGroup=UserInfo.CGroupID;
                     idxGroup=idxContact+1;
                     idxContact++;
                TV_ITEM tvItem;
                tvItem.hItem = Node->ItemId;
                tvItem.mask = TVIF_STATE;
                tvItem.state = TVIS_BOLD;
                tvItem.stateMask = TVIS_BOLD;
                SendMessage(TreeView1->Handle, TVM_SETITEM, 0, (LPARAM)&tvItem);
                  }
                  else {
                            ICQClient1->AddContact(UserInfo.UIN); // добавляем контакт в лист!!!!!
                                                                  // без этого нет возможности получать статус
                   ptr=new TContactInfo;
                   ptr->Nick=UserInfo.Nick; //      сохраняем в ветви
                   ptr->c_UIN=UserInfo.UIN;   //                данные о контакте
                   Node=TreeView1->Items->Item[idxGroup];
                   TreeView1->Items->AddChildObject(Node,UserInfo.Nick,ptr);
                   idxContact++;
         
                  }
         
                 NewNode=VT->AddChild(NULL,NULL);
                 ptr=(TContactInfo*)VT->GetNodeData(NewNode);
                 ptr->Nick=UserInfo.Nick;
            }
          }
            ICQClient1->DestroyUINList(SrvContactList);
        }

      Надеюсь поможет :-)
      Сообщение отредактировано: AntiAspirant -
        Но у меня выдаёт компилятор след. ошибки
        ExpandedWrap disabled
          [C++ Error] Unit1.cpp(53): E2451 Undefined symbol 'PVirtualNode'
          [C++ Error] Unit1.cpp(53): E2379 Statement missing ;
          [C++ Error] Unit1.cpp(57): E2451 Undefined symbol 'SrvContactList'
          [C++ Error] Unit1.cpp(59): E2451 Undefined symbol 'UserInfo'
          [C++ Error] Unit1.cpp(102): E2451 Undefined symbol 'NewNode'
          [C++ Error] Unit1.cpp(102): E2451 Undefined symbol 'VT'
          [C++ Warning] Unit1.cpp(111): W8004 'idxGroup' is assigned a value that is never used

        Почему?
          Цитата ahmed170 @
          [C++ Error] Unit1.cpp(53): E2379 Statement missing ;
          точку с запятой забыл.
          Цитата ahmed170 @
          [C++ Warning] Unit1.cpp(111): W8004 'idxGroup' is assigned a value that is never used
          присвоил значение и не используешь дальше переменную.

          Добавлено
          Остальное - неизвестные символы. Проверь правильность своего кода, может опечатался где-нибудь.

          Добавлено
          Проверь, наверное хидеры надо подключить какие-нибудь.
            Цитата ben1992 @
            Цитата ahmed170 @
            [C++ Error] Unit1.cpp(53): E2379 Statement missing ;
            точку с запятой забыл.
            Цитата ahmed170 @
            [C++ Warning] Unit1.cpp(111): W8004 'idxGroup' is assigned a value that is never used
            присвоил значение и не используешь дальше переменную.

            Добавлено
            Остальное - неизвестные символы. Проверь правильность своего кода, может опечатался где-нибудь.

            Добавлено
            Проверь, наверное хидеры надо подключить какие-нибудь.

            Прочтите второй топик я попытался скомпилировать тот код и он выдал такие ошибки может подскажите, что делать?
            P.S. точка с запятой там есть! :wall:
              Цитата ahmed170 @
              Прочтите второй топик я попытался скомпилировать тот код
              я прочитал, можете не беспокоится ;) .


              PVirtualNode NewNode; Ошибка, потому что этот класс нигде не описан.

              SrvContactList. Ошибка, судя по свойству items[i] - это ListBox так обозван.

              Добавлено
              А вообще, выложи исходник свой. Так будет прощее править, а то гадать где что описано, неописано, как-то невкусно :) .
                Я написал пример как для VirtualTreeView так и для TreeView, первый компонент в стандартную поставку С++ Builder не входит, поэтому можешь комментировать строки относящиеся к нему, если не нужны тебе( строки содержащие VT и PVirtualNode). Объявление для UserInfo
                ExpandedWrap disabled
                  TUINEntry UserInfo;

                SrvContactList передается параметром события класса TICQClient,проверь назанчил ли в Инспекторе Объектов его.
                Да и вообще не ленись просматривать исходные тексты компонентов, найдешь ответы на свои многие вопросы :-)
                Сообщение отредактировано: AntiAspirant -
                  Спасибо! Ошибки больше нет, но список контактов не загружается хотя я подозреваю почему просто я видимо не правильно вхожу в сеть, не подскажите как правильно! :rolleyes:
                    ahmed170 , какой версией компонента пользуешься??
                    Я использовал 1.21, правда когда то было обновление протокола и происходил отказ сервера при попытке залогиниться. Пришлось изменять исходник ( где то описывалось в инете).

                    Процесс подключения происходит следующим образом:
                    ExpandedWrap disabled
                      void __fastcall TFormMain::btnConnectClick(TObject *Sender)
                      {  /* по клику на кнопку "Подключиться" */
                       
                        if((eNumber->Text=="") || (eParole->Text=="") ||
                             Icqworks::StrToInt(eNumber->Text)<10000)
                        {
                         MessageBox(Handle,"Пожалуйста введите верно UIN и Пароль",
                          "Невозможно подключиться!", MB_ICONWARNING);
                         return;
                        }
                       // Настройки
                        ICQClient1->UIN= Icqworks::StrToInt(eNumber->Text);
                        ICQClient1->Password=eParole->Text;
                       
                      // логинимся
                        ICQClient1->Login(L_S_NA ,false);
                        //ICQClient1->RequestContactList();// запрашиваем контакт-лист с сервера
                        btnDisconnect->Enabled=true;
                        btnConnect->Enabled=false;
                      //---------------
                      // Событие компонента, когда логинимся
                      void __fastcall TFormMain::ICQClient1Login(TObject *Sender)
                      {  /* при получении доступа, то есть когда залогинились */
                       
                        ICQClient1->RequestOfflineMessages(); // запрашиваем сообщения, полученные
                                                              //  при офлайне
                        ICQClient1->RequestContactList();// запрашиваем контакт-лист с сервера
                        Label1->Visible=true;
                        btnConnect->Enabled=true;
                        btnSendMsg->Enabled=true;
                      }
                      //---------------------------------------------------------------------------
                      void __fastcall TFormMain::ICQClient1Error(TObject *Sender, TErrorType ErrorType,
                            AnsiString ErrorMsg)
                      { /* при возникновении ошибки  */
                       
                        // предупреждение
                        if(ErrorType==ERR_WARNING) Icqworks::ShowMessage("Предупреждение:"+
                                                                        ErrorMsg);
                         // критическая ошибка
                        else {
                                 Icqworks::ShowMessage("Ошибка:"+ErrorMsg);
                                 btnConnect->Enabled=true;
                                 btnDisconnect->Enabled=false;
                             }
                        return;
                      }
                        }

                    Ну вот как то так ;)
                      СПАСИБО, а как получить текст полученного сообщения, т.е. например вывести его текст на какотой компонент (вроде TRichEdit1, или есть какойто компонент, как в QIP, чтобы бы в нём можно было использывать смайлы, чтобы какой-то конкретный участок текста был синим ( т.е. например ваши сообщения), а другой красным, а остольной текст чёрным)?
                        В QIP используется компонент TRichView для отображения истории сообщений. Я с ним не работал.
                        Получить и отобразить текст входящего сообщения можно к примеру так:
                        ExpandedWrap disabled
                          #include <mmsystem.h>
                          void __fastcall TFormMain::ICQClient1MessageRecv(TObject *Sender,
                                AnsiString Msg, AnsiString UIN)
                          {   /* Получение сообщений*/
                           
                          // принятое  сообщение
                             PlaySound("Sounds/sndMsg.wav",0,SND_ASYNC); //сигнализируем о получении
                             Memo2->Lines->Add(UIN);
                             Memo2->Lines->Add("");
                             Memo2->Lines->Add(Msg);
                             Memo2->Lines->Add("----------------------------------------------------------");
                          }

                        Остальное дело вкуса и возможностей интерфейсных решений.
                          Ещё раз спасибо, совсем разобрался, только контакт лист всё равно не грузиться и я не знаю как делать вкладки с пользователями в Окне сообщений, как в QIP. Т.Е. чтобы не было всё водном Memo, а в зависимоти от вкладки там был бы текст диалога с этим человеком :lol: :D :P
                            ahmed170, какую версию компонента используешь,что не грузится контакт-лист??
                            P.S.Вкладки делаются элементарно при использовании компонента PageControl с закладки Win32.
                              TICQClient_v1.34 :(
                                Почему при компилации кода:
                                ExpandedWrap disabled
                                  Form1->ICQClient1->SendMessageA(486931428,Edit1->Text);

                                Билдер выдаёт ошибку:
                                ExpandedWrap disabled
                                  [Linker Error] Unresolved external '__fastcall Icqclient::TICQClient::SendMessageA(unsigned int, const System::AnsiString)' referenced from D:\AHMEDSOFTWARE\MY_ICQ\UNIT4.OBJ
                                :angry:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0619 ]   [ 16 queries used ]   [ Generated: 20.05.24, 04:01 GMT ]