FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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 |
#2
|
|||
|
|||
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. |
#3
|
||||
|
||||
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 |
#4
|
||||
|
||||
Cita:
Cita:
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. |
#5
|
||||
|
||||
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 23:58:18. |
#6
|
||||
|
||||
Lo que veo un poquito raro es este codigo:
En el uso normal de objetos, en realidad estas asignando punteros, no estas creando el objeto TIdPeerThread. Yo lo haría así: 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:
Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
|
|