![]() |
ICQ Konaktliste
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:
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:
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;
Delphi-Quellcode:
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).
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; Wie schaffe ich es also, dass er nach dem Login die einzelnen User auf ihren Status überprüft? Danke Flo |
Re: ICQ Konaktliste
Ich glaub ich hab ne Lösung gefunden. Wenn die Hilfe stimmt könnte ich die Liste mit den Contacts durchgehen und nach jedem einzelnen mit der procedure SearchByUIN suchen. Als Ereignis erhalte ich dann OnUserFound, welches mir unter anderem den tatus angibt.
Die Lösung erscheint mir allerdings etwas sehr gewurschtelt. Wenn also einer noch ne bessere Möglichkeit kennt, dann immer her mit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 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