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