Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Componentes del club (https://www.clubdelphi.com/foros/showthread.php?t=47151)

basti 04-09-2007 03:00:24

Bueno, mi pequeña aportación a los componentes. Son dos componentes "DB Aware".

El primero es muy sencillo, se trata de un "label" que cambia según el valor de un campo boolean (o cualquier tipo de campo con dos valores posibles).

El segundo es una especie de "Grid" no editable, con filas y columnas donde cada registro es una celda y se puede mostrar un texto y una imagen por cada registro.

También va una demo con los dos componentes.

Tengo algún componente más para aportar, a medida que los vaya adaptando al formato del club los iré subiendo.

Archivo Adjunto 968

dec 04-09-2007 07:17:43

Cita:

Empezado por Héctor
Me parece que en Delphi7 el componente Bevel no tiene la propiedad ExplicitWidth. Tal vez, se tenga que considerar remover el Bevel o en su defecto intentar no invocar dicha propiedad para que no cause conflictos.

Pues sí. Habrá que quitar ese "bevel" del medio. Tal vez sea algo drástico, pero, ¿a alguien se le ocurre otra forma? :)

Cita:

Empezado por José
DEc acbo de ver el archivo corregido, me quito el sombrero, no he podido probar el componente con las correcciones, pero desde luego esta más claro que mi codigo un rato largo, no puedo probar el componente ya que este equipo Tiene el W. Vista y tengo instalado el turbo Delphi, pero si mañana llego tempreno lo probare en uno de los otros ordenadores.

Na... no es para tanto... me limité a quitar algunos "Getters" que no eran realmente utilizados. Tú podrías a partir de como está el componente ver si puedes ponerlo "a punto", puesto que no me extrañaría que quitases cosas demás... :(

Cita:

Empezado por Federico
No tengo bien presente el motivo, se supone que el asterisco no es un comodín como en el sistema operativo, sino que es reemplazado por el nombre de la unit (o archivo). Ademas tengo unos cuantos paquetes con la misma arquitectura sin existir conflicto entre recursos. Por este motivo, revisé un poquito el código y tengo un par de detalles que comentar:

* Setear el paquete de RunTime como tal y lo mismo para el de DesignTime.
* No se porque han decidido que el archivo rsCCD.inc no sea una unit, lo que terminan haciendo es incluyendo las constantes para cada unit donde se incluyan sin reutilizarlas.

No entiendo lo de "setear" los paquetes "RunTime" y "DesignTime". ¿Puedes explicarlo como para un niño de 10 años? Gracias. :)

Respecto del archivo ".inc"... la verdad es que tengo esa costumbre y acaso tenga que quitármela. Pero, ahora mismo ningún componente (salvo error) incluye dicho archivo ni no hace uso del mismo de alguna manera. Además... ¿no podría pasar lo mismo si dichas "constantes" estuvieran en una unidad? No sé... no estoy seguro... acabo de despertarme, leñe. :)

Cita:

Empezado por basti
Bueno, mi pequeña aportación a los componentes. Son dos componentes "DB Aware".

Estupendo. Lo único que yo no voy a poder "revisarlos" hasta esta tarde... puesto que esta mañana... en fin, estamos de limpieza en casa y me va a tocar liarme con la terraza, la cocina, el baño o qué sé yo esta mañana... :( ;) :)

Actualización: El formulario "acerca de..." no contiene ya el componente "Bevel".

delphi.com.ar 04-09-2007 14:47:39

Cita:

Empezado por dec (Mensaje 228129)
No entiendo lo de "setear" los paquetes "RunTime" y "DesignTime". ¿Puedes explicarlo como para un niño de 10 años? Gracias. :)

Simplemente setear desde Project \ Options \ Description :
Cita:

Empezado por Delphi Help
Usage options Select Design Package if you want the package to be installable on the Component palette.
Select Runtime Package if you want the package to be deployable with an application.
Select both Design Package and Runtime Package if you want the package to be both installable and deployable.
If neither Design Package nor Runtime Package is checked, the package cannot be installed on the Component palette or deployed with Delphi applications. Use this option for packages that exist only to be referenced (required) by other (design-time) packages.



Cita:

Empezado por dec (Mensaje 228129)
Respecto del archivo ".inc"... la verdad es que tengo esa costumbre y acaso tenga que quitármela. Pero, ahora mismo ningún componente (salvo error) incluye dicho archivo ni no hace uso del mismo de alguna manera. Además... ¿no podría pasar lo mismo si dichas "constantes" estuvieran en una unidad? No sé... no estoy seguro... acabo de despertarme, leñe. :)

Yo no veo nada mal que las constantes de ese tipo esten todas dentro de una única unit, lo que no me agrada es que se utilice el método de inclusión, ya que en la práctica es como definir todas las constantes para todas las units.

Saludos!

basti 04-09-2007 15:36:45

1 Archivos Adjunto(s)
Cita:

Empezado por dec (Mensaje 228129)


Estupendo. Lo único que yo no voy a poder "revisarlos" hasta esta tarde... puesto que esta mañana... en fin, estamos de limpieza en casa y me va a tocar liarme con la terraza, la cocina, el baño o qué sé yo esta mañana... :( ;) :)

Bueno, pues aprovecho para incluir un componente más, un navegador del estilo de DBNavigator con algunas funciones más, botones personalizados, búsqueda por un campo, bookmarks ...

Aquí va lo anterior y lo nuevo junto: Archivo Adjunto 969

dec 04-09-2007 16:01:45

Hola,

Cita:

Empezado por Federico
Yo no veo nada mal que las constantes de ese tipo esten todas dentro de una única unit, lo que no me agrada es que se utilice el método de inclusión, ya que en la práctica es como definir todas las constantes para todas las units.

Pues no lo termino de entender. Estén las constantes en una unidad o en el archivo "inc", siempre que se precisen habrá que incluir la unidad o el archivo "inc", y en todo caso puede incluirse el archivo "inc" demás... como puede incluirse la unidad. No sé. No veo las ventajas de una unidad frente a un archivo "inc" para definir constantes... aunque en este caso más que constantes son "recursos/cadenas".

Pero, vamos, también es verdad que yo uso archivos "inc" por costumbre... y que a lo mejor no estoy haciendo uso de ellos correctamente, o uso "inc" donde debería usar unidades o al revés...

dec 04-09-2007 16:51:21

Hola,

Acabo de actualizar CCD con los siguientes cambios:

Cita:

[?] El componente "CCDDBAutoCompleteEdit" se mueve a la paleta de
componentes "ClubDelphi (data aware)".

[+] Añadida la pestaña "ClubDelphi (data aware)" para la paleta de
componentes de Delphi.

[+] Añadidos los componentes "CCDDBBoolLabel", "CCDDBNavigator" y
"CCDDBImageGrid" escritos por Basti (del ClubDelphi.com).

[?] Federico Firenze: "Seteados" los paquetes para "tiempo de ejecución"
y "tiempo de diseño".

[?] Héctor Randolph: Eliminado el "Bevel" del formulario "acerca de..."
para evitar problemas con una propiedad del mismo no disponible en
Delphi 7 (y versiones anteriores).
Ahora veo que se me empieza a escapar CCD... parece mentira la diferencia que cada persona tiene a la hora de codificar, de escribir código fuente... unos lo hacen de una forma, otros de otra... yo soy el primero en incluirme en unos u otros, que no estoy diciendo nada malo de nadie, sino que me llamó la atención esto que digo.

Bueno. A ver si alguien se anima y prepara los iconos para los tres últimos componentes que se han añadido. :)

delphi.com.ar 04-09-2007 16:56:40

1 Archivos Adjunto(s)
Cita:

Empezado por dec (Mensaje 228189)
Pues no lo termino de entender. Estén las constantes en una unidad o en el archivo "inc", siempre que se precisen habrá que incluir la unidad o el archivo "inc", y en todo caso puede incluirse el archivo "inc" demás... como puede incluirse la unidad. No sé. No veo las ventajas de una unidad frente a un archivo "inc" para definir constantes... aunque en este caso más que constantes son "recursos/cadenas".

Pero, vamos, también es verdad que yo uso archivos "inc" por costumbre... y que a lo mejor no estoy haciendo uso de ellos correctamente, o uso "inc" donde debería usar unidades o al revés...

Recuerda que el INCLUDE es similar al de C donde se incluye explícitamente el archivo donde sea llamado, algo que podemos imitar con un copy paste :p...
Bueno, si usamos un recurso desde varias units distintas y este recurso estará dentro de un archivo incluído dentro de cada unit, entonces se incluriá para cada unit por separado sin reutilizarlo.
Fíjate el ejemplo que te subo, busca tu nombre en los recursos de los dos ejemplos.

Saludos!

delphi.com.ar 04-09-2007 17:17:20

1 Archivos Adjunto(s)
Adjunto un ejemplo mas "visible".

Saludos!

dec 04-09-2007 17:49:09

Hola,

Acabáramos. Ahora lo he visto claro. Pues inmediatamente me quito la costumbre de usar archivos "inc"... como si tal cosa. Es cierto que ha veces vienen muy bien (cuando propiamente se quiere que el contenido se "incluya" en un determinado lugar, en cuyo caso no pueden usarse unidades), pero, duplicar los recursos por duplicarlos... nanai. Así que haré los cambios oportunos en CCD. Y me temo que ciertos proyectos que tengo en marcha también.

Muchas gracias Federico. Nunca te acostarás sin saber una cosa más, suele decirse, y hoy es cierto para mí gracias a ti. :)

dec 04-09-2007 17:59:10

Hola,

Ya está subido CCD haciendo uso de la nueva unidad "URecursosCCD.pas" en lugar de "rsCCD.inc". :)

Actualización: Ya he añadido iconos para los tres últimos componentes. Pero siempre pueden mejorarse... :)

José Luis Garcí 04-09-2007 21:42:37

Dec e corregido los fallos que en principio encontre harora estoy atascado en el tema de que la clase de la que parte el componente, no tiene la propiedad Transparente, sabe si a una de las dos clases usadas (TcomponenControl o TWinControl), es posible hacer el fondo transparente, o hay alguna otra clase.

Emilio perdona abri otro hilo con este tema en el foro de OOP este es el enlace por si estimas oportuno eliminarlo http://www.clubdelphi.com/foros/show...346#post228346

Héctor Randolph 05-09-2007 06:36:42

Nuevos iconos para componentes
 
1 Archivos Adjunto(s)
Acabo de cambiar algunos iconos, si les gustan podemos incluirlos en el paquete.



Los iconos corresponden a los componentes CCDDBBoolLabel, CCDRichEdit, CCDDBImageGrid y CCDLabelLink.

Por cierto, el componente CCDDBImageGrid me pareció excelente. Esto va tomando forma :)

Subí el archivo CCD.zip que contiene el *.dcr con los nuevos iconos.

Saludos

dec 05-09-2007 07:53:54

Hola,

José, no sé yo si toqué algo en ese sentido, la verdad es que creo recordar que sí, empero, me parece que puedes derivar el componente de "TGraphicControl". De todos modos, podrías plantear la cuestión en los Foros de modo que pudieras obtener ayuda de más gente.

Héctor, los iconos son estupendos. Ya están añadidos y CCD actualizado en consecuencia. :)

http://web.madritel.es/personales2/a...on/ccd/ccd.zip

dec 06-09-2007 19:49:08

Hola,

Acabo de añadir a CCD los componentes que el compañero Neftalí tiene publicados en su página Web. Ahora mismo se cuentan ya 24 componentes en el paquete. No es que quiera mencionar la cantidad, pero, me parece un número muy bueno teniendo en cuenta que empezamos ayer como quien dice a recopilar componentes. :)

Emilio 06-09-2007 20:23:20

Cita:

Empezado por dec (Mensaje 228944)
Acabo de añadir a CCD los componentes que el compañero Neftalí tiene publicados en su página Web. Ahora mismo se cuentan ya 24 componentes en el paquete. No es que quiera mencionar la cantidad, pero, me parece un número muy bueno teniendo en cuenta que empezamos ayer como quien dice a recopilar componentes. :)

Ciertamente me parece un número bien respetable teniendo en cuenta que la criatura se encuentra todavía tomando biberones, si la cosa continúa a buen ritmo la JVCL se va a quedar pequeña.

Creo conveniente que este hilo se haga público por varias razones, ya se ha llegado al punto de la realidad, es decir, como todos sabéis infinidad de veces se proponen hacer proyectos y al final prácticamenente nunca cuaja nada, en este caso sí ha cuajado, en buena parte gracias a la coordinación de Dec, por supuesto sin menos preciar el resto de aportaciones, entiendo que todo proyecto requiere un lider, en este caso, sin saber cómo, tampoco importa, dec ha liderado el tema y lo ha hecho muy bien, el Club está en racha de creatividad en todos los sentidos.

Pues lo dicho creo conveniente, hacer ya público tanto este hilo como los componentes que contarán también con un subdominio propio.

http://componentes.clubdelphi.com (todavía no activo, en breve)

Sin más dilación creo que si os parece bien, dec tú como coordinador podría s mover el hilo y luego hablamos ya sobre el tema del subdominio.

dec 06-09-2007 20:33:46

Hola,

Bueno. En realidad no es que quisiera liderar nada, de hecho ya he dicho más arriba que a partir de N componentes el asunto superó mi capacidad de control. Los primeros componentes los he "editado" y adaptado "a mi manera", por decirlo así, pero, los últimos componentes no he podido, querido ni sabido hacerlo.

En definitiva, que es necesario el concierto de todos los que han aportado componentes (porque quién mejor que ellos, que han escrito el código), de todos los que quieran aportar nuevos componentes, de todos los que quieran colaborar indicando errores y formas de corregirlos, de todos, digo, los que de alguna manera quieran echar una mano de la manera que sea.

PD. Muevo este hilo a "OOP", entonces... :)

José Luis Garcí 07-09-2007 22:38:41

Ya pude terminar los tres componentes en los que estaba trabajando :p, me ha costado, tengo que decir que gracias a Dec logre que el componmente perdiera peso, y mejorara, en este componente lo unico que me disgusta es un lijero prpadeo, en los otros dos me disgusta mas los iconos, pero bueno como siempre a la decición del personal, ya me direis. Todos con pequeñas demos a falta de compilar.

dec 08-09-2007 09:28:24

Hola,

Bueno trabajo José. En cuanto pueda voy a añadirlos a CCD. Noto, sin embargo, que usas variables globales para lo que podrían ser (si no me equivoco) miembros privados de un componente, o acaso propiedades del mismo, pero, en todo caso mantener dichas variables "dentro" del componente. Pero, vamos... fuera de esto (que voy a corregir si puedo) creo que podremos contar con tres nuevos componentes en CCD. :)

dec 08-09-2007 09:55:33

Hola,

Ya están añadidos los componentes José. ¿Te fijaste en "CCDEditZoom"? Creo que funciona como se espera, excepto que no respeta la fuente original del Edit. Es decir, uno espera que la fuente sea la original, hasta que se pase el ratón por encima, y entonces se viera el efecto "Zoom", pero, la fuente del Edit cambia nada más ejecutarse el programa. Sigue haciendo el efecto Zoom, pero, pasa de "grande a más grande", en lugar de "normal a grande", no sé si me explico. :)

http://web.madritel.es/personales2/a...on/ccd/ccd.zip

José Luis Garcí 08-09-2007 10:16:02

Dec no se si te entendi, la idea es si pasas el raton por encima, solo hace que esl texto salga en negrita, mientras tengas el cursor del raton encima, desde que sales elimina la negrita, , en cambio cuando entras, si esta activo el zoom, cambia el tamaño del font, y multiplica por tres, el ancho y la font, el largo depende de si esta rellena el MaxWidth que limita el largo, al salir, devuelve al tamaño normal, pero en cuanto sales devuelve a los valores iniciales, no se si es que algo esta fallando, comentame si tal cosa y lo modifico, y de paso le añado un campo nuevo ValZoom y hacemos el zoom de l valor que le demos, que te parece. Que yo recuerde del FOnt, sólo he tocado, bold y size, pero no la fuente.

Te parece correcto como ha quedado el CCDLabelSopr, con lo unico que no he quedado del todo contento es con el ligero parpadeo.

dec 08-09-2007 10:33:11

Hola,

Bueno. Respecto de "CCDLabelSopr" se me hace un poco raro su uso, no sé si me explico... a veces uno hace cambios en las propiedades pero no se ve el resultado... luego en tiempo de ejecución sí que se ven esos cambios... pero, resumiendo, creo que pueden lograrse efectos curiosos en un "label" y que puede venir bien en un momento dado.

Respecto de "CCDEditZoom" el tema es este. Cuando uno sitúa un "CCDEditZoom" en el formulario, la fuente de este es la que por defecto es, o sea, digamos "Arial 10". Entonces uno esperaría (al menos así me ha pasado a mí) que en tiempo de ejecución, al pasar el ratón por el Edit su fuente pasara a ser "Arial 20" (por ejemplo).

Pero el caso es que cuando ejecutas el programa el Edit que tenía "Arial 10" como fuente pasa a tener "Arial 20", por ejemplo, y cuando pasas el ratón por encima su fuente cambia a "Arial 30". Yo creo que en tiempo de ejecución el componente debería tener como fuente "Arial 10" y cuando pasaras el ratón por encima "Arial 20".

No sé si ahora se entiende mejor. :)

José Luis Garcí 08-09-2007 11:04:47

Oido Cocina, me meto con el componente y lo compruebo, aunque la verdad, en mi delphi 6 no he notado ese cambio, pero hare una rutina de comprobación ene el programa de ejemplo, en cuanto al Labelsopr, según mi idea inicial es su uso sobre imagenes, para que no exista la posibilidad de que no se lea el label por coincidir el color con parte de la imagen de fondo, por eso lo ideal es usar un color Vivo de borde con un color fuerte de texto central, de todas maneras, mirare el problema, del EditZoom y que te parece la idea del valzoom.

basti 08-09-2007 11:49:28

Cita:

Empezado por dec (Mensaje 229332)
Hola,

Respecto de "CCDEditZoom" el tema es este. Cuando uno sitúa un "CCDEditZoom" en el formulario, la fuente de este es la que por defecto es, o sea, digamos "Arial 10". Entonces uno esperaría (al menos así me ha pasado a mí) que en tiempo de ejecución, al pasar el ratón por el Edit su fuente pasara a ser "Arial 20" (por ejemplo).

Yo tampoco veo ese efecto, cuando se ejecuta aparece con Arial 10 y cuando se entra aumenta de tamaño. De todas maneras quizás se arreglase poniendo una propiedad como EnterFont del tipo TFont donde se pudiese especificar el tipo de letra al entrar en el edit, esto lo haría también más adaptable. Me parece un componente muy interesante, se me están ocurriendo un par de sitios donde ponerlo.

José Luis Garcí 08-09-2007 12:26:19

Basti ya que estoy trabajando en el componente se añadira tambien.

dec 08-09-2007 12:28:21

Hola,

Una cosa más José. Existe el componente "CCDEditZoom" y el componente "CCDDBEditZoom", ahora bien, teniendo en cuenta que de ambos componentes se espera similar comportamiento, ¿por qué no heredas el segundo del primero? Y luego le añades lo necesario para que se comporte como "data aware".

De este modo cuando te plantees cambios, como ahora, no será necesario que hagas cambios en ambos componentes, sino sólo en "CCDEditZoom". ¿No te parece? :)

dec 09-09-2007 21:13:39

Hola,

Acabo de añadir a CCD el componente CCDZoomPanel, que es un componente basado en parte en código del compañero Domingo Seoane, en parte en el artículo Zoom de Zarco Gajic. Se trata de un panel "lupa" que amplía en una imagen lo que esté "debajo" del ratón en un momento dado. Seguro que habéis visto ya algún componente similar. :)

http://web.madritel.es/personales2/a...on/ccd/ccd.zip

PD. ¿Ves lo que hago Eduardo? :D

eduarcol 09-09-2007 21:23:20

Cita:

Empezado por dec (Mensaje 229510)
Hola,

Acabo de añadir a CCD el componente CCDZoomPanel, que es un componente basado en parte en código del compañero Domingo Seoane, en parte en el artículo Zoom de Zarco Gajic. Se trata de un panel "lupa" que amplía en una imagen lo que esté "debajo" del ratón en un momento dado. Seguro que habéis visto ya algún componente similar. :)

http://web.madritel.es/personales2/a...on/ccd/ccd.zip

PD. ¿Ves lo que hago Eduardo? :D

Pues mira que manera de pasar el domingo jejejeje, hasta envidia me da, quisiera meter en un baul estos proyecto de BD que siempre son mas de lo mismo no me permiten innovar cosas como estas :D:D

Muy bueno dec

fer21unmsm 10-09-2007 03:20:32

algunos componentes
 
1 Archivos Adjunto(s)
Hola compañeros de club, lo prometido es deuda jeje, aquí les dejo algunos componentes que hice, claro ayudandome de los que vienen en delphi, jeje, espero les sirve, me faltó documentar ya que no tuve tiempo, pero pienso, que son autodescriptivos:)

PD: Supongo que necesitaran varias mejoras, no serán buenos pero ahi va

Saludos cordiales

Neftali [Germán.Estévez] 10-09-2007 12:12:52

Cita:

Empezado por dec (Mensaje 228944)
Acabo de añadir a CCD los componentes que el compañero Neftalí tiene publicados en su página Web.

Bueno, iba a ofrecer mis componentes para añadirlos, pero veo que Dec ya se ha adelantado... :D
Espero que os sean útiles.
Todavía no me ha dado tiempo de "revisar e instalar" el engendro (pues acabo de llegar), pero en cuanto lo haga daré aquí mis opiniones y pareceres...

dec 10-09-2007 12:15:59

Hola,

Cita:

Empezado por Neftalí
Bueno, iba a ofrecer mis componentes para añadirlos, pero veo que Dec ya se ha adelantado...

Es un ladrónnnn, que te ha robado el tiempo libreeeeeeeeee... :D :D

Julián 29-09-2007 17:25:21

Hola, dec!!

mirando por ahí he encontrado este hilo:
http://www.clubdelphi.com/foros/show...hlight=hamachi

en donde dec te interesa por la cosa de enviar archivos vía tcp, y por un chat. Así que ahí va la cosa: como algunos sabeis yo tengo un programa, en eterno desarrollo que es el ajedrezchat, que sirve para lo que de su propio nombre se puede deducir: chatear, y si se tercia jugar al ajedrez.

El programa puede hacer de servidor de chat y logicamente de cliente, de manera que cualquiera puede ponerse de servidor (abriendo, si hiciera falta, el puerto correspondiente en su router) y aceptar tantos clientes como quiera.

El caso es que para el chat de dicho programa uso dos com
ponentes: el TicsChatServer y el TicsChatClient , que no encontrareis en ninguna parte porque los he hecho yo y nadie mas los tiene, (excepto jhonny).

Son muy faciles de usar, pero aún asi tengo hech una demo sencilllita, que hice para jhonny cuando se los pase.

Se llaman Tics* porque estan hecho usando la librería, perdón, la biblioteca de componentes ICS de fpiette, que me gusta bbastante mas que los INDY.

Gueno, lo que quiero es saber si los veis interesantes para colección del club.

Por otra parte seoane tenia un código por ahí para enviar archivos vía tcp usando threads, que es lo que le vendría de perlas a estos componentes. Ademas de una limpieza de su chapucero código, jeje.

Así que me gustaria ponerlos, los componentes a vuestra disposición, y alguien se anima y los modifica o mejora o lo que sea, y sobre todo les añade algo como eso de seoane para que admita el envñio de archivos, pues me haría feliz, :)

Eso es todo, si lo veis bien busco el código y los subo donde me diga dec.


Un saludo!

PD: si alguien se anima hacer una versión con freepascal que funcione bajo linux, sería la felicidad completa. Hasta he pensado en pagar (¿alguien se ofrece?) por ello.

seoane 29-09-2007 18:56:52

Cita:

Empezado por Julián (Mensaje 234983)
Por otra parte seoane tenia un código por ahí para enviar archivos vía tcp usando threads, que es lo que le vendría de perlas a estos componentes. Ademas de una limpieza de su chapucero código, jeje.

Ese código que mencionas lo puse solo como un ejemplo de como usar los componentes que traía el Turbo delphi explorer, y la verdad es que es un poco chapuza. Tiene mucho que mejorar, sobre todo la interacción con el usuario (cancelar, parar, reanudar, informar de errores, etc ...)

Lo malo es que vengo de pelearme, por culpa de un trabajito que me surgió, con un programa de intercambio de ficheros bastante complejo y ahora mismo estoy bastante cansado del tema :(

Aunque si al final me decido a hacer algo habría que decidir primero que librerías se usarían. ¿Winsock a pelo? ¿Indy? ¿Synapse? o alguna otra librería compatible con freepascal y linux. La elección es importante, ya que se convertirá en un requisito de instalación en los futuros componentes.

jhonny 29-09-2007 20:12:14

Cita:

Empezado por Julián
El caso es que para el chat de dicho programa uso dos com
ponentes: el TicsChatServer y el TicsChatClient , que no encontrareis en ninguna parte porque los he hecho yo y nadie mas los tiene, (excepto jhonny).

Son muy faciles de usar, pero aún asi tengo hech una demo sencilllita, que hice para jhonny cuando se los pase.

Los tenia, por que cuando me los pasaste estaba trabajando en otra empresa diferente, en la cual tuve que formatear esa maquina rapidamente, (Bueno, no me quedo tiempo de nada :(, las razones de ese formateo rapido me las reservo :D, solo cumplia ordenes). Dias despues tuve que irme de allí para no volver, despues de eso tuve una de mis largas desaparecidas del Club y no tuve la oportunidad de entrar de nuevo al AjedrezChat, incluso hoy por hoy, tengo restringido el acceso por dicho puerto :(, ni con el putty he podido entender como saltarme esa restriccion :D, es una larga historia, quizas algun dia la contare.

Julián 29-09-2007 21:15:17

Cita:

Empezado por seoane (Mensaje 235012)
Ese código que mencionas lo puse solo como un ejemplo de como usar los componentes que traía el Turbo delphi explorer, y la verdad es que es un poco chapuza.

Oño!, a ver si no me explique bien: El código chapucero al que me referia es el mío, no el tuyo. Que el tuyo no lo miré nada mas que de pasada, y por cierto, de chapuza nada. Otra cosa es que le falte algo.

Un saludo aclaratorio :)

seoane 29-09-2007 22:17:21

Bueno julian, y que características piensas que puedan tener esos componentes ???. Yo me imagino uno que haga de servidor, y que tenga un solo método "listen" que dispare un thread que se ponga a la escucha en un puerto para realizar la transferencia, el método listen devuelve el puerto por el que esta escuchando. El cliente por su parte tendrá solo método "send" que envío un fichero a un puerto especifico.

Por ejemplo para realizar una transferencia, el que actúe como servidor ejecutara el método listen y el numero de puerto que le devuelva se lo pasa al cliente, el cliente por su parte usara el método send. Lo que falta es saber como mandara el servidor la información del puerto al cliente, pues si se supone que es un accesorio de un chat, ya debe de existir una conexión entre los dos, así que se puede utilizar esa.

:( Me da la sensación de que no me he explicado muy bien

dec 29-09-2007 22:29:56

Hola,

A ver, ponersus de acuerdo. :)

PD. Pero está bien, está bien. ;)

seoane 30-09-2007 03:12:34

Vamos a ver Julian, un primer esbozo podría ser esto:
Código Delphi [-]
unit transfer;

interface

uses Windows, Sysutils, Classes, Winsock;

type
  EBindError = class(Exception);
  EConnectError = class(Exception);
  EWinsockError = class(Exception);

  TFileReceiver = class(TThread)
  private
    FFile: TFileStream;
    FReceived: int64;
    FServer: TSocket;
    FSocket: TSocket;
    FToken: int64;
    procedure Receive;
    function WaitForData(Count: Integer): Boolean;
  protected
    procedure Execute; override;
  public
    constructor Create(Filename: String; Port: Integer; Token: int64);
    destructor Destroy; override;
    property Received: int64 read FReceived;
  end;

  TFileSender = class(TThread)
  private
    FFile: TFileStream;
    FSended: int64;
    FSocket: TSocket;
    FToken: int64;
  protected
    procedure Execute; override;
  public
    constructor Create(Filename: String; Host: String; Port: Integer;
      Token: int64);
    destructor Destroy; override;
    property Sended: int64 read FSended;
  end;

implementation

const
  BUFFER_SIZE = 32 * 1024;

{ TFileReceiver }

constructor TFileReceiver.Create(Filename: String; Port: Integer; Token: int64);
var
  Addr: TSockAddr;
begin
  FFile:= nil;
  FReceived:= 0;
  FServer:= INVALID_SOCKET;
  FSocket:= INVALID_SOCKET;
  FToken:= Token;
  FFile:= TFileStream.Create(Filename,fmCreate or fmShareDenyWrite);
  FServer:= Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
  if FServer = INVALID_SOCKET then
    raise EWinsockError.Create('Socket');
  Addr.sin_family:= AF_INET;
  Addr.sin_port := htons(Port);
  Addr.sin_addr.s_addr := htonl(INADDR_ANY);
  if Bind(FServer, Addr, sizeof(Addr)) = SOCKET_ERROR then
    raise EWinsockError.Create('Bind');
  if Listen(FServer, 1) = SOCKET_ERROR then
    raise EWinsockError.Create('Listen');
  FreeOnTerminate:= TRUE;
  inherited Create(TRUE);
end;

destructor TFileReceiver.Destroy;
begin
  if FSocket <> INVALID_SOCKET  then
    CloseSocket(FSocket);
  if FServer <> INVALID_SOCKET  then
    CloseSocket(FServer);
  FFile.Free;
  inherited;
end;

procedure TFileReceiver.Execute;
var
  Addr: TSockaddr;
  Size: Integer;
  FDSet: TFDSet;
  TimeVal: TTimeVal;
begin
  while not Terminated do
  begin
    TimeVal.tv_sec:= 0;
    TimeVal.tv_usec:= 10000;
    FD_ZERO(FDSet);
    FD_SET(FServer, FDSet);
    if Select(0, @FDSet, nil, nil, @TimeVal) > 0 then
    begin
      Size:= Sizeof(Addr);
      FSocket:= Accept(FServer, @Addr, @Size);
      if FSocket <> INVALID_SOCKET then
      begin
        Receive;
        break;
      end;
    end;
  end;
end;

procedure TFileReceiver.Receive;
var
  i: Integer;
  Buffer: PChar;
  Token: int64;
begin
  if WaitForData(Sizeof(Token)) then
    if Recv(FSocket, Token, Sizeof(Token), 0) = Sizeof(Token) then
      if Token = FToken then
      begin
        GetMem(Buffer,BUFFER_SIZE);
        try
          while WaitForData(1) do
          begin
            i:= Recv(FSocket, Buffer^, BUFFER_SIZE, 0);
            if i > 0 then
            begin
              FFile.WriteBuffer(Buffer^,i);
              inc(FReceived, i);
            end else
              break;
          end;
        finally
          FreeMem(Buffer);
        end;
      end;
end;

function TFileReceiver.WaitForData(Count: Integer): Boolean;
var
  i: Integer;
  Buffer: PChar;
  FDSet: TFDSet;
  TimeVal: TTimeVal;
begin
  Result:= FALSE;
  GetMem(Buffer,Count);
  try
    while not Terminated do
    begin
      TimeVal.tv_sec:= 0;
      TimeVal.tv_usec:= 10000;
      FD_ZERO(FDSet);
      FD_SET(FSocket, FDSet);
      if Select(0, @FDSet, nil, nil, @TimeVal) > 0 then
      begin
        i:= Recv(FSocket, Buffer^, Count, MSG_PEEK);
        if i > 0 then
        begin
          if i = Count then           
          begin
            Result:= TRUE;
            break;
          end else
            Sleep(10);
        end else
          break;
      end;
    end;
  finally
    FreeMem(Buffer);
  end;
end;

{ TFileSender }

constructor TFileSender.Create(Filename, Host: String; Port: Integer;
  Token: int64);
var
  Address: u_long;
  HostEnt: phostent;
  Addr: sockaddr_in;
begin
  FFile:= nil;
  FSended:= 0;
  FSocket:= INVALID_SOCKET;
  FToken:= Token;
  FFile:= TFileStream.Create(Filename,fmOpenRead or fmShareDenyWrite);
  Address:= inet_addr(Pchar(Host));
  if Address = INADDR_NONE then
  begin
    HostEnt:= gethostbyname(PChar(Host));
    if HostEnt <> nil then
      Address:= PInAddr(HostEnt.h_addr_list^)^.S_addr;
  end;
  if Address <> INADDR_NONE then
  begin
    FSocket:= Socket(AF_INET, SOCK_STREAM, 0);
    if FSocket = INVALID_SOCKET then
      raise EWinsockError.Create('Socket');
    Addr.sin_family:= AF_INET;
    Addr.sin_addr.S_addr:= Address;
    Addr.sin_port:= htons(Port);
    if Winsock.Connect(FSocket, Addr, Sizeof(Addr)) = SOCKET_ERROR then
      raise EConnectError.Create('Connect');
  end else
    raise EConnectError.Create('Connect');
  FreeOnTerminate:= TRUE;
  inherited Create(TRUE);
end;

destructor TFileSender.Destroy;
begin
  if FSocket <> INVALID_SOCKET  then
    CloseSocket(FSocket);
  FFile.Free;
  inherited;
end;

procedure TFileSender.Execute;
var
  i,j: Integer;
  Buffer: PChar;
begin
  if Send(FSocket,FToken,Sizeof(FToken),0) = Sizeof(FToken) then
  begin
    GetMem(Buffer,BUFFER_SIZE);
    try
      i:= FFile.Read(Buffer^,BUFFER_SIZE);
      while (i > 0) and not Terminated do
      begin
        j:= Send(FSocket,Buffer^,i,0);
        if i > 0 then
        begin
          inc(FSended,j);
          if j <> i then
            FFile.Seek(j-i,soCurrent)
        end else
          break;
        i:= FFile.Read(Buffer^,BUFFER_SIZE);
      end;
    finally
      FreeMem(Buffer);
    end;
  end;
end;

var
  WSAData: TWSAData;

procedure Startup;
begin
  if WSAStartup(MAKEWORD(1, 1), WSAData) <> 0 then
    raise EWinsockError.Create('WSAStartup');
end;

procedure Cleanup;
begin
  if WSACleanup <> 0 then
    raise EWinsockError.Create('WSACleanup');
end;

initialization
  Startup;

finalization
  Cleanup;

end.
Son dos clases descendientes de la clase TThread. Solo utilizo funciones del Winsock, nada de librerias.

Y un ejemplo de como usarla seria el siguiente:
- Uno de los usuarios del chat decide mandar un archivo a otro, así que le manda un mensaje pidiéndole permiso.
- El otro crea una instancia del TFileReceive y le devuelve un mensaje con el numero de puerto y un código de seguridad (token)
- Ahora el primero crea una instancia del TFileSender, usando el puerto y el token que acaba de recibir, y envía el archivo.

Esto llevado a código:
Código Delphi [-]
// Para crear el receptor
with TFileReceiver.Create('c:\borrame.exe',61985,789) do
  begin
    Resume;
  end;

// Para crear el emisor
begin
 with TFileSender.Create(ParamStr(0),'127.0.0.1',61985,789) do
  begin
    Resume;
  end;
end;
El receptor y el emisor solo se tienen que poner de acuerdo en el puerto y el token, si el emisor y el receptor ya mantienen una conexión de chat no sera difícil implementar un protocolo para hacer eso.

Bueno, son las 3 AM y esto es todo lo que se me ocurre :p

Espero que se me entienda.

Julián 02-10-2007 17:50:27

Jau!

tengo muy poco tiempo estos días, mas que poco ninguno,por eso no he podido poner esto antes:

icsChatComponents

Ahí van los componentes para tener un servidor y cliete chat, con el código fuente y una demo.
Mi consejo es que, a quien le interese el tema, pruebe la demo antes que nada. Y despues que se ponga a mirar el código chapucerillo, jeje.

Para probar la demo no hay mas que ejecutarla, y activar el servidor, y despues si activa el cliente se conecta al server. Despues puede ejecutar otra instancia del programa y conectarse al mismo server ( Con otro Nick para que no de error, claro!!)

Gueno, ya me direis, un saludo!

Lo olvidava: para instalar los componentres se necesitan los ICS de Fpiette.

dec 03-10-2007 09:01:50

Hola,

Está muy bien Julián. La "demo" por lo menos funciona estupendamente. :)

Julián 03-10-2007 13:32:20

Cita:

Empezado por dec (Mensaje 235770)
Hola,

Está muy bien Julián. La "demo" por lo menos funciona estupendamente. :)

Jau!

Pues si, si miras el código encontraras unas cosas bastante retorcidas en los procesos de conexión y validación de clientes al servidor de chat, y sé que dicho código es en teoría, merecedor de un buen suspenso en un éxamen de programación en una universidad.

Perooooooo... el hecho cierto y comprobado es que funciona, cmo tu dices, bien. ¿y como me atrevo a afirmar eso?

Ahí vá: el desarrollo de ese código tuvo duras pruebas que superar. Era para el ajedrezchat, que se usaba, y se sigue usando, en los canales #delphi y #ajedrez del irc-hispano, y en esa epoca había 3 o 4 hijosdelagranputa que se dedicaban a sabotear y a putear a los usuarios de estos canales, y en concreto al ajedrezchat. De manera que yo sacaba una versión del programa, lo daba a probar, y automáticamente, ahí tenias a esos 4 cabrones conectandose por telnet y por ssh a cualquier ajedrezchat que se pusiera de server. Incluso se hacian programillas con un botón "Conectar un socket al ajedrezchat" el cual pulsaban rapida y repetidamente hasta que reventaban literalmente cualquier ajederzchat de servidor. Un infierno.

Pero yo soy muy cabezón. Y el resultado será un código muy remendao, pero, despues de perder alguna batalla, gané la guerra. Con un par.

No dudo que algún experto programador o hacrker o lo sea sea capaz, incluso fácilmente, de tumbarme un server de ajedrezchat. Pero aquellos cuatro hackercillos de pacotilla no pudieron, tuvieron que rendirse, humillados y derrotados, y agachar su vacía cabeza y retirarse avergonzados.

Así que, algún experto podrá criticar, con gran razón, mi código, y yo se lo agradeceré (aún mas le agradecería que lo arreglara). Pero el hecho, el hecho cierto, es que funcionar, funciona, y muy bien. Y eso es lo que yo pretendía.

Por cierto, que estuve probando con los INDY, antes que los ICS, pero toido lo que conseguía era tremendamente vulnerable a cualquier ataque, aunque fuera un pequeño 'flood'. Por eso tuve que volverme a los ICS.

Un saludo!


La franja horaria es GMT +2. Ahora son las 19:24:27.

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