Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ListBox detectar uando sale un item y cuando entra (https://www.clubdelphi.com/foros/showthread.php?t=20930)

kakesoft 29-04-2005 20:29:58

ListBox detectar uando sale un item y cuando entra
 
Miren, a todos aquellos que quieran ayudarme, estoy construyendo con los componentes indy un chat, que presenta cliente y servidor, en el cliente tengo un listbox, con un botón actualizar que al hacer clic en él me dirá cuántos clientes hay conectados, o sea, estos se mostrarán como items. Yo quiero lograr en mi chat lo que hace el yahoo messenger, cuando aluien se conecta lo dice y cuando alguien se desconecta también, tengo la idea pero no se como implementarlo, por lo que me haría falta saber lo siguiente: por ejemplo tengo tres items (tres clientes en línea):

Guille
Alex
Pablo

si cuando yo vuelvo a dar clic en el botón actulizar existen dos items nada más en el listbox, por ejemplo:

Guille
Alex

quisiera que se me mostrara un formulario o un mensaje diciendo: se desconectó:(el usuario que ya no existe, en este caso Pablo)

Si fuera de la forma inversa, estaría los tres items:


Guille
Alex
Pablo

y cuando yo vuelvo a dar clic en el botón actulizar existen cuatro items en el listbox, por ejemplo:

Guille
Alex
Pablo
Raul

también quisiera que se me mostrara un formulario o un mensaje diciendo: se conectó:(el usuario que se ha agregado, en este caso Raul).

Gracias a todos aquellos que quieran ayudarme

Saludos a todos

PeLuCa 30-04-2005 01:53:24

Si estas usando los Indy, primero que nada bajate un ejemplos de la pagina de estos que tienen uno bastante similar a lo que estas haciendo tu.
Por otro lado, como te dije antes, usando los indy, en el servidor el TIdTCPServer en el metodo OnDisconnet recibes un parametro del tipo TIdPeerThread que te identifica el threads del cliente que se a desconectado, lo buscas en tu ListBox y lo eliminas y muestras una ventana avisando que se ha desconectado (o en caso inverso, que se ha conectado, y lo agregas al listbox), fijate tambien que he visto un componente e Torry.net que simula bastante bien el pop up del messenger (el msn) el que te aparece sobre el reloj.
Saludos.

kakesoft 30-04-2005 02:20:35

Ya tengo ese ejemplo
 
Pluca muchísimas gracias por ayudarme pero el problema es que tengo el componente msnpopup y también el ejemplo chat del sitio de las indy, pero no tengo ni idea de cómo detectar cuándo se conecta o deconecta un cliente del servidor, por lo que quisiera que me tiraras un cabito en eso, acuérdate mi objetivo es solo hacer lo que hace el messenger de yahoo, que cuando se actualiza si se ha desconectado un cliente, te avisa y si se ha conectado uno también lo hace. Podrías ayudarme en eso?, sin apuros pero si con mucha necesidad, necesito el código cuanto antes....

saludos a peluca de kakesoft, y a todos los demás que por este foro de clubdelphi se pasean.

graciasss

Lepe 30-04-2005 11:54:34

Cita:

Empezado por kakesoft
pero no tengo ni idea de cómo detectar cuándo se conecta o deconecta un cliente del servidor

Cita:

Empezado por Peluca
como te dije antes, usando los indy, en el servidor el TIdTCPServer en el metodo OnDisconnet recibes un parametro del tipo TIdPeerThread que te identifica el threads del cliente que se a desconectado,

Yo no entiendo de esto, pero me parece que el truco está ahí, en el TidTCPServer (juer con el nombrecito), en lugar de en el listbox.

Además creo que es lo mejor, ya no tienes que poner un boton para actualizar, sino que se actualiza el listbox él solito.

Divagando... Supongo que en TIdTCPServer.OnConnect puedes usar el Listbox.items.addobject('nombre del usuario', TidPeerThread), de esta forma, ya tienes enlazado cada nick, con su thread, y en el evento OnDisconnet coges ese objeto y recorres los objetos del Listbox para saber el nick del que se desconectó.

¿me he pasado 3 pueblos? :D


Un saludo.

kakesoft 30-04-2005 22:18:42

Ya se como detectar la entrada y salida de un cliente
 
Cogí el ejemplo del chat de las indy y en el evento onconect del tidtcpserver detecto cuando se conecta un nuevo cliente y el el diconect cuando se desconecta y lo hago de la siguiente manera :

procedure TfrmMain.tcpServerConnect(AThread: TIdPeerThread);
var
Client : TSimpleClient;
begin
{ Send a welcome message, and prompt for the users name }
AThread.Connection.WriteLn('ISD Connection Established...');
AThread.Connection.WriteLn('Please send valid login sequence...');
AThread.Connection.WriteLn('Your Name:');
{ Create a client object }
Client := TSimpleClient.Create;
{ Assign its default values }
Client.DNS := AThread.Connection.LocalName;
Client.Name := 'Logging In';
Client.ListLink := lbClients.Items.Count;
{ Assign the thread to it for ease in finding }
Client.Thread := AThread;
{ Add to our clients list box }
lbClients.Items.Add(Client.Name);
{ Assign it to the thread so we can identify it later }
AThread.Data := Client;
{ Add it to the clients list }
Clients.Add(Client);

showmessage('Se ha conectado'+' '+client.Name);

end;


y con showmessage tambien lo hago en el evento ondisconect pero hay un problema ahora por qué en el mensage que se muestra me sale:

En el OnConect
Se ha conectado Logging In <---- aquí no me sale correctamente el nombre del cliente que se ha conectado

En el OnDisconect
Se ha deconectado <---- aquí si me sale correctamente el nombre del cliente que se ha desconectado

Lepe 01-05-2005 10:54:58

Lo que veo un poquito raro es este codigo:
Código Delphi [-]
{ Assign the thread to it for ease in finding }
Client.Thread := AThread;

En el uso normal de objetos, en realidad estas asignando punteros, no estas creando el objeto TIdPeerThread. Yo lo haría así:

Código Delphi [-]
{ Assign the thread to it for ease in finding }
// se supone que Client.Thread está declarado de tipo TidPeerThread;
client.Thread := TidPeerThread.Create(AThread.Suspended);
Client.Thread.Assign(AThread); 
// ahora si estamos copiando todo el objeto TidPeerThread.

// Antes solo guardabas el puntero, y al ser variable local de OnConnect, se 
// pierde el objeto al salir de ese procedimiento.
El constructor de un objeto TidPeerThread necesita de un parametro boolean para crearse, no tengo ni idea del valor que hay que pasarle, así que le paso el valor que tenga AThread en su propiedad Suspended porque me parece intuitivo, pero ojo, no sé si es correcto.

AThread.Data := Client; le pasa exactametne lo mismo. Esto si Funciona, porque en realidad estas guardando la direccion de memoria donde se ha creado TsimpleClient, y al acceder a AThread.Data.Name, en realidad se está accediendo directamente al mismo objeto TsimpleClient.


Cita:

Empezado por Lepe
¿me he pasado 3 pueblos? :D

Puesto que utilizas la lista Clients, no es necesario añadir cada TsimpleClient al listbox.

Un saludo

Lepe 01-05-2005 11:07:00

Si me permites un comentario al margen de la duda....

Puesto que al conectarse al servidor aun no sabes el nick ni la contraseña de esa persona, yo solo guardaría una lista de TidPeerThread, y cuando el usuario haga el login, entonces es cuando creo el TSimpleClient, le asocio su TidPeerThread y lo añadiría al listbox.

en el login del usuario puedes hacer Client.ListLink := listbox.items.Add('ahora si saves el nick'); y así tambien puedes tener el listbox ordenado alfabeticamente.

Un saludo de nuevo, y espero que sean viables estas sugerencias.


La franja horaria es GMT +2. Ahora son las 03:54:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi