Thema: Delphi ICQ Konaktliste

Einzelnen Beitrag anzeigen

-=IOI=-

Registriert seit: 5. Mär 2005
54 Beiträge
 
#1

ICQ Konaktliste

  Alt 13. Jul 2005, 21:00
Hallo erstmal.

Ich programmier grad nen ICQ Clone mit der TICQClient Kompo. Nun kann ich mir mit der procedure RequestContactList die Kontaktliste vom ICQ Server laden. Mit folgendem Code lese ich dann die Liste aus und schreibe die Einträge in ein ListView:

Delphi-Quellcode:
procedure TForm1.ICQClient1ServerListRecv(Sender: TObject;
  SrvContactList: TList);
var
  i: Word;
  UserInfo: TUINEntry;
  ListItem: TListItem;
begin
  if SrvContactList.Count > 0 then
    begin
    ListView1.Clear;
    LastUser := 0;
    for i := 0 to SrvContactList.Count - 1 do
    begin
      UserInfo := PUINEntry(SrvContactList.Items[i])^;
      if UserInfo.CType = U_VISIBLE_LIST then
        ICQClient1.VisibleList.Add(IntToStr(UserInfo.UIN))
      else if UserInfo.CType = U_INVISIBLE_LIST then
        ICQClient1.InvisibleList.Add(IntToStr(UserInfo.UIN))
      else if UserInfo.CType = U_NORMAL then
      begin
        if ICQClient1.AddContact(UserInfo.UIN) then
        begin
          User[LastUser+1] := TICQUser.Create;
          User[LastUser+1].Nick := UserInfo.Nick;
          User[LastUser+1].Nummer := UserInfo.UIN;
          User[LastUser+1].Status := ICON_OFFLINE;
          User[LastUser+1].Gruppe := UserInfo.CGroupID;
          Inc(LastUser);
          ListItem := ListView1.Items.Add;
          ListItem.ImageIndex := ICON_OFFLINE;
          ListItem.Caption := UserInfo.Nick;
        end;
      end;
    end;
    end;
  ICQClient1.DestroyUINList(SrvContactList);
  ICQClient1.RequestOfflineMessages;
end;
Das klappt auch alles soweit und ich seh alle Leute in der Liste mit einer roten Blume vorne dran. Nun heißt es in der Beschreibung, dass mit der Funktion StatusChange eine Änderung des Status eines Users mitgeteilt wird. Das hab ich dann so umgesetzt:

Delphi-Quellcode:
procedure TForm1.ICQClient1StatusChange(Sender: TObject; UIN: String;
  Status: Cardinal);
var i: Integer;
    FNick: String;
begin
  for i := 1 to LastUser do
  if User[i].Nummer = StrToInt(UIN) then
  begin
    FNick := User[i].Nick;
    case Status of
    S_ONLINE: User[i].Status := ICON_ONLINE;
    S_INVISIBLE: User[i].Status := ICON_INVISIBLE;
    S_AWAY: User[i].Status := ICON_AWAY;
    S_NA: User[i].Status := ICON_NA;
    S_OCCUPIED: User[i].Status := ICON_OCCUPIED;
    S_DND: User[i].Status := ICON_DND;
    S_FFC: User[i].Status := ICON_FFC;
  end;
  end;

  for i := 0 to ListView1.Items.Count - 1 do
  if FNick = ListView1.Items.Item[i].Caption then
  case Status of
  S_ONLINE: ListView1.Items.Item[i].ImageIndex := ICON_ONLINE;
  S_INVISIBLE: ListView1.Items.Item[i].ImageIndex := ICON_INVISIBLE;
  S_AWAY: ListView1.Items.Item[i].ImageIndex := ICON_AWAY;
  S_NA: ListView1.Items.Item[i].ImageIndex := ICON_NA;
  S_OCCUPIED: ListView1.Items.Item[i].ImageIndex := ICON_OCCUPIED;
  S_DND: ListView1.Items.Item[i].ImageIndex := ICON_DND;
  S_FFC: ListView1.Items.Item[i].ImageIndex := ICON_FFC;
  end;
end;
Mein Problem besteht nun darin, dass mir nach dem LogIn nicht automatisch die User, die Online sind angezeigt werden, sondern alle weiterhin eine rote Blume haben. (Falls jetzt einer auf die Idee kommt - es sind User online, mit normalem ICQ getestet).

Wie schaffe ich es also, dass er nach dem Login die einzelnen User auf ihren Status überprüft?

Danke Flo
  Mit Zitat antworten Zitat