Einzelnen Beitrag anzeigen

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