![]() |
Leidiges Thema: Status der Kontakte mit TICQClient
Hallo,
ja ich weiss dieses Thema gab es schon desöfteren und ich habe die Suche auch benutzt, viel gefunden, aber keiner der schon vorhandenen "Wie krieg ich den Status der Kontakte raus"-Threads konnte mir die richtige Lösung liefern. Das ist bisher alles nur eher so ein Drumherum-Gerede. Mein eigener ICQ-Client sieht schon ganz gut aus, man kann sich verbinden und die Kontakte werden auch alle fein in eine ListBox geschrieben. Allerdings im Moment halt noch ALLE, ich möchte sie aber getrennt haben, zumindest zwischen Offline und dem Rest wie Online, Away, etc. Nun soll es verschiedene Lösungsansätze geben und ich hoffe es gibt noch jemanden unter euch, der vielleicht gerade einen Messenger mit dieser Komponente schreibt. Im Moment rufe ich die Kontaktliste noch wie folgt ab:
Delphi-Quellcode:
So kommen dann ALLE Kontakte in die ListBox, ob die nun offline oder online sind. Jetzt hatte ich schon desöfteren gelesen, ich könnte die User mittels des OnStatusChange-Events unterscheiden, deshalb habe ich folgendes versucht:
procedure Tmain.icqServerListRecv(Sender: TObject; SrvContactList: TList);
var i: Word; UserInfo: TUINEntry; begin if SrvContactList.Count > 0 then for i := 0 to SrvContactList.Count - 1 do begin UserInfo := PUINEntry(SrvContactList.Items[i])^; kontaktliste.AddItem(UserInfo.Nick, Self); end; icq.DestroyUINList(SrvContactList); end;
Delphi-Quellcode:
So auf diese Weise HÄTTE ich zwar die Kontakte die grad online gehen, allerdings erstmal nur als UIN, da krieg ich die Nicknamen irgendwie nicht raus. Noch viel merkwürdiger ist aber die Tatsache, dass dann jeder Online-User ZWEIMAL, also doppelt eingetragen wird in die ListBox. Das ist mir völlig unverständlich. Das AddItem der oberen Version habe ich natürlich raus dann, nicht dass ihr denkt ich würde zweimal AddItem verwenden. Das versteh ich also überhaupt nicht.
procedure Tmain.icqStatusChange(Sender: TObject; UIN: String;
Status: Cardinal); begin kontaktliste.AddItem(UIN, Self); end; Das ist ein echter Knackpunkt im Moment und es hält mich total auf, aber ich will es irgendwie fertig kriegen. Ich hoffe jemand von euch kann mir da noch helfen. Info: Ich habe mir auch mal den Delphi ICQ-Clienten moeICQ oder so geladen, aber da hab ich keine konkreten Stellen gefunden bzw. habe ich da eigentlich garnichts TICQClient bezogenes gefunden. Dann habe ich mir mal den Delphi ICQ-Clienten CheatICQ ( ![]()
Delphi-Quellcode:
Wichtig ist hier wohl die Zeile lstContactList.AddItem(UserInfo.Nick + ' (' + IntToStr(UserInfo.UIN) + ') - ' + GetStatusFor(UserInfo.UIN), Self);. Er ruft also eine Funktion auf die den Status der jeweiligen UIN abruft: GetStatusFor(UserInfo.UIN). Soweit so gut, dass hier ist dann die Funktion:
procedure TfrmMain.ICQClientServerListRecv(Sender: TObject;
SrvContactList: TList); var i : LongInt; UserInfo: TUINEntry; UINNickItem : PUINNickItem; begin if FullReloadContactList then begin FullReloadContactList := False; lstContactList.Clear; UINNickList.Clear; end; if SrvContactList.Count > 0 then for i := 0 to SrvContactList.Count - 1 do begin UserInfo := PUINEntry(SrvContactList.Items[i])^; if UserInfo.CType = 0 then begin lstContactList.AddItem(UserInfo.Nick + ' (' + IntToStr(UserInfo.UIN) + ') - ' + GetStatusFor(UserInfo.UIN), Self); GetMem(UINNickItem, SizeOf(UINNickItem^)); UINNickItem^.UIN := UserInfo.UIN; UINNickItem^.Nick := UserInfo.Nick; UINNickList.Add(UINNickItem); end; end; AddEvent('Ïîëó÷åí ñïèñîê êîíòàêòîâ'); ICQClient.DestroyUINList(SrvContactList); end;
Delphi-Quellcode:
Doch ich raff es einfach nicht vor allem nicht die Zeile Rs := StatusToStr_rus(PUINStatusItem(UINStatusList.Items[i])^.Status);. Häh, er kann da einfach so .Status machen, ich bin da total durcheinander. Keine Ahnung auch was UINStatusList ist, weil irgendwie wird nirgends sonst im Quelltext was damit gemacht.
function GetStatusFor(UIN : Cardinal) : String;
var Rs : String; i : LongInt; begin Rs := StatusToStr_rus(S_OFFLINE); if UINStatusList.Count > 0 then for i := 0 to UINStatusList.Count - 1 do if PUINStatusItem(UINStatusList.Items[i])^.UIN = UIN then Rs := StatusToStr_rus(PUINStatusItem(UINStatusList.Items[i])^.Status); Result := Rs; end; Alles sehr viel und schwer, aber bitte nehmt euch einen Augenblick und helft mir mit dieser Sache. Nochmal meine eigentliche Frage: Wie rufe ich den Status der einzelnen Kontakte ab, während oder nachdem ich die Kontaktliste erhalten habe, damit ich nur die Online-Kontakte mit Nick anzeigen kann? |
Re: Leidiges Thema: Status der Kontakte mit TICQClient
Hi,
so wie es aussieht arbeitest Du mit TIcqClient, diese schöne Komponente habe ich auch mal verwendet, leider funktioniert diese aufgrund einer Protokoll-Änderung von ICQ nicht mehr korrekt. Du kannst Dich zwar einloggen, allerdings erhälst Du nie eine Benachrichtigung darüber, wenn jemand aus Deiner Kontaktliste online geht, d.h. Deine Kontakte sind immer offline und bleiben es auch!!! Ich bin mittlerweile auf eine gekaufte Komponenteumgestiegen, diese funktioniert zwar; Allerdings auch nur bedingt und mit weniger Features. Also lässt die Finger von ![]() Die Msn Komponente ist ganz ok!! Greetz Data |
Re: Leidiges Thema: Status der Kontakte mit TICQClient
Bei Miranda IM ist das ICQ Protokoll als Plugin dabei und wird auch weiterentwickelt. Das PlugIn ist als DLL dabei(der Source, C++ afaik, ist auch dabei), wenn man sich damit beschäftigt kann man das sicher verwenden. Die Schnittstellen liegen auch offen. Der große Vorteil wäre: Wenn man sich einmal das Interface von Miranda eingebaut hat, braucht man nur das ICQ Plugin zu aktualisieren, wenn es eine Protokolländerung gibt.
Viele Grüße, Benjamin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz