Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-04-2005
Avatar de kakesoft
kakesoft kakesoft is offline
Miembro
 
Registrado: dic 2004
Ubicación: Cuba
Posts: 99
Poder: 20
kakesoft Va por buen camino
Unhappy 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
Responder Con Cita
  #2  
Antiguo 30-04-2005
PeLuCa PeLuCa is offline
Miembro
 
Registrado: abr 2005
Posts: 20
Poder: 0
PeLuCa Va por buen camino
Smile

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.
Responder Con Cita
  #3  
Antiguo 30-04-2005
Avatar de kakesoft
kakesoft kakesoft is offline
Miembro
 
Registrado: dic 2004
Ubicación: Cuba
Posts: 99
Poder: 20
kakesoft Va por buen camino
Wink 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
Responder Con Cita
  #4  
Antiguo 30-04-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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?


Un saludo.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 30-04-2005
Avatar de kakesoft
kakesoft kakesoft is offline
Miembro
 
Registrado: dic 2004
Ubicación: Cuba
Posts: 99
Poder: 20
kakesoft Va por buen camino
Unhappy 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

Última edición por kakesoft fecha: 30-04-2005 a las 22:58:18.
Responder Con Cita
  #6  
Antiguo 01-05-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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?
Puesto que utilizas la lista Clients, no es necesario añadir cada TsimpleClient al listbox.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 01-05-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 01-05-2005 a las 11:19:58.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:46:47.


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
Copyright 1996-2007 Club Delphi