Boletín Pascal #42
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
Boletín Pascal #42 - 18-ENE-2003 Índice 1. Unas palabras del editor 2. TDataSet => Excel (No se requiere OLE ni EXCEL) Clase TDataSetToExcel 3. Aplicaciones distribuidas, la forma fácil (I) Como intercambiar datos entre procesos en aplicaciones distribuidas 4. Llamadas a Qt causan problemas de instalación para componentes en el IDE BCB de Kylix 5. Inline Assembler en Delphi (VI) - Llamando procedimientos externos 6. Foros / listas de correo 7. Delphi en la Red - Componentes, librerías y aplicaciones . Shareware . Freeware - Artículos, trucos y consejos - Tutoriales - Otros enlaces ________________________________________________________________________ Tecno Soft Solutions. Reseller Autorizado de Symbol Technologies, líder mundial en captura de códigos de barras. >>> http://www.tecno-symbol.com ________________________________________________________________________ ¡Feliz Año Nuevo! Ha transcurrido un largo tiempo desde la última edición. Lo siento por eso, pero con afán de compensar, al menos para la primera parte del año habrá dos ediciones del boletín por mes. Me enorgullece anunciar que el boletín ha alcanzado 7.500 suscriptores, y quisiera agradecer a todos por haber hecho esto posible, en especial a quienes recomiendan el boletín a sus colegas o lo votan en los rankings. A propósito, espero que puedan seguir contribuyendo para que alcancemos la meta de los 10.000 suscriptores para permitir que esta publicación pueda continuar. Una forma simple es votando por el boletín en este ranking: http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium Sólo hay que seguir el enlace y hacer clic en "here" ("aquí") donde dice "Click here to vote!" ("¡Haga clic aquí para votar!"). Eso es todo; luego aparecerá el ranking de los más votados. Son sólo unos segundos que significan mucho para nosotros. Quisiera agradecer a Mike Heydon, Eugene Mayevski y Richard Winston por contribuir artículos para esta edición, y me complace entregarle a Eugene Mayevski una licencia de llPDFLib: * llPDFLib v1.1 - por llionsoft, Shareware ($70, $280 con fuentes) llPDFLib en una biblioteca en puro Object Pascal para crear documentos PDF. No usa ninguna DLL ni software externo de terceras partes para generar ficheros PDF. La librería consiste del componente TPDFDocument con propiedades y métodos como los del TPrinter de Delphi, pero diseñado para generar un fichero PDF. http://www.llion.net/ Para la próxima edición, tenemos disponibles los siguientes premios para dos de los autores que colaboren artículos en inglés: * SDL Component Suite 7.0 - por Software Development Lohninger ($99) La SDL Component Suite provee un amplio rango de componentes para la ciencia y la ingeniería, por ejemplo matemáticas, estadísticas, química, diagramas, visualización de datos, transformadas de Fourier (FFT), ploteos 3D, mapas geográficos, ajuste de curvas, etc. Disponible para Delphi 3-7 y BCB 4-6. http://www.lohninger.com/sdlindex.html * TSDBGridFooter v2.0 por Jovan Sedlan, Shareware ($74.50) Este componente es una poderosa herramienta que provee cálculos auto- máticos para su DBGrid y muestra información en un pie configurable debajo de la grilla. Ha sido diseñado para trabajar con TSDBGrid (también incluido), aunque puede usarse con cualquier descendiente de TCustomDBGrid. http://www.sedlan.com/dbgrid_footer.php En las noticias, en el sitio web de Borland hay un parche oficial para Delphi 6, y una actualización de Delphi for .NET preview (disponible para descarga para los usuarios registrados de Delphi 7). Pueden encontrar las descripciones y los enlaces correspondientes más abajo en la sección Delphi en la Red (bajo el título "Otros enlaces"). Espero que disfruten esta edición. Saludos, Ernesto De Spirito eds2004 @ latiumsoftware.com ________________________________________________________________________ Object Inspector 1.2 (por Greatis Software) es un juego de componentes que incluye un componente especial para acceder a las propiedades y eventos de cualquier componente, un inspector común que se puede usar para inspeccionar todo en su aplicación, y un inspector de componentes listo para usar que imita al Inspector de Objetos del IDE. Admite la configuración de fuentes y colores. http://www.greatis.com/objinsp.htm ________________________________________________________________________ 2. TDataSet => Excel (No se requiere OLE ni EXCEL) Clase TDataSetToExcel Copyright (c) 2002 Mike Heydon Esta clase producirá una hoja de cálculo de Excel desde un TDataSet. No se requiere OLE o que el Excel esté instalado para crear el archivo. El problema con Excel OLE es que tiende a ser algo lento. La clase usa funciones estándar de E/S de Delphi y es considerablemente más rápida que las llamadas OLE. Ejemplo: var XL : TDataSetToExcel; begin XL := TDataSetToExcel.Create(MyQuery,'c:\temp\prueba.xls'); XL.WriteFile; XL.Free; end; Se define el tamaño de las columnas correctamente. Los números son formateados en "Courier" con formato "###.###.##0,00" para los flotantes y "0" para los enteros. Las fechas se formatean como "dd-MMM-yyyy hh:nn:ss". Las cabeceras de las columnas están en negrita y están recuadradas y sombreadas. __________________ NOTA DEL EDITOR: Esta clase se provee en la creencia que es de algún modo útil para algunos propósitos, pero debe advertirse que es sólo una clase básica y que necesita muchas mejoras. Por ejemplo, el formateado de las celdas está incrustado en el código, así que la clase no soporta configuraciones regionales. La clase necesitaría propiedades para varios formatos de celdas, por ejemplo property FormatText : string property FormatInt : string property FormatFloat : string property FormatDateTime : string property FormatDate : string property FormatTime : string o métodos de salto de página, propiedades para los colores de las celdas... ¡la lista es interminable! Por favor no contacten al autor requiriendo características. La clase se provee "COMO ESTÁ". ________________________________________________________________________ JfControls Lib. Multilenguaje. Multiapariencia. Skins. Privilegios. Más de 40 componentes integrados y personalizables. Múltiples problemas de programación resueltos. Administración centralizada de recursos. Para Delphi 3-7 y C++ Builder 3-6. http://www.jfactivesoft.com/spindex.htm ________________________________________________________________________ 3. Aplicaciones distribuidas, la forma fácil (I) Como intercambiar datos entre procesos en aplicaciones distribuidas Por Eugene Mayevski <Mayevski @ eldos.org> Hay muchas formas de transferir datos de un proceso a otro. Todos esos métodos tienen algunas ventajas, pero también algunas desventajas. ¿Hay alguna forma de tener un sistema flexible de intercambio de dato sin tener que ahondar en los detalles técnicos? Cuando una aplicación consiste de más de un proceso, uno se ve ante la cuestión de optimizar las comunicaciones entre estos procesos. Estas aplicaciones distribuidos incluyen rejillas computacionales, redes peer-to-peer, aplicaciones cliente-servidor y aplicaciones de negocio de 3 capas. Todas usan diferentes formas de enviar información a otros procesos y de recibir respuestas. Además, hay muchos tipos de aplicaciones comunes que se beneficiarían de ser divididas en dos o más partes. Éstas son aplicaciones que realizan tareas de fondo como monitorear sitios web, filtrar tráfico de Internet, revisar archivos y correo en busca de virus, por citar algunas. Usual- mente la lógica de negocio puede ser fácilmente separada de la interfaz de usuario, y la interfaz de usuario puede ser cargada baja petición. Todas estas aplicaciones tienen algo en común. Esto es la necesidad de proveer alguna forma de intercambio de datos entre las diferentes partes de la aplicación. Hay muchas formas de intercambio de datos, que se usan en diferentes situaciones. Las más frecuentemente usadas en el mundo de Windows son (comenzando por la más simple): 1) Mensajes de Windows; 2) Mailslots de Windows; 3) Archivos mapeados en memoria (Memory-mapped files - MMF); 4) Sockets TCP o UDP; 5) COM/DCOM Cada uno de estos métodos tiene sus propias ventajas. Los mensajes de Windows son muy fáciles de usar y de trabajar con ellos. Los mailslots son bastante como los mensajes de Windows pero funcionan en redes locales. Los archivos mapeados en memoria son una forma rápida y relativamente fácil de intercambiar datos cuando uno no puede trabajar con manejadores (handles) de ventana (por ejemplo servicios y aplica- ciones de consola). Los sockets son universales y multiplataforma. COM/DCOM está orientado a objetos y es de bastante alto nivel. Sin embargo, cada uno de esos métodos tiene sus propias desventajas. COM, los mensajes de Windows y los archivos mapeados en memoria sólo son utilizables dentro de la misma computadora (los archivos mapeados en memoria se pueden abrir desde unidades de red, pero no se garantiza la integridad y actualidad de los datos). Los mailslots y los sockets UDP no son confiables (esto significa que cuando uno envía datos no puede fácilmente preguntar si el receptor recibió los datos exitosamente). Los sockets TCP se pueden usar en una amplia variedad de escenarios, pero hay un problema: sólo trabajan con corrientes (streams), quedando a cargo de nuestra aplicación dividir las corrientes de datos en bloques de datos y procesar estos bloques. DCOM es una solución sofisticada que es muchas veces difícil de instalar y mantener, y se transforma en una pesadilla cuando comenzamos a tratar con la seguridad. No hace decir que todos los métodos descritos, excepto los sockets (y caras implementaciones DCOM de terceros creadas para sistemas basados en Unix), son sólo para Windows. Si uno crea una aplicación que debería trabajar no sólo en la plataforma Windows, quedaría limitado a los sockets. Los sockets son una solución poderosa al permitirnos controlar casi todos los aspectos del envío de datos – como y cuando se envían los datos, cuanto tiempo la aplicación espera una respuesta, y otras cosas. Un aspecto negativo de esta flexibilidad es que uno DEBE controlar estos aspectos (tal vez no todos, pero la mayoría de ellos). Volvamos a los mensajes de Windows. Son realmente simples – una estructura con varios campos que pueden ser llenados y enviados al receptor con una llamada. Y cuando uno necesita pasar un bloque de datos, puede usar el mensaje WM_COPYDATA. "Qué lindo sería si hubiera métodos que usan la misma técnica tanto en la misma computadora como a través de redes", Ud. puede pensar. Nosotros pensamos lo mismo. Desa- fortunadamente, no es posible... Bueno, hasta ahora. Ahora puede combinar la simplicidad del sistema de mensajes de Windows con el poder y la flexibilidad de la comunicación por sockets o de los archivos mapeados en memoria usando el armazón MsgConnect. MsgConnect encapsula las operaciones de bajo nivel usadas para esta- blecer comunicación e intercambiar información, y provee una API simple API que se parece mucho al sistema de mensajes de Windows. La secuencia de acciones necesarias para agregar comunicaciones multiplataforma a su aplicación puede caber en 20 líneas de código: 1) crear una instancia del objeto Messenger (usado para enviar un mensaje); 2) crear una instancia del objeto Transport (usado para enviar mensajes a los receptores. Necesitará una instancia de Transport por cada transporte que use, ya sea sockets o MMF); 3) crear una instancia del objeto Queue (usado para recibir mensajes); 4) vincular estos objetos con un par de llamadas a métodos; 5) definir un manejador para el evento que se dispara cuando se recibe un mensaje. Eso es todo. Ya puede comenzar a enviar y recibir mensajes. ¿Por qué usar MsgConnect es más fácil que usar formas convencionales de comunicación? Antes que nada, MsgConnect oculta los detalles, pero los mantiene disponibles para usar. El armazón le permite ajustar los objetos de transporte para alcanzar el máximo rendimiento para cualquier tipo de aplicación, desde mensajería convencional hasta pesado intercambio de datos. Si no quiere ahondar en los detalles, MsgConnect funcionará perfectamente con la configuración predeterminada. Por supuesto, necesitará diseñar el protocolo, es decir, definir que mensajes se usan para diferentes propósitos en su aplicación, y esto será una parte de la lógica de negocios de su aplicación. No necesita excavar en los detalles de la implementación del protocolo TCP o administrar la seguridad para los MMF. La segunda cosa es que que el intercambio de mensajes es universal. Con MsgConnect el mensaje puede contener cualquier dato binario y el receptor puede cambiar este bloque de datos y devolverlo con el mismo mensaje. En otras palabras, los lados del intercambio de datos pueden hacer transferencia de datos ida y vuelta con apenas un mensaje. El resultado es que MsgConnect se puede utilizar tanto en comunicaciones unidireccionales como bidireccionales sin limitaciones. La tercera ventaja es que para cambiar la comunicación de computadora local a remota sólo necesita agregar otro objeto Transport y cambiar la dirección a la que serán enviados los mensajes. No necesita implementar otro algoritmo o manejar otro algoritmo de bajo nivel. Cuarto, su aplicación puede intercambiar información con aplicaciones que funcionen en diferentes plataformas. MsgConnect soporta un amplio rango de plataformas (actualmente Windows, Windows CE, Linux, Unix, Java, .NET y más por venir en el futuro cercano). Y último pero no menos importante, si usted desarrolla un proyecto de código abierto o un gran sistema propietario, MsgConnect tiene una licencia conveniente para usted. Está disponible como código abierto y provee servicios adicionales para los usuarios que obtengan la licencia comercial. __________________ MsgConnect es un proyecto conjunto de EldoS Group (http://www.eldos.org) (http://www.eldos.org) y TamoSoft (http://www.tamos.com), y se puede obtener gratis con código fuente completo en http://www.msgconnect.com (ya sea bajo la licencia GPL o una licencia de Evaluación, actualizable a una licencia Comercial). ________________________________________________________________________ Greatis Runtime Fusion incluye Form Designer Pro ($ 49.95) y Object Inspector Pro ($ 49.95), y cuesta sólo $89.90 - Ahórrese $10 y obtenga demos adicionales. Permita que el usuario diseñe formularios en tiempo de ejecución con Runtime Fusion. >>>> http://www.greatis.com/runtime.htm ________________________________________________________________________ 4. Llamadas a Qt causan problemas de instalación para componentes en el IDE BCB de Kylix Por Richard Winston Resumen: Si un componente escrito en Delphi realiza una llamada a Qt, instalar el componente en el IDE de Kylix BCB puede ser difícil. Este artículo describe como superar este problema. Tuve problemas con un componente que escribí que usaba llamadas a Qt. El procedimiento que causaba los problemas escribía Texto en la ubicación (X,Y) con el ángulo especificado en Angulo usando el siguiente código: Uses Qt, QGraphics; procedure TRbwRegla.PintarRotado(const X, Y, Angulo: double; const Texto: string); begin Canvas.Start; QPainter_translate(QPainterH(Canvas.Handle),X,Y); try QPainter_rotate(QPainterH(Canvas.Handle),Angulo); try Canvas.TextOut(0,0,Texto); finally QPainter_rotate(QPainterH(Canvas.Handle),-Angulo); end; finally QPainter_translate(QPainterH(Canvas.Handle),-X,-Y); Canvas.Stop; end; end; Esto funcionaba bien en el IDE de Kylix Delphi, pero no compiló en el IDE de Kylix C++. Los mensajes de error fueron: [Linker Error] Unresolved external 'Qt::QPainter_translate( QT::QPainter *, double, double)' referenced from QrbwRuler.o y [Linker Error] Unresolved external 'Qt::QPainter_rotate( QT::QPainter *, double, double)' referenced from QrbwRuler.o Pude escribir un componente similar en el IDE de Kylix C++ usando código como este: void __fastcall TRbwRegla::PintarRotado(const double X, const double Y, const double Angulo, const AnsiString Texto) { Canvas->Start(); Qt.QPainter_translate((QPainter__*)Canvas->Handle,X,Y); __try { Qt.QPainter_rotate((QPainter__*)Canvas->Handle,Angulo); __try { Canvas->TextOut(0,0,Texto); } __finally { Qt.QPainter_rotate((QPainter__*)Canvas->Handle,-Angulo); }; } __finally { Qt.QPainter_translate((QPainter__*)Canvas->Handle,-X,-Y); Canvas->Stop(); }; } Logré obtener componentes que trabajaran en ambos IDE declarando un procedimiento virtual abstracto y luego declarando dos nuevos componentes - uno para cada IDE - y sobreescribiendo (overriding) ese procedimiento abstracto con el código que funcione en ese IDE. Sin embargo, si se desea usar herencia de formularios visual en el IDE de C++ para heredar de formularios creados en el IDE de Delphi, esto no funciona. Podía ver estos formularios en el IDE, pero cuando trataba de compilar el proyecto, reportaba errores del enlazador. Esto parecía deberse a que las versiones Delphi y C++ del componente en realidad no fueran la misma cosa, aún si tenían idénticos nombres y funcionalidad. Esta es realmente la misma clase de problema que estaba intentando evitar al crear los dos componentes en primer lugar. El IDE de C++ y el de Delphi parecen necesitar diferentes versiones de QPainter_translate y QPainter_rotate. El IDE de Delphi parece querer las que están declaradas en Qt.pas mientras que el IDE de C++ parece querer las que están declaradas en qpainter.hb. Mi solución final fue instalar el componente en el IDE C++ como un paquete. Seleccionar Component|Install Packages... Hacer clic en el botón Add... Seleccionar un archivo *.so generado por el IDE de Delphi. Hacer clic en el botón Open. Hacer clic en el botón OK. Por cada paquete, necesitamos generar un archivo *.a: File|CloseAll File|New|Other|Library File|Save Project As... y guardar con mismo nombre raíz que al archivo paquete para el IDE de Delphi Project|Add to Project Seleccionar el archivo *.so File | Save All Ahora estamos listos para realmente construir la librería: Project | Build Click the OK button. __________________ Richard Winston desarrolla interfaces gráficas para programas de modelado de aguas subterráneas para el U.S. Geological Survey. ________________________________________________________________________ ¿Cuándo fue la última vez que votó por el Boletín Pascal? Por favor apoye esta iniciativa votándonos en "The Programming Top 100!" http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium Sólo hay que seguir el enlace y hacer clic en "here" ("aquí") donde dice "Click here to vote!" ("¡Haga clic aquí para votar!"). Luego aparecerá el ranking de los más votados. Su voto significa mucho para nosotros. ________________________________________________________________________ 5. Inline Assembler en Delphi (VI) - Llamando procedimientos externos Funciones API y la convención de llamadas Stdcall ================================================= Las funciones API se llaman transparentemente desde inline assembler con la sentencia CALL. Sin embargo debemos tener en cuenta que el paso de parámetros a las funciones API es diferente puesto que normalmente usan la convención de llamadas Stdcall, en vez de la convención de llamadas Register, que es la que hemos visto hasta ahora por ser la convención predeterminada. En la convención de llamadas Stdcall, todos los parámetros se pasan en la pila, de derecha a izquierda, es decir, el último parámetro (el de la derecha) se empuja primero, y el primer parámetro (el de la izquierda) se empuja último, de modo que será el que quede arriba de la pila. He aquí un ejemplo de un procedimiento que llama a una función API: procedure OcultarFormulario(Handle: THandle); // Windows.ShowWindow(Handle, SW_HIDE); asm push SW_HIDE // push 0 // Pasa el 2do parámetro push Handle // push eax // Pasa el 1er parámetro call Windows.ShowWindow // Llama a la API ShowWindow end; Si tenemos que llamar a un método que use la convención stdcall, recordemos que el puntero Self es un primer parámetro invisible, así que sería empujado al último en la pila. Si tenemos que escribir funciones que usen la convención stdcall, no hay nada especial de lo que debamos preocuparnos. El compilador siempre crea un marco de pila (stack frame) y las referencias a nombres de parámetros se convierten en direcciones relativas al puntero base (EBP): function SumarYMultiplicar(i1, i2, i3: integer): integer; stdcall; asm // ==> push ebp; mov ebp, esp // Result := (i1 + i2) * i3; mov eax, i1 // mov eax, [ebp+8] add eax, i2 // add eax, [ebp+12] imul i3 // imul [ebp+16] end; // ==> pop ebp; ret 12 Esta es una llamada de ejemplo a la función: asm // a := SumarYMultiplicar(1, 2, 3); // el resultado debería ser 9 push 3 // primero se empuja el último parámetro push 2 push 1 call SumarYMultiplicar mov a, eax end; Tras entrar a la función, la pila se vería así: | | +----------------+ | Viejo EBP | [EBP], [ESP] +----------------+ | Dir.de Retorno | [EBP+4] +----------------+ | i1 = 1 | [EBP+8] +----------------+ | i2 = 2 | [EBP+12] +----------------+ | i3 = 3 | [EBP+16] +----------------+ | | Librerías C/C++ y la convención Cdecl ===================================== A veces necesitamos acceder a funciones en archivos objeto (.OBJ), librerías estáticas (.LIB) o librerías dinámicas (.DLL) escritas en C o C++, y bastante frecuentemente estas funciones usan la convención de llamadas Cdecl. Es muy parecida a la convención Stdcall, pero la pila debe ser limpiada por el llamador, es decir, el llamador debe hacer "pop" a los parámetros que empujó en la pila, o -mejor aún- incrementar el puntero de pila. function SumarYMultiplicar(i1, i2, i3: integer): integer; cdecl; asm // ==> push ebp; mov ebp, esp // Result := (i1 + i2) * i3; mov eax, i1 // mov eax, [ebp+8] add eax, i2 // add eax, [ebp+12] imul i3 // imul [ebp+16] end; // ==> pop ebp; ret Nótese en el comentario de la última línea que la función no mueve el puntero de pila como lo hizo en el ejemplo anterior que usaba la convención Stdcall, de modo que el llamador es quien es responsable de ello. Esta es una llamada de ejemplo para la función: asm // a := SumarYMultiplicar(1, 2, 3); // el resultado debería ser 9 push 3 // primero se empuja el último parámetro push 2 push 1 call SumarYMultiplicar add esp, 12 // limpiar la pila mov a, eax end; Obsérvese que si los parámetros fueran de tipo Byte en vez de Integer, aún así deberíamos mover el puntero de pila en 12 bytes pues cada uno de los tres parámetros igual tomaría 32 bits (4 bytes). La convención de llamadas Pascal ================================ Muchos programadores en C/C++ prefieren la convención de llamadas Pascal por sobre la convención de llamadas Cdecl porque es más compacta y también rápida puesto que la función llamada limpia la pila en la sentencia RET, tal como también sucede en la convención Stdcall. La convención Pascal es como la convención Stdcall, pero los parámetros se pasan de izquierda a derecha en vez de derecha a izquierda, es decir, el primer parámetro (el de la izquierda) se empuja primero, y el último parámetro (el de la derecha) se empuja último: function SumarYMultiplicar(i1, i2, i3: integer): integer; pascal; asm // ==> push ebp; mov ebp, esp // Result := (i1 + i2) * i3; mov eax, i1 // mov eax, [ebp+16] add eax, i2 // add eax, [ebp+12] imul i3 // imul [ebp+8] end; // ==> pop ebp; ret 12 Nótese que las direcciones de los parámetros se traducen de manera diferente que en los ejemplos anteriores. Este es un ejemplo de llamada a la función: asm // a := SumarYMultiplicar(1, 2, 3); // el resultado debería ser 9 push 1 // primero se empuja el primer parámetro push 2 push 3 call SumarYMultiplicar mov a, eax end; Tras entrar a la función, la pila se vería así: | | +----------------+ | Viejo EBP | [EBP], [ESP] +----------------+ | Dir.de Retorno | [EBP+4] +----------------+ | i3 = 3 | [EBP+8] +----------------+ | i2 = 2 | [EBP+12] +----------------+ | i1 = 1 | [EBP+16] +----------------+ | | ________________________________________________________________________ 6. Foros / listas de correo Recordamos a los suscriptores las direcciones de nuestros foros. Para unirse a algún foro, lo más recomendable es hacerlo desde la web para así tener acceso a todas las áreas del foro y la configuración de las opciones de suscripción, pero también es posible suscribirse por email. Para suscribirse desde la web es necesario poseer un ID de Yahoo! (si no tienes el tuyo, puedes conseguirlo gratis registrándote como usuario de Yahoo!). * Delphi-abierto. Programación en Delphi (todos los niveles). Si estás en la etapa de aprendizaje o si no te agradan los foros discriminados por niveles, este foro es para ti. http://espanol.groups.yahoo.com/group/delphi-abierto Suscripción: http://espanol.groups.yahoo.com/group/delphi-abierto/join delphi-abierto-subscribe@gruposyahoo.com * Delphi-intermedio. Programación en Delphi (nivel intermedio). Si ya sabes mucho de Delphi, pero todavía te falta un largo trecho para ser un gurú (o no tanto), este foro es para ti. http://espanol.groups.yahoo.com/group/delphi-intermedio Suscripción: http://espanol.groups.yahoo.com/group/delphi-intermedio/join delphi-intermedio-subscribe@gruposyahoo.com * Delphi-avanzado. Programación en Delphi. Sólo para gurús. http://espanol.groups.yahoo.com/group/delphi-avanzado Suscripción: http://espanol.groups.yahoo.com/group/delphi-avanzado/join delphi-avanzado-subscribe@yahoogroups.com * GrupoKylix. Programación en Kylix. http://espanol.groups.yahoo.com/group/GrupoKylix Suscripción: http://espanol.groups.yahoo.com/group/GrupoKylix/join GrupoKylix-subscribe@yahoogroups.com * FreePascal-es. Programación en Free Pascal (freepascal.org). http://espanol.groups.yahoo.com/group/freepascal-es Suscripción: http://espanol.groups.yahoo.com/group/freepascal-es/join freepascal-es-subscribe@yahoogroups.com * Desarrolladores-Software. Un lugar para tratar todos aquellos temas relacionados con el desarrollo de software y su comercialización, y para compartir experiencias en el ámbito laboral, profesional o comercial con otros. http://es.groups.yahoo.com/group/desarrolladores-software Suscripción: http://es.groups.yahoo.com/group/desarrolladores-software/join desarrolladores-software-subscribe@yahoogroups.com * Componentes. Un foro para buscar/recomendar componentes de software (componentes VCL y CLX, objetos ActiveX, librerías DLL, etc.), así como utilidades, tutoriales, información, etc. http://espanol.groups.yahoo.com/group/componentes Suscripción: http://espanol.groups.yahoo.com/group/componentes/join componentes-subscribe@yahoogroups.com ________________________________________________________________________ 7. Delphi en la Red Por Dave Murray <irongut @ vodafone.net> Componentes, librerías y aplicaciones ===================================== Shareware/Commercial -------------------- * Greatis Form Designer v3.4 - por Greatis Software, Shareware ($49.95) Es un diseñador de formularios en tiempo de ejecución que le permite mover y cambiar el tamaño de cualquier control de su formulario. No necesita preparar su formulario para usar Form Designer. Simplemente suelte el componente TFormDesigner en cualquier formulario, establezca la propiedad Active en True y ¡disfrute! Para Delphi 4-7 y BCB 3-6. http://www.greatis.com/formdes.htm Freeware -------- * ConvertFiles - por Dennys dos Santos Sobrinho Asistente para migrar aplicaciones VCL de Delphi a CLX de Kylix. http://www.delphibr.com.br/artigos/ConvertFiles.php * HalZip - por Alirio A. Gavidia B. <alirio@gavidia.org> Clon de WinZip en español, con búsqueda, "shceduler" (programador de tareas) que permite realizar respaldos automáticos, "drag & drop" (arrastrar y soltar) desde el Explorador de Windows, asociaciones de archivo, y capacidad de partir un archivo en múltiples archivos y de unirlos nuevamente. http://www.gavidia.org/halzip/ * ImageFileLib v1.00 - by Michael Vinther (with source) With this library, Delphi programs can read and write JPEG 2000, PNG, ICO, CUR and PCX images. RAS, PNM, PGM, PPM, HIPS images can be loaded but not created. Both lossy and lossless coding of JPEG 2000 images are supported. In this library also provides support for 24 bit and 256 color palette icons and cursors. http://www.logicnet.dk/lib/ * TBalloonControl v1.0 - by JWB Software (with source) The TBalloon component provides an easy interface to balloon-shaped tooltips which appear more and more in modern software. You can choose to attach a balloon-window to a control, but you can also place it anywhere on your desktop, just define the coordinates of the point. http://people.zeelandnet.nl/famboek/delphi/balloon.html * TMSNPopUp v5.0 - by JWB Software (with source) The TMsnPopUp component is created to mimic the behavior of the popup windows that can be seen in MSN/Windows Messenger from Microsoft. But it even gets better, because TMsnPopup is fully customizable, so you can give it your own look and feel. http://people.zeelandnet.nl/famboek/delphi/msnpopup.html * TXMLSerializer v2.0 - by JWB Software (with source) The TXMLSerializer component can save Delphi objects and components to disk in XML-format. Being an open format, XML has many advantages, it is a good way to save information in a readable form. You can even save complete forms as XML-files. http://people.zeelandnet.nl/famboek/delphi/xmlserializer.html * Delphi SmartCard Component v0.91 - by N Hüttisch (with source) Access any SmartCardReader which has drivers for the Microsoft SmartCard API (PC/SC) from Delphi. Easy-to-use routines to find the reader, to get informed if a card is inserted/removed and to send and receive data to / from the reader. http://www.nobbi.com/download.htm#delphi * WinTab Interface + Sample Component v1.0 - by Qr Li (with source) Delphi API translation for WinTab, the standard pointing device interface to support tablets. http://www.torry.net/vcl/system/otherhardware/wintab32.zip * WallSwap v1.1 - by Conspiracy Software (Delphi source on request) WallSwap, the automatic wallpaper changer for Windows. Give WallSwap a list of files or point it at an entire directory of pictures and it will automatically cycle your Windows desktop background through them. Features include: Support for bmp, gif, jpeg and PNG images; Center, Stretch or Tile your wallpaper; Use HTML web pages as your wallpaper; Change wallpaper every time or once daily; Compatible with Active Desktop. TopQualityFreeware.com Rating 5/5! http://www.winsite.com/bin/Info?6500000036556 * ClassExplorer Pro - by toolsfactory (with source) ClassExplorer Pro dramatically simplifies the development process by adding perfectly integrated code navigation, code creation and code documentation capabilities to your Delphi development environment. http://www.toolsfactory.com/download.shtml * deBold v2.2 - by Droopy Eyes Software (with source) These components make development with Bold for Delphi simpler. Bold is the MDA (Model Driven Architecture) product which was recently acquired by Borland and included with some versions of Delphi 7. These components are based on this framework and help the developer to perform automatic object validation, etc. http://www.droopyeyes.com/default.asp?mode=ShowProduct&ID=12 * DIB Controls v1.16 - by Droopy Eyes Software (with source) DIB Controls are a set of native Delphi VCL components based around a very fast DIB drawing engine (Device Independant Bitmap). The drawing engine utilises inline assembly language for optimum speed. This speed allows these features: Real-time zooming; Real-time rotation; Real- time alpha masking; 3 x 3 matrix filter (blur, sharpen, emboss, etc). http://www.droopyeyes.com/default.asp?mode=ShowProduct&ID=3 * FastStrings v2.6 - Droopy Eyes Software (with source) (DELPHI/KYLIX) A set of string routines for manipulating large strings at high speed. Includes Boyer-Moore searching algorithm, backwards string searching and a very high-speed alternative for StringReplace. http://www.droopyeyes.com/default.asp?mode=ShowProduct&ID=4 * Inno Setup v3.0.6 - by JR Software (with source) A free installer for Windows programs that rivals and surpasses many commercial installers in feature set and stability. Features include: Support for all 32-bit Windows versions; Creation of a single EXE or disk spanning; Standard wizard interface, including Win2k/XP style; Customizable setup types; Complete uninstall capabilities; Zip / bzip2 compression; Creation of shortcuts, registry and .INI entries; Silent install and uninstall. http://www.jrsoftware.org/isinfo.php * SQLyog v2.51 - by webyog SQLyog is an easy to use, compact and fast graphical tool to manage your MySQL database anywhere in the world. SQLyog was developed keep in mind the necessities of all who use MySQL as their preferred RDBMS. Whether you enjoy the control of handwritten SQL or prefer to work in a visual environment, SQLyog makes it easy for you get started and provides you with tools to enhance your MySQL experience. http://www.webyog.com/sqlyog/ Artículos, trucos y consejos ============================ * Overview of the VCL for .NET - by J Kaster, E Churchill and D Thorpe This article provides an overview of the architecture, design, and intent of the VCL for .NET included with the Delphi for .NET preview. http://community.borland.com/article/0,1410,29460,00.html * Building + Running Delphi for .NET projects using DLite - by M. Binder The Delphi for .NET preview included with Delphi 7 gives us a peek at the .NET world from the Delphi point of view. This article shows how to use DLite to help you build and run your Delphi for .NET projects. http://community.borland.com/article/0,1410,29077,00.html * How To Use Scanlines - by Leonel Togniolli This article shows a fast way to manipulate bitmaps without using the canvas : the scanlines. http://community.borland.com/article/0,1410,29173,00.html * Using Web Services with the Delphi for .NET preview command-line compiler - by Bob Swart This article shows how you can use existing Web Services with the preview command-line compiler Delphi for .NET. http://community.borland.com/article/0,1410,29486,00.html * Get TreeView Node By Text - by Zarko Gajic How to locate (search and select) a TreeView node given by node text. http://delphi.about.com/library/weekly/aa010703a.htm * Dephi components to access MySQL - by Zarko Gajic Overview of VCL components allowing you to access a MySQL database from Delphi using standard data controls without using BDE/ADO/ODBC. Plus a few MYSQL related tools. http://delphi.about.com/cs/toppicks/tp/aatpmysql.htm * Exchanging Data over the Network - by Zarko Gajic Examine two Delphi components: TServerSocket and TClientSocket both designed to let you read and write information over TCP/IP - thus enabling you to write network-aware applications. http://delphi.about.com/library/weekly/aa112602a.htm * Conspiracy Theory: .NET IS Borland's Is it possible that the whole .NET framework is Borland's idea? http://delphi.about.com/library/weekly/aa112902a.htm * How to encode / decode Base64 string? http://www.swissdelphicenter.ch/en/showcode.php?id=1524 * How to get the Internet Explorer typed urls? http://www.swissdelphicenter.ch/en/showcode.php?id=1521 * How to use URL highlighting in TRichEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1505 * How to show the select directory dialog and specify initial directory? http://www.swissdelphicenter.ch/en/showcode.php?id=1509 * How to make a flickerless animation using CopyRect? http://www.swissdelphicenter.ch/en/showcode.php?id=1536 * How to zoom the view of a TWebBrowser? http://www.swissdelphicenter.ch/en/showcode.php?id=1537 * How to follow the mouse in TMemo to set the cursor position? http://www.swissdelphicenter.ch/en/showcode.php?id=1538 * How to show a indeterminate ProgressBar in Win XP with PBS_MARQUEE? http://www.swissdelphicenter.ch/en/showcode.php?id=1541 * How to install Kylix when error -10 popups up - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=206 * How to register Kylix - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=207 * How to get an screen shot of a control - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=208 * How to move components at runtime - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=209 * How to use function overloading - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=210 * How to enter a NULL value - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=211 * How to copy your own application - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=212 * How to change the database name - by m3Rlin www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=213 * Save a webpage with images - by Ken Wilcox Ever wanted to duplicate the functionality of your browser and save a web page with images to disk? This example that does just that and you can pass in a progress bar to show the status of the operation. http://www.delphi3000.com/articles/article_3464.asp * MS Exchange API via Collaboration Data Objects - by Mike Heydon This is a vast subject that is beyond the scope of this article to fully detail here. This library provides the basic building blocks for someone who wants to develop using CDO. http://www.delphi3000.com/articles/article_3467.asp * How to Build Aggregate/Composite Components in Delphi - by Mark Miller http://www.delphi3000.com/articles/article_3468.asp * Handling Winsock errors - by Herbert Poltnik http://www.delphi3000.com/articles/article_3469.asp * Getting a Mac Address - The JEDI way - by Michael Brooks How to get the Mac Address for the local Windows PC (and possibly other computers on the LAN) without writing/translating a lot of code or relying completely on NetBios support. http://www.delphi3000.com/articles/article_3470.asp * Add Link to MsgBox (Updated) - by Fu-Hun-Ru Kaje-Ja http://www.delphi3000.com/articles/article_3473.asp * Building Real-Life Web Services - by Marc Hoffmann How to build a 'real-world' Web-Service with mixed method calls, data-aware connections, user-authorisation and session support. http://www.delphi3000.com/articles/article_3474.asp * TDataSet => Excel (No OLE or EXCEL required) - by Mike Heydon This class will produce an Excel Spreadsheet from a TDataSet. No OLE or Excel Installation is needed to create the file. The problem with Excel OLE is that it tends to be rather Sloooow. This class uses standard Delphi I/O functions and is considerably faster than the OLE. http://www.delphi3000.com/articles/article_3475.asp * Bmp into StatusBar - by Rodrigo Poli http://www.delphi3000.com/articles/article_3476.asp * Introductory Principles of Indexed Searching - by Jim McKeeth Describe the principles of an Indexed search engine (like google). How this works when a lot of text information is compressed into an index - so that a search can be done within a very short time. http://www.delphi3000.com/articles/article_3479.asp * WebSnap II: Interacting with the User - by Eber Irigoyen This article shows one way to allow the user to enter some data and use that to query your database. http://www.delphi3000.com/articles/article_3481.asp * Distributed applications, the easy way (I) - by Eugene Mayevski There are many ways of transferring data from one process to another. All those methods have some advantages, but also some drawbacks... http://www.delphi3000.com/articles/article_3489.asp * GetDocumentation for Type Library - by Nik Ozniev How get the Help String for a Type Library. http://www.delphi3000.com/articles/article_3490.asp * Calls to Qt cause installation problems for components in Kylix BCB IDE - by Richard Winston If a component written in Delphi makes a call to Qt, installing it in the Kylix BCB IDE can be difficult. This article describes how to overcome this problem. http://www.delphi3000.com/articles/article_3491.asp * Getting an exe File Type - by Lutfi Baran http://www.delphi3000.com/articles/article_3496.asp * Call a Procedure in an MDI Child - by Moof Foof How do I call a procedure or function in an MDI child when Delphi keeps telling me that TForm is not compatible with my TChildForm? http://www.delphi3000.com/articles/article_3498.asp * Build a Table Tree from Records to Objects - by Max Kleiner How to show a database self join in a TreeView. http://www.delphi3000.com/articles/article_3499.asp * How to Prevent an Application Being Closed by User - Manfred Suesens http://www.delphi3000.com/articles/article_3501.asp * Balloon Tooltips - by Calin Marinescu http://www.delphi3000.com/articles/article_3504.asp Tutoriales ========== * Under Construction: Delphi, dbExpress And MySQL - by Bob Swart The BDE has had its day but some of the alternatives seem very costly (SQL Server at £1,612 for a 10-client standard version?). So this article looks at MySQL to see how easy it is to use with Delphi. Oh, and it's either free or cheap, depending on the licence you choose! http://www.thedelphimagazine.com/Samples/1540/1540.htm * DotNet Buzz Words Explained - by Alain "Lino" Tadros This article will explain the different buzz words in the DotNet world like CTS, CLS, VES, Managed Code, Managed Data, Unmanaged Code, Assemblies, Metadata, Manifest, Strong Names, etc.... http://community.borland.com/article/0,1410,29344,00.html * Write your own Reflector - by Alain "Lino" Tadros Want to write your own "ILDASM" or ".NET Reflector"? Start here by seeing how easy it is to get RTTI from .NET Assemblies. http://community.borland.com/article/0,1410,29423,00.html * Cloning ClientDatSet Cursors - by Cary Jensen When you clone a ClientDataSet cursor you create an additional pointer to a shared memory store and also an independent view of the data. This article shows you how to use this important capability. http://community.borland.com/article/0,1410,29416,00.html * Object Destructors and Finalizers in .NET Using C# and Delphi for .NET - by Brian Long This in-depth article looks at the role and usage of destructors (or equivalent) in the managed world of .NET. It examines in detail the areas of garbage collection, finalizers, the dispose pattern and language specifics, using both C# and Delphi for .NET. http://community.borland.com/article/0,1410,29365,00.html * Memory: from VCL via VCL for .NET to .NET - by Bob Swart How to migrate a VCL application (the game of Memory) to VCL for .NET and finally to WinForms on .NET, all using the Delphi for .NET Preview command-line compiler. http://community.borland.com/article/0,1410,29320,00.html * Hanging by a WebSnap Thread - by Nick Hodges Covers the basics of webmodule threading in both WebSnap and WebBroker as well as some strategies for dealing with the traps it can create. http://community.borland.com/article/0,1410,29300,00.html * Cleaning Your Delphi Code Errors - by Zarko Gajic A Beginner's Guide to Delphi Programming: Chapter 9. A discussion on Delphi design, run and compile time errors and how to prevent them. Also, take a look at some solutions to most common logic errors. http://delphi.about.com/library/weekly/aa121002a.htm * Send Binary Data in XML - by Brian Schaffner XML is generally thought of as a method for describing data using text. For example, elements are given text names, and element contents are usually text-based. There are times, however, when you'll want to put data other than text into your XML documents. http://builder.com.com/article.jhtml?id=u00220021127sch01.htm * Build and Customize Modular XML to Simplify XML Documents - E. Tittel Developers have been working with objects + modules for some time but now XHTML 1.1 introduces this concept to the XML world. Find out more about this important advancement and how to put it to use in your XML documents. http://builder.com.com/article.jhtml?id=u00320021210edt01.htm * Pass Parameters to XSL Templates Programmatically - Brian Schaffner Imagine you have a list of items in an XML document that you display to a user on a Web page. Users will select which column they want to sort on and the order of the sort. Using XSL to convert your XML document to HTML might sound complicated but passing parameters to the XSL template that performs the conversion is easier than you think. http://builder.com.com/article.jhtml?id=u00220021212sch01.htm * Best Practices to Enhance Your SQL Server Applications - Roy Hoobler Get the most out of your development efforts by familiarizing yourself with SQL Server. Follow these guidelines to build better applications. http://builder.com.com/article.jhtml?id=u00320021212RCH01.htm * Heavyweight vs. Lightweight Methodologies - by Jason P. Charvat In software development "lightweight" methodologies are gaining ground on more traditional "heavyweight" methodologies. Both have advantages and disadvantages and which one you choose depends on your needs. This article examines some key differences between them. http://builder.com.com/article.jhtml?id=u00420021016vat01.htm * Find + Dissect Errors with SQL Server's Bug Hunter - by Tony Patton Debugging is a necessary evil of software development and tools are available to make the process less painful. Microsoft provides the SQL Server Debug Interface to streamline SQL development. http://builder.com.com/article.jhtml?id=u00320021212ton01.htm Otros enlaces ============= * Delphi 6 Update: official run-time patch is available official patch that fixes some variant and a deadlock issue for Delphi 6's run-time package. http://community.borland.com/article/0,1410,29361,00.html * Borland Logo Stuff Buy Borland T-shirts, golfballs and other essential stuff. http://www.borlandstyle.com * Updated Delphi for .NET preview available for download Registered users of Delphi 7 can now download an update to the Delphi for .NET preview. http://community.borland.com/article/0,1410,29302,00.html * Quake2.exe Converted to Delphi - by Q2D The Quake II to Delphi Conversion Team is proud to announce that an important milestone has been reached: Quake2.exe has been fully converted to Delphi from the original C sources. All known conversion bugs have been corrected and the Delphi-compiled binary is able to run flawlessly using the original DLLs supplied with Quake II 3.20. Conversion of the game DLLs has almost been completed and we are now focusing on fixing conversion bugs in the source. We seeking any help we can get, visit the project's webpage at: http://www.sulaco.co.za/quake2/ ________________________________________________________________________ ¡Tú puedes ayudarnos! Por favor danos una mano y ayúdanos a llegar a los 10.000 suscriptores en los próximos meses. Una forma en que puedes ayudarnos es enviando este enlace a tus amigos: http://www.latiumsoftware.com/es/pascal/index.php boletin-pascal-subscribe@gruposyahoo.com Otra forma es votándonos en alguno de estos rankings para darle más visibilidad a nuestro sitio web y aumentar así el número de suscrip- ciones al boletín: http://www.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/topdelphi/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 http://www.programacion.net/votar-enlace.php?id=474 http://www.lawebdelprogramador.com/buscar/enlace.php?id=615 Por favor vota. Son sólo unos segundos para ti que REALMENTE pueden hacer la diferencia. Necesitamos tu ayuda para poder continuar. ________________________________________________________________________ Si no has recibido el archivo con el código fuente completo de los ejemplos que se presentan en este boletín, puedes descargarlo de la siguiente dirección: http://www.latiumsoftware.com/descarga/p0042.zip ________________________________________________________________________ Página principal: http://www.latiumsoftware.com/es/pascal/index.php Página del grupo: http://espanol.groups.yahoo.com/group/boletin-pascal/ Para suscribirse / apuntarse: boletin-pascal-subscribe@gruposyahoo.com Para cancelar / removerse: boletin-pascal-unsubscribe@gruposyahoo.com Para reportar problemas con la suscripción: eds2004 @ latiumsoftware.com ________________________________________________________________________ Este boletín se provee "TAL Y COMO ESTA", sin garantía de ninguna clase. Su uso implica la aceptación de nuestros términos de licencia y de la ausencia de garantía que puedes leer en nuestro sitio web. Allí también encontrarás una nota sobre marcas registradas. Te animamos a que redis- tribuyas este boletín, siempre y cuando lo hagas en forma completa (incluyendo la información de copyright), sin modificaciones y de manera gratuita. Los artículos son copyright de sus respectivos autores y se reproducen aquí con el permiso de los mismos. ________________________________________________________________________ Latium Software http://www.latiumsoftware.com/es/index.php Copyright (c) 2003 por Ernesto De Spirito. Todos los derechos reservados ________________________________________________________________________ |
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
¿Errores? ¿Omisiones? ¿Comentarios? Por favor contáctanos!






