Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Useranzahl per Indy ermitteln (https://www.delphipraxis.net/134966-useranzahl-per-indy-ermitteln.html)

Linguini 2. Jun 2009 11:20


Useranzahl per Indy ermitteln
 
Hallo,

ich möchte gerne wie hier beschrieben, mit der Indy IRC Komponente die User in einem IRC Channel auflisten lassen.

Delphi-Quellcode:
var
i: integer;
//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
ListBox1.Items.Add(AUsers.Items[i].Nick); //Adde diese zu ListBox
//end
Anscheinend gibt es in Indy 10 die Bezeichnung "AUsers" nicht mehr...

Dafür hab ich aber die Methode ListChannelNicknames gefunden...
Nur wenn ich es so probiere:

IndyIRC.ListChannelNicknames(Channel.Text,Userlist );

Bleibt Userlist leer(Userlist muss ein String sein)

Wie löße ich das Problem?

Und noch eine Frage :D

Die Methode "GetChannelTopic" macht "Probleme".
Wie verwende ich sie?
String:= GetChannelTopic(Channel) funktioniert nicht...


Danke

Assertor 2. Jun 2009 12:20

Re: Useranzahl per Indy ermitteln
 
Hi,

Zitat:

Zitat von Linguini
Dafür hab ich aber die Methode ListChannelNicknames gefunden...
Nur wenn ich es so probiere:

IndyIRC.ListChannelNicknames(Channel.Text,Userlist );

Bleibt Userlist leer(Userlist muss ein String sein)

...

Wie löße ich das Problem?

Und noch eine Frage :D

Die Methode "GetChannelTopic" macht "Probleme".
Wie verwende ich sie?
String:= GetChannelTopic(Channel) funktioniert nicht...

Du verwendest die Komponente falsch. Du mußt dem IdIRC auch die Ereignisse zuweisen, z.B. OnNicknamesListReceived oder OnServerUsersListReceived (<- dort gibt es das gesuchte AUsers übrigens).

Dann fragst Du den IRC Server höflich um die Information z.B. per IdIRC.ListChannelNicknames() oder IdIRC.ListServerUsers() oder IdIRC.GetBlaBlaXYZ(). Sobald die Antwort da ist, wird das Ereignis aufgerufen und Deine Methode z.B. für OnNicknamesListReceived ausgeführt. Die Strings in den Anfrage-Funktionen und -Prozedure sind dazu da, weitere Informationen an den *Remote* Server zu senden bevor die Antwort kommt.

Welche Methode für welche Prozedur benötigt wird, kann ich Dir ad hoc nicht sagen - ich verwende kein IRC. Es hängt aber wohl auch vom IRC Server ab, was unterstützt wird (3dl.am verweigerte mir eben USERS).

Mehr kann ich nicht dazu sagen. Erstmal kommen jetzt die DelphiTage dran.

Gruß Assertor

Linguini 2. Jun 2009 12:51

Re: Useranzahl per Indy ermitteln
 
Irgendwie hilft mir das nichts...

Selbst wenn ich ListChannelNicknames in einem OnNicknamesListReceived/OnServerUsersListReceived aufrufe, bleibt der Targetstring trotzdem leer.

Auch mit der Methode:

Delphi-Quellcode:
var
i: integer;
//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
ListBox1.Items.Add(AUsers.Items[i].Nick); //Adde diese zu ListBox
//end
In einem OnServerUsersListReceived Event passiert nichts, da er das "Items" nicht kennt...

Assertor 2. Jun 2009 13:05

Re: Useranzahl per Indy ermitteln
 
Hi,

Zitat:

Zitat von Linguini
Irgendwie hilft mir das nichts...

Selbst wenn ich ListChannelNicknames in einem OnNicknamesListReceived/OnServerUsersListReceived aufrufe, bleibt der Targetstring trotzdem leer.

Auch mit der Methode:

Delphi-Quellcode:
var
i: integer;
//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
ListBox1.Items.Add(AUsers.Items[i].Nick); //Adde diese zu ListBox
//end
In einem OnServerUsersListReceived Event passiert nichts, da er das "Items" nicht kennt...

Das fettgedruckte oben ist schonmal ziemlich verkehrt.

Du rufst im normalen Code die Funktion ListChannelNicknames auf. Indy ruft dann, sobald die Antwort da Deinen Methode auf (die z.B. OnNicknamesListReceived zugewiesen wurde). Du rufst jetzt die Funktion zum Aufrufen in der Methode selbst auf... Das kann doch nicht gehen.

Items: AUsers ist vom Typ TStrings. Das kennt keine Items. Ich habe auch nie gesagt, daß es so funktioniert und man da Items verwenden soll... In der Hilfe von Delphi findest Du unter dem Begriff TStrings alles zum Zugriff erklärt. Da findet man z.B. ein .Strings[Index: Integer].

In Deinem Fall also
Delphi-Quellcode:
var
i: integer;
//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
  ListBox1.Items.Add(AUsers.Strings[i]); //Adde diese zu ListBox
//end
Das ist übrigens genau das, was ich im anderen Thread meinte. Es wird so schnell gesagt, Indy hat oder macht Probleme. Das stimmt ja sichtbar nicht... Indy und Delphi können beide nicht hellsehen, die richtige Umsetzung liegt ausschließlich am Programmierer.

Gruß Assertor

Linguini 2. Jun 2009 13:25

Re: Useranzahl per Indy ermitteln
 
Ich steh wohl grad ziemlich aufm Schlauch.

Also ich sollte das doch so machen:

Delphi-Quellcode:
procedure TForm1.ServerUsersListReceived(ASender: TIdContext;
  AUsers: TStrings);
  var
  i : Integer;
begin

//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
  UserList.Items.Add(AUsers.Strings[i]); //Adde diese zu ListBox

end;
Nur diese Prozedur wird ja garnicht aufgerufen.
Auch nicht wenn ich ListUsername oder ListServerUsers aufrufe...

Danke für deine Geduld :)

Linguini 4. Jun 2009 11:07

Re: Useranzahl per Indy ermitteln
 
Ich hab es bisher immer noch nicht hingebracht.
Kann mir jemand noch einen größeren Schubs in die richtige Richtung geben ;) ?

Assertor 4. Jun 2009 13:20

Re: Useranzahl per Indy ermitteln
 
Hi,

Zitat:

Zitat von Linguini
Ich steh wohl grad ziemlich aufm Schlauch.

Also ich sollte das doch so machen:

Delphi-Quellcode:
procedure TForm1.ServerUsersListReceived(ASender: TIdContext;
  AUsers: TStrings);
  var
  i : Integer;
begin

//begin
for i:=0 to AUsers.Count-1 do //führe sooft aus wie User im Channel sind
  UserList.Items.Add(AUsers.Strings[i]); //Adde diese zu ListBox

end;
Nur diese Prozedur wird ja garnicht aufgerufen.
Auch nicht wenn ich ListUsername oder ListServerUsers aufrufe...

Da fehlen wohl ein paar Grundkenntnisse Delphi, richtig? Dann würd ich aber nicht mit IRC anfangen...

Du weist dem Ereignis eine Methode zu. Diese Methode (hier ServerUsersListReceived) wird vom Ereignis OnServeUserListReceived aufgerufen nachdem die Antwort des Servers da ist. Den Server fragst Du um seine Antwort, mit dem Aufruf von IdIRC.GetXYZ.

Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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