Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.144.170] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Ещё раз извиняюсь за беспкойство, но неподскажите как в C++ Builder реализовать контакт лист с TICQClient, если можно с кодом!
Спасибо! |
Сообщ.
#2
,
|
|
|
ahmed170, контакт-лист хранится на сервере icq и высылается по запросу
ICQClient1->RequestContactList();// запрашиваем контакт-лист с сервера Как ты будешь отображать полученный список -это дело твоего вкуса: можно использовать ListView, TreeView, VirtualTreeView - последний используется, например в QIPе. Приведу пример для TreeView и недоделанный для VirtualTreeView(занимался около двух лет назад, но специально проверил перед тем как печатаю этот текст, пример рабочий!!). Виртуальнео деерво заполняется просто списком контактов, TreeView - типа как в QIPе. // создаем струкутру для хранения информации о клиенте // в процессе работы приложения 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); } Надеюсь поможет :-) |
Сообщ.
#3
,
|
|
|
Но у меня выдаёт компилятор след. ошибки
[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 Почему? |
Сообщ.
#4
,
|
|
|
Цитата 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 Добавлено Остальное - неизвестные символы. Проверь правильность своего кода, может опечатался где-нибудь. Добавлено Проверь, наверное хидеры надо подключить какие-нибудь. |
Сообщ.
#5
,
|
|
|
Цитата 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. точка с запятой там есть! |
Сообщ.
#6
,
|
|
|
Цитата ahmed170 @ я прочитал, можете не беспокоится . Прочтите второй топик я попытался скомпилировать тот код PVirtualNode NewNode; Ошибка, потому что этот класс нигде не описан. SrvContactList. Ошибка, судя по свойству items[i] - это ListBox так обозван. Добавлено А вообще, выложи исходник свой. Так будет прощее править, а то гадать где что описано, неописано, как-то невкусно . |
Сообщ.
#7
,
|
|
|
Я написал пример как для VirtualTreeView так и для TreeView, первый компонент в стандартную поставку С++ Builder не входит, поэтому можешь комментировать строки относящиеся к нему, если не нужны тебе( строки содержащие VT и PVirtualNode). Объявление для UserInfo
TUINEntry UserInfo; SrvContactList передается параметром события класса TICQClient,проверь назанчил ли в Инспекторе Объектов его. Да и вообще не ленись просматривать исходные тексты компонентов, найдешь ответы на свои многие вопросы :-) |
Сообщ.
#8
,
|
|
|
Спасибо! Ошибки больше нет, но список контактов не загружается хотя я подозреваю почему просто я видимо не правильно вхожу в сеть, не подскажите как правильно!
|
Сообщ.
#9
,
|
|
|
ahmed170 , какой версией компонента пользуешься??
Я использовал 1.21, правда когда то было обновление протокола и происходил отказ сервера при попытке залогиниться. Пришлось изменять исходник ( где то описывалось в инете). Процесс подключения происходит следующим образом: 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; } } Ну вот как то так |
Сообщ.
#10
,
|
|
|
СПАСИБО, а как получить текст полученного сообщения, т.е. например вывести его текст на какотой компонент (вроде TRichEdit1, или есть какойто компонент, как в QIP, чтобы бы в нём можно было использывать смайлы, чтобы какой-то конкретный участок текста был синим ( т.е. например ваши сообщения), а другой красным, а остольной текст чёрным)?
|
Сообщ.
#11
,
|
|
|
В QIP используется компонент TRichView для отображения истории сообщений. Я с ним не работал.
Получить и отобразить текст входящего сообщения можно к примеру так: #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("----------------------------------------------------------"); } Остальное дело вкуса и возможностей интерфейсных решений. |
Сообщ.
#12
,
|
|
|
Ещё раз спасибо, совсем разобрался, только контакт лист всё равно не грузиться и я не знаю как делать вкладки с пользователями в Окне сообщений, как в QIP. Т.Е. чтобы не было всё водном Memo, а в зависимоти от вкладки там был бы текст диалога с этим человеком
|
Сообщ.
#13
,
|
|
|
ahmed170, какую версию компонента используешь,что не грузится контакт-лист??
P.S.Вкладки делаются элементарно при использовании компонента PageControl с закладки Win32. |
Сообщ.
#14
,
|
|
|
TICQClient_v1.34
|
Сообщ.
#15
,
|
|
|
Почему при компилации кода:
Form1->ICQClient1->SendMessageA(486931428,Edit1->Text); Билдер выдаёт ошибку: [Linker Error] Unresolved external '__fastcall Icqclient::TICQClient::SendMessageA(unsigned int, const System::AnsiString)' referenced from D:\AHMEDSOFTWARE\MY_ICQ\UNIT4.OBJ |