AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Leidiges Thema: Status der Kontakte mit TICQClient
Thema durchsuchen
Ansicht
Themen-Optionen

Leidiges Thema: Status der Kontakte mit TICQClient

Offene Frage von "Pixelex"
Ein Thema von Pixelex · begonnen am 24. Nov 2008 · letzter Beitrag vom 8. Dez 2008
Antwort Antwort
Pixelex

Registriert seit: 5. Feb 2008
41 Beiträge
 
#1

Leidiges Thema: Status der Kontakte mit TICQClient

  Alt 24. Nov 2008, 08:33
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:
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;
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:

Delphi-Quellcode:
procedure Tmain.icqStatusChange(Sender: TObject; UIN: String;
  Status: Cardinal);
begin
  kontaktliste.AddItem(UIN, Self);
end;
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.

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 (http://progs.volkov.spb.su/ticqclien...ticq_v1_34.rar) geladen, in dem der Status auch erkannt wird, ich habe mir das gestern den ganzen Tag angesehen, allerdings verstehe ich nicht wie der Entwickler das da gemacht hat. Dort steht es wie folgt:

Delphi-Quellcode:
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;
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:

Delphi-Quellcode:
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;
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.


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?
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Leidiges Thema: Status der Kontakte mit TICQClient

  Alt 8. Dez 2008, 19:42
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 Bricksoft Instant Messenger

Die Msn Komponente ist ganz ok!!

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Leidiges Thema: Status der Kontakte mit TICQClient

  Alt 8. Dez 2008, 20:40
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
Benjamin
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz