Boletín Pascal #46
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
Boletín Pascal #46 - 23-ABR-2003 Índice 1. Unas palabras del editor 2. Lineamientos sobre el rendimiento de Interbase (I) - Desarrollo de la base de datos · Normalice su base de datos · Claves primarias · Claves externas · Use índices en columnas de relación · SQL · Subconsultas correlacionadas · Combinaciones externas (Outer join) · Procedimientos almacenados · No utilice campos Char o Varchar largos · BLOBs · Utilice procesamiento cliente/servidor · Plan de consultas · RDB$DB_KEY - Lineamientos para el servidor · Utilice un servidor dedicado · Utilice Linux como sistema operativo del servidor · Si Ud. tiene que usar Windows · Use máquinas de un solo procesador con Interbase · Utilice un disco rígido dedicado · Discos veloces · Utilice una dirección IP estática en el servidor · Utilice TCP/IP como protocolo de red · No utilice salvapantallas · Ingreso al servidor a través de consola · Utilice la misma versión del cliente de Interbase que su servidor · Superando restricciones de entrada/salida de disco · Protección de archivos de Windows 3. Incluyendo componentes en una StatusBar 4. Notas de un desarrollador (I) Rx TSpeedBar y TToolBar - Menú movible 5. Enumerando las conexiones de red Detectando las conexiones de red actuales 6. Buscando archivos en Delphi 7. Inline Assembler en Delphi (VIII) - Aritmética entera de 128 bits (2) 8. Foros / listas de correo 9. Delphi en la Red - Componentes, librerías y aplicaciones · Shareware · Freeware · Actualizaciones de Delphi - Artículos, trucos y consejos - Tutoriales - Otros enlaces - Noticias ________________________________________________________________________ 1. Unas palabras del editor Perdón por la demora en la publicación de este número. Como es habitual, quisiera comenzar agradeciendo a los autores que colaboraron artículos para esta edición: Peter Mc Leod, Alex Schlecht, Alirio A. Gavidia, Igor Siticov y Charl Linssen. Me complace entregarles los premios para esta edición a los dos primeros: * Peter Mc Leod (Lineamientos sobre el rendimiento de Interbase) · 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/ * Alex Schlecht (Incluyendo componentes en una StatusBar) · LMD StoragePack - por LMD Innovative - Shareware (EUR 59) Ocho componentes para salvar/restaurar datos de configuración (o sea, en tiempo de diseño, a través del diálogo de selección de propiedades) en/desde el Registro de Windows o archivos Ini, XML o binarios, siendo fácil cambiar entre estos formatos. Se incluye código fuente completo y un proyecto demo. http://www.ceberus.com/lmd/products/index.php3#P9 También quiero hacer un agradecimiento especial al Ing. Ernesto Cullen por la traducción del artículo Lineamientos sobre el rendimiento de Interbase, cuya segunda parte se publicará en el próximo número, para el cual 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 * NTTools 7 For Delphi - por i-tivity (USD 39.95) ¡Basta de batallar con la API de Seguridad de Windows NT! Obtenga su copia de NTTools 7 para Delphi 4/5/6/7 ahora y ahórrese incontables horas con esta colección de 40 componentes VCL escritos específica- mente para tratar con las funciones de Seguridad de Windows NT. Se incluye código fuente completo. http://www.i-tivity.biz/nttools.htm En las noticias, Borland está preparando la próxima versión de Delphi, nombre clave Octane, planeada para ser lanzada a fines de este año. Esta nueva versión continuará soportando la VCL y CLX, permitiendo a los desarrolladores construir aplicaciones Win32 tradicionales, pero el lenguaje Delphi tendrá soporte completo para .Net y además incluirá una versión 100% .Net de un gran subconjunto de la VCL, permitiendo así a los desarrolladores construir también aplicaciones para la plataforma .Net usando el mismo IDE, y con las habilidades y el conocimiento sobre Delphi que ya poseen. Para más información: - Open Letter to the Delphi Community - por Simon Thornhill http://bdn.borland.com/article/0,1410,29951,00.html - Octane and Delphi Q&A - por Anders Ohlsso http://bdn.borland.com/article/0,1410,29952,00.html Espero que disfruten esta edición. Saludos, Ernesto De Spirito eds2004 @ latiumsoftware.com __________________ Colaboraron en esta edición: Ernesto Cullen y Dave Murray ________________________________________________________________________ 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 ________________________________________________________________________ 2. Lineamientos sobre el rendimiento de Interbase (I) Por Peter Mc Leod <PeterMcLeod@practical.com.au> Traducido por Ernesto Cullen Este documento intenta plasmar varios lineamientos sobre cómo obtener el mejor rendimiento de Interbase. Antes de comenzar con los aspectos que yo recomendaría al diseñar una base de datos para alcanzar las necesidades de sus clientes, querría recordarle que generalmente los aspectos más costosos (en orden) de un proyecto son: 1. Desarrolladores 2. Red 3. Servidor Por lo tanto, cuando priorice sus recursos, tenga presente la lista anterior. También es sabido que un "atajo" tomado al principio del proyecto (como por ejemplo no probar contra una base de datos totalmente llena) siempre toma al menos tres veces más tiempo para corregirlo después, y cuesta al menos tres veces más. Desarrollo de la base de datos ============================== Normalice su base de datos -------------------------- No importa para qué base de datos esté desarrollando, se debe comenzar con un buen diseño. Asegúrese de tener normalizada su base de datos hasta al menos la tercera forma normal. Verifique que sus claves primarias son independientes de cualquier objeto de negocio que esté almacenando, y -por razones de rendimiento- use un entero cuando le sea posible (los enteros tienen 32 bits y se ordenan más rápido en la mayoría de los algoritmos comparados a los campos de tipo Char o Varchar), a menos que no pueda hacerlo por alguna razón específica (por ejemplo cuando necesita un identificador único para replicación, o cuando usa una base de datos relacional para almacenar objetos). Claves primarias ---------------- Si define una clave primaria compuesta, se crea más de un índice (uno por cada columna que compone la clave). Dado que el Optimizador de Consultas usará los varios índices para resolver una consulta, esto puede causar un cuello de botella para el optimizador si los índices múltiples usados por el optimizador son los mismos que los campos en la consulta. Claves externas --------------- Las claves externas (o claves foráneas) son esencialmente restricciones de integridad referencial. El problema con las claves externas es que se creará un índice en la tabla respectiva, para facilitar la restricción. Normalmente esto no es un problema, pero si Ud. tiene una restricción de clave externa sobre columnas que tienden a repetir valores, entonces tiene un índice muy pobre. Si el Optimizador de Consultas utiliza uno de estos índices entonces se provocará un cuello de botella en el rendimiento debido al índice pobre. En estos casos, eliminar los índices puede incrementar el rendimiento de consultas en porcentajes de algunos cientos. Entonces sea cuidadoso cuando defina sus claves externas. Use índices en columnas de relación ----------------------------------- Un índice es una estructura de datos en árbol balanceado que provee una mejora en la velocidad de ordenamiento para una base de datos. Los índices de Interbase tienen una dirección específica (ascendentes o descendentes), por lo que si va a navegar hacia atrás en una tabla debería definir un índice descendente. Los índices trabajan mejor con datos que tienes a ser únicos. El optimizador de consultas de Interbase usará índices para acelerar las consultas. Los índices son actualmente malos para el rendimiento cuando son creados sobre una columna que tenga pocos valores únicos. Los índices enlentecen la inserción de datos en una tabla, ya que tienen que ser recalculados. Si va a hacer un número grande de inserciones en una tabla debería considerar desactivar temporalmente los índices para minimizar el impacto sobre el rendimiento (ALTER INDEX nombre INACTIVE), y reactivar el índice después que las inserciones han sido hechas (ALTER INDEX nombre ACTIVE). Para determinar la efectividad de un índice, ejecute la siguiente sentencia SQL: Select RDB$INDEX_NAME, RDB$STATISTICS from RDB$INDICES El valor RDB$STATISTICS muestra la efectividad del índice. Mientras menor el valor, mejor el índice, con un valor de uno indicando un índice muy pobre. Como una regla práctica general, debería definir sólo unos pocos índices en una tabla (el optimizador de consultas usa múltiples índices para los mismos campos según sea necesario en una consulta, por lo que muchos índices pueden llevar a una degradación del rendimiento). SQL --- Algunas sentencias SQL son más lentas que otras. En general evite el uso de funciones como "CONTAINING", "LIKE", "<>", "COUNT" y "UPPER" ya que estas funciones no usan índices durante su operación, haciéndolas más lentas que otros comandos. El libro "SQL Performance Tuning" de Peter Gulutzan y Trudy Petzer cubre engran detalle como incrementar la efec- tividad de sus sentencias SQL sin referencias a ninguna funcionalidad propietaria específica. Yo recomendaría este libro a cualquiera involu- crado en desarrollo de bases de datos. Subconsultas correlacionadas ---------------------------- Una subconsulta correlacionada es una subconsulta donde las condiciones de la subconsulta son diferentes para cada fila de la consulta prin- cipal. Debido a esto, la subconsulta necesita ser ejecutada muchas veces (una por cada fila de la consulta principal). En algunos casos, una union (join) puede reemplazar una subconsulta correlacionada y resultará en un mejor tiempo de ejecución de la consulta. Combinaciones externas (Outer join) ----------------------------------- Las combinaciones externas son una realidad de la programación de bases de datos. Las combinaciones externas por la izquierda (left outer join) tienen una tendencia a ser lentas, y se usará un índice únicamente para la resolución de la primera combinación externa en una consulta. Donde sea posible, reduzca la necesidad de combinaciones externas izquierdas. Esto puede hacerse vía: - Diseñar las tablas de manera que las combinaciones no sean necesarias - Usar subconsultas (esto puede ser más rápido que resolver combina- ciones externas por la izquierda) - Usar un procedimiento almacenado que devuelva un cursor para incrementar la velocidad Procedimientos almacenados -------------------------- Cuando cree un procedimiento almacenado que contenga bucles anidados asegúrese que el bucle más externo devuelve el menor número posible de registros. Si es posible estructure sus procedimientos almacenados de manera que los bucles internos sean siempre los más veloces, ya que son iterados la mayor cantidad de veces. No utilice campos Char o Varchar largos --------------------------------------- Antes de Interbase 7.0, los campos de tipo Varchar y Char eran comple- tados hasta su longitud máxima al ser enviados al cliente. Si Ud. solamente ocupa una parte de un campo Varchar o Char largo y luego pide los resultados desde el cliente, se genera una gran cantidad de tráfico de red, lo que puede degradar el rendimiento de su aplicación y de la red. De ser posible no utilice campos largos de tipo Char o Varchar, o use Blobs como una alternativa. Un Blob tiene también la ventaja de ser almacenado en su propia página en la base de datos y esto reduce la posibilidad de bloqueos. Como una alternativa, actualice a Interbase versión 7.0. BLOBs ----- El tipo BLOB (Binary Large OBject) es un tipo de datos que soporta objetos grandes. Un BLOB se define con un tamaño de segmento, y en Interbase el valor por defecto para este parámetro es de 80 bytes. Si un campo BLOB se define con un tamaño de segmento igual al tamaño de página de la base de datos las consultas con campos BLOB se resolverán muy rápidamente, ya que solo se necesita recuperar una página para completar los datos. Bajo estas situaciones Interbase no es el cuello de botella en las transferencias de datos; otros subsistemas como el hardware, red, etc. disminuirán normalmente la tasa de transferencia de datos. Utilice procesamiento cliente/servidor -------------------------------------- Interbase provee varias características que permiten que algunos procesos se ejecuten en el servidor (el cual frecuentemente tiene más capacidad de proceso que las máquinas cliente, y también se reduce el tráfico por la red). Los triggers (disparadores), UDFs (funciones defi- nidas por el usuario) y stored procedures (procedimientos almacenados) están todos adecuadamente detallados en la Guía del Programador (Programmer's Guide) y en la Guía de Definición de Datos (Data Definition Guide) por lo que no serán detallados aquí. Plan de consultas ----------------- Interbase usa un optimizador basado en costos para optimizar la ejecu- ción de las sentencias SQL. En la mayoría de los casos el optimizador realiza muy bien su trabajo; pero bajo ciertas circunstancias el optimizador no selecciona el plan que consigue el mejor rendimiento. Tenga cuidado, ya que si Ud. especifica su propio plan de consulta el optimizador no lo analizará para asegurarse que es correcto. Puede encontrar detalles sobre cuándo y cómo ajustar el plan de consulta de Interbase en los siguientes sitios: * Specifying Query Access Plans in the Interbase Optimizer http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_quep * Managing your Interbase Server - by Paul McGee http://www.mers.com/MANAGE.HTML RDB$DB_KEY ---------- RDB$DB_KEY es un identificador de registros de bajo nivel, más rápido que la clave primaria para la recuperación de registros. Estos identi- ficadores son válidos solamente durante la transacción actual, y no pueden tomarse como identificadores permanentes de registros. Aún así es posible utilizar los RDB$DB_KEY para incrementar el rendimiento de rutinas SQL en una base de datos Interbase. La desventaja de esto es que la ganancia en rendimiento es específica para Interbase. Para más detalles sobre cómo utilizar la RDB$DB_KEY, refiérase a los documentos localizados en el siguiente sitio: * IB Documentation http://www.cvalde.com/ibDocumentation.htm Lineamientos para el servidor ============================= Utilice un servidor dedicado ---------------------------- Un servidor dedicado provee el mejor rendimiento para una base de datos Cliente/Servidor. El costo de un rendimiento inadecuado es, por mucho, más costoso que comprar un servidor dedicado. Un rendimiento pobre se reflejará en Ud. como desarrollador y resultará generalmente en tiempo empleado identificando y rectificando problemas. No tomará mucho hasta que se justifique el costo del servidor dedicado. Utilice Linux como sistema operativo del servidor ------------------------------------------------- Los servidores Linux o Unix hacen una mejor utilización de la memoria real y virtual, tienen un buen modelo de priorización multiprocesador, y frecuentemente requieren menos recursos de CPU y memoria que otros sistemas operativos. Los servidores Linux demuestran tiempos de arranque mucho mejores comparados con sus contrapartes Windows. Linux tampoco parece tener procesos misteriosos que degradan el rendimiento, y que desaparecen tan pronto como Ud. se registra en el servidor para examinar el problema. Los servidores Linux o Unix se pueden integrar en una red Windows con SAMBA proveyendo un enlace transparente en cuanto a los clientes concierne. Si Ud. tiene que usar Windows ----------------------------- Verifique su servidor Windows para ver si está configurado para proveer máximos recursos a la compartición de archivos o a las aplicaciones de segundo plano. Todas estas opciones están localizadas en diferentes lugares para distintos Windows, refiérase a la documentación de su Windows. Esta configuración puede tener un gran impacto en el rendi- miento de Interbase. Use máquinas de un solo procesador con Interbase ------------------------------------------------ Si Ud. está usando una versión menor que 7.0 de Interbase bajo Windows NT, no utilice un servidor multiprocesador. Si lo hace, el proceso de servidor de Interbase cambiará de procesador a procesador causando degradación del rendimiento del servidor. Si quiere usar Interbase (anterior a la versión 7.0) en un sistema multiprocesador entonces utilice una herramienta para fijar Interbase a un solo procesador (hay varias disponibles, incluyendo una de Microsoft). No obstante, aún así debería tener en cuenta que dado que algunos de los primeros sistemas operativos Windows NT no implementaban un buen modelo de soporte SMP, la mejora en rendimiento podría ser menor de lo que esperaría. Los sistemas Linux tienen un soporte SMP apropiado. Utilice un disco rígido dedicado -------------------------------- Si Ud. tiene su base de datos en el mismo disco que el archivo de paginación de un servidor, el incremento en las operaciones de entrada/salida de la administración de memoria virtual del servidor impactarán en el rendimiento de su aplicación. Siempre ubique su base de datos en un disco separado. Si tiene el dinero yo sugeriría que su sistema operativo estuviera en un disco, su base de datos en otro, y el archivo de intercambio en otro. Discos veloces -------------- Las operaciones de entrada/salida de disco son frecuentemente un cuello de botella para el rendimiento de las bases de datos. Los discos IDE comúnmente usan algunos recursos de la CPU. Siempre prefiera los sistemas SCSI más veloces que pueda comprar. El ahorro en este tema le costará mucho en términos de degradación de rendimiento. Los sistemas RAID también ofreces mejor rendimiento que los sistemas de discos únicos. Un buen arreglo RAID de varios discos SCSI es la mejor solución. Utilice una dirección IP estática en el servidor ------------------------------------------------ Una dirección IP estática en el servidor significa que la dirección IP del servidor puede encontrarse más rápido que usando servicios de traducción de nombres a direcciones. Esta IP debería estar fija en el archivo Hosts del servidor, y en los archivos Hosts de las máquinas clientes. Utilice TCP/IP como protocolo de red ------------------------------------ TCP/IP es un protocolo basado en conexión (los paquetes son enviados al receptor adecuado en lugar de ir a todas las máquinas) lo que genera menos tráfico de red que los protocolos no orientados a conexiones como NetBEUI o IPX/SPX. TCP/IP es también más rápido que cualquiera de estos protocolos, y tiene la ventaja de estar disponible en una más amplia variedad de plataformas. Siempre que sea posible debería usarse TCP/IP para comunicarse con Interbase por su ventaja de velocidad. Para mejorar todavía más el rendimiento es recomendable no instalar múltiples proto- colos en la red ya que esto incrementa el "ruido" en la red. Si esto es inevitable, entonces asegurando que el protocolo que utiliza está primero en la pila Ud. tendrá más prioridad en la red. No utilice salvapantallas ------------------------- Los salvapantallas, particularmente los de tipo 3GL, pueden usar intensamente el procesador y degradar notoriamente el rendimiento del sistema. En la mayoría de los casos los salvapantallas no son necesarios ya que los monitores modernos son diseñados de manera tal que el riesgo de "quemar" la pantalla es ínfimo, e incluso los monitores que ahorran energía se apagarán solos. Si no tiene un monitor con ahorro de energía, simplemente apáguelo, como mínimo estará usando menos electricidad y no generará tanto calor en el cuarto del servidor. Si tiene que utilizar un salvapantallas entonces use "pantalla en blanco" o "marquesina" (con la velocidad de desplazamiento del texto lenta para evitar una utilización excesiva de la CPU) ya que éstos utilizan la menor cantidad de recursos. Ingreso al servidor a través de consola --------------------------------------- Mucha gente tiende a usar Windows NT/2000 porque están más familiari- zados con el sistema operativo Windows. Si Ud. usa Windows NT, no inicie una sesión en el servidor innecesariamente, o permanezca en una. Aparte de constituir un problema de seguridad, dejar una sesión funcionando en el servidor permite a los procesos correr en segundo plano, lo que puede degradar el rendimiento del servidor. Aún los procesos de segundo plano pueden usar un 20%-30% de los recursos del servidor. Hay muchas herra- mientas que permiten mantener un servidor Interbase sin la necesidad de tener una sesión iniciada en el servidor. Utilice la misma versión del cliente de Interbase que su servidor ----------------------------------------------------------------- Si Ud. tiene una versión desactualizada del cliente de Interbase instalada en la máquina cliente, comparando con la versión instalada en su servidor podría estar sufriendo una baja de rendimiento. Pruebas con Interbase 5.1 y 5.6 pueden mostrar una diferencia de rendimiento de un poco mas del 50% debida al uso de una instalación de cliente desactualizada. También puede tener problemas para acceder a las nuevas características si está usando versiones diferentes para el cliente y el servidor y pueden aparecer errores de aplicación (en algunos casos esto puede causar que el servidor Interbase se caiga y posiblemente que se corrompa la base de datos). Superando restricciones de entrada/salida de disco -------------------------------------------------- Es posible reducir el problema de las operaciones de entrada/salida de disco en Interbase. Después de realizar un respaldo y restauración, cree una tabla temporal en la base de datos (usando campos Blob o columnas Varchar grandes). Llene esta tabla con una gran cantidad de datos. A continuación elimine la tabla temporal (drop) y realice un sweep en la base de datos. Esto significa que Interbase reutilizará el espacio dentro de la base de datos durante las operaciones, y no pedirá más espacio en disco al sistema operativo hasta que todo el espacio libre dentro de la base de datos haya sido reutilizado. Esto incrementa la velocidad de las operaciones de escritura en la base de datos, ya que las E/S de disco no son esencialmente un factor limitante. Protección de archivos de Windows --------------------------------- Algunas versiones de Windows (Windows XP) han implementado mecanismos de protección para archivos con extensión .GDB (bases de datos de Interbase). Si Ud. utiliza un sistema operativo superior a Windows 2000 puede experimentar a desactivar la protección de archivos de Windows o renombrar su base de datos con otra extensión (para bases de datos mayores que Interbase 7.0 o Firebird 1.5). Los cínicos entre nosotros se preguntarán si Microsoft hizo esto para reducir el rendimiento de Interbase en comparación con su propia base de datos SQL Server... ________________________________________________________________________ ¿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. ________________________________________________________________________ 3. Incluyendo componentes en una StatusBar Por Alex Schlecht http://www.bombus-software.de El componente TStatusbar no permite colocar componentes en él, pero a veces resultaría muy útil agregar -por ejemplo- un TProgressBar (barra de progreso) en una barra de estado. Este artículo muestra cómo agregar componentes a un TStatusbar y cómo hacer que encajen en uno de los paneles de la barra de estado. Hay (por lo menos) dos maneras de agregar componentes en su barra de estado: 1) Creando su propia barra de estado ------------------------------------ Cree su propia barra de estado y permita que se le agreguen componentes. Esto es posible sobrescribiendo el constructor Create: type TMyStatusBar = class(TStatusBar) public constructor Create(AOwner: TComponent); override; end; implementation constructor TMyStatusBar.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csAcceptsControls]; // ¡Eso es todo! end; Eso es todo. Ahora este componente puede aceptar otros componentes como "hijos", los que pueden ser colocados en tiempo de diseño en la barra de estado. Pero no me gusta mucho esta forma de hacerlo porque tiene que usar este nuevo componente. Prefiero usar el componente "viejo" manipulándolo un poco, así que démosle un vistazo a mi forma favorita: 2) "Adoptando" al otro componente --------------------------------- La manera más simple de incluir componentes en una StatusBar es adoptando los componentes. Coloque un TStatusbar en su formulario, y también coloque la ProgressBar (o cualquier otro componente que desee incluir en su StatusBar). Luego haga lo siguiente en el evento OnShow de su formulario: ProgressBar1.Parent := StatusBar1; ProgressBar1.Top := 1; ProgressBar1.Left := 1; Ahora la ProgressBar ha sido "adoptada" por la StatusBar. Pero desafortunadamente no se ve muy bien porque la ProgressBar es más grande que el panel y la posición no es correcta, así que tenemos que determinar la posición exacta de la ProgressBar usando las propiedades Border, Width y Height de la StatusBar. Tenemos que añadir este código al evento OnShow del formulario porque en el evento OnCreate no hay "manejadores" (handles) disponibles. uses CommCtrl; procedure TForm1.FormShow(Sender: TObject); var r : TRect; begin StatusBar1.Perform(SB_GETRECT,0,integer(@R)); // Determinar el tamaño del panel 1 // SB_GETRECT necesita la unidad CommCtrl // 0 = primer panel de StatusBar; 1 = segundo; y así sucesivamente. ProgressBar1.Parent := StatusBar1; // Adopta la ProgressBar ProgressBar1.Top := r.Top; // Establece el tamaño... ProgressBar1.Left := r.Left; // ...de la ProgressBar... ProgressBar1.Width := r.Right - r.Left; // ...para que encaje... ProgressBar1.Height := r.Bottom - r.Top; // ...en el panel end; Ahora la ProgressBar encaja exactamente en el primer panel de la barra de estado. Si desea usar el segundo panel o cualquier otro panel, sólo tiene que cambiar el parámetro del comando "Perform". Comentarios y mejoras son bienvenidos. Alex Schlecht ________________________________________________________________________ ¡Vote por el Boletín Pascal en The Programming Pages! http://www.programmingpages.com/?r=latiumsoftwarecomenpascal ________________________________________________________________________ 4. Notas de un desarrollador (I) La presente es parte de una serie de pequeños artículos narrando expe- riencias en el desarrollo de una aplicación. Rx TSpeedBar y TToolBar ======================= Es de hacer notar que las RX son el conjunto de componentes "freeware" más representativos en el mundo de Delphi. Siempre que se habla de Delphi y "freeware" se pasa por la Rx (las "rusas" para muchos). Bien, éstas van por la versión 2.75. Estaban en www.rxlib.com. Ya no. Fui hace unos meses para encontrar que un ser maquiavélico adquirió el dominio y puso un buscador (muy malo por cierto). Me molesta sentirme engañado y me resulta estúpido que alguien crea que si llego a un sitio engañado voy a comprar (no, de hecho por eso odio a los vendedores de resorts). No todo esta perdido; las Rx se encuentran en SourceForge.net junto con otros valiosos trabajos (esperemos que nadie compre SourceForge.net para vender resorts). Volviendo a las Rx, yo utilizo mayormente los controles de DBGrid, Fechas, la tabla en memoria, el panel secreto y TSpeedBar. De hecho lo uso en HalZip (http://www.gavidia.org/halzip) y CC Cyber Café (http://www.gavidia.org/cc). Todo muy bien hasta que uno de los reportes que tengo por fallas en CC señaló una excepción por falta de recursos bajo Windows 98. De antemano señalo que pude reproducir la falla (más o menos), luego de arduos esfuerzos, para al final no poder resolverla. Opté entonces por usar TToolBar en remplazo de TSpeedBar (de las Rx). TToolBar se porta bien (sin la falla de falta de recursos) pero carece de una ventaja práctica de las Rx al colocar un fondo gráfico en la barra. Es problema se resuelve manejando el evento OnCustomDraw. He aquí el ejemplo. // fondo : TBitMap; <- esto va en la sección // privada del formulario. procedure TfrmMain.ToolBar1CustomDraw(Sender: TToolBar; const ARect: TRect; var DefaultDraw: Boolean); var ix, iy: Integer; BmpWidth, BmpHeight: Integer; hCanvas, BmpCanvas: THandle; begin if assigned(fondo) and ((fondo.Height <> 0) or (fondo.Width <> 0)) then begin BmpWidth := fondo.Width; BmpHeight := fondo.Height; BmpCanvas := fondo.Canvas.Handle; hCanvas := Sender.Canvas.Handle; for iy := 0 to Sender.ClientHeight div BmpHeight do for ix := 0 to Sender.ClientWidth div BmpWidth do BitBlt (hCanvas, ix * BmpWidth, iy * BmpHeight, BmpWidth, BmpHeight, BmpCanvas, 0, 0, SRCCOPY); DefaultDraw := true; end; end; "Fondo" es de tipo TBitMap, es creado en el evento "FormCreate" del formulario principal ("fondo := TBitMap.Create;" ) y destruido también con el formulario (con "FreeAndNil(fondo)"). En mi caso particular (Halzip), si el archivo "fondo.bmp" existe lo usamos. No hay que olvidar refrescar el "ToolBar". if FileExists(ExtractFilePath(Application.ExeName)+ 'fondo.bmp') then begin fondo.LoadFromFile(ExtractFilePath(Application.ExeName) + 'fondo.bmp'); ToolBar1.Refresh; end Menú movible ============ Encontré también algo que está en la documentación de Delphi y que cuando lo necesité no sabía que estaba allí. ¿Se han fijado que el menú en muchas aplicaciones puede ser movido de sitio? La solución es usar TToolBar. Asumiendo que tenemos un menú creado en el formulario. Simplemente: 1) Colocamos un "ToolBar" en el formulario 2) Creamos tantos botones como entradas al menú principal. 3) Cada botón tiene una propiedad "MenuItem" que apuntaremos a cada menú que tenemos. 4) La propiedad "Grouped" del "Toolbar" se hace "True". 5) El formulario principal tiene una propiedad llamada "Menu" (aunque la ayuda de Delphi 5 diga "MainMenu"). Colóquenla apuntando a la nada. 6) Para que quede bien es bueno que la propiedad "ShowCaptions" esté encendida. 7) Luego ajusten lo que les provoque. Ya debe funcionar. Por favor no dejen de usar las Rx; es mejor dejar de usar Windows 98. Sin embargo, si encuentran el problema de la excepción por falta de recursos y lo resuelven, avísenme. Gracias. Alirio A. Gavidia desde www.gavidia.org __________________ Próximo tema: Convertir archivos gráficos de distinto tipo: ico, wmf, emf, jpg y gifs (más de RX). ________________________________________________________________________ 5. Enumerando las conexiones de red Detectando las conexiones de red actuales Por Igor Siticov SiComponents: http://www.sicomponents.com ¿Cómo detectar las conexiones de red actuales? Desde la línea de órdenes de MS-DOS uno puede enumerar las conexiones de red (unidades) usando el siguiente comando: net use Para hacerlo programáticamente debemos llamar a la API WNetOpenEnum() para comenzar la enumeración de los recursos conectados y luego a la API WNetEnumResources() para continuar la enumeración. La siguiente muestra de código enumera las conexiones de red: procedure TForm1.Button1Click(Sender: TObject); var i, dwResult: DWORD; hEnum: THANDLE; lpnrDrv, lpnrDrvLoc: PNETRESOURCE; s: string; const cbBuffer:DWORD = 16384; cEntries: DWORD = $FFFFFFFF; begin dwResult := WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, 0, nil, hEnum); if dwResult <> NO_ERROR then begin ShowMessage('No se pudo enumerar las unidades de red.'); Exit; end; s := ''; repeat lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer)); dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer); if dwResult = NO_ERROR then begin s := 'Unidades de red:'#13#10; lpnrDrvLoc := lpnrDrv; for i := 0 to cEntries - 1 do begin if lpnrDrvLoc^.lpLocalName <> nil then s := s + lpnrDrvLoc^.lpLocalName + #9 + lpnrDrvLoc^.lpRemoteName + #13#10; Inc(lpnrDrvLoc); end; end else if dwResult <> ERROR_NO_MORE_ITEMS then begin s := s+'No se pudo completar la enumeración de unidades de red'; GlobalFree(HGLOBAL(lpnrDrv)); break; end; GlobalFree(HGLOBAL(lpnrDrv)); until dwResult = ERROR_NO_MORE_ITEMS; WNetCloseEnum(hEnum); if s = '' then s := 'No hay conexiones de red.'; ShowMessage(s); end; __________________ Igor Siticov es el autor de TsiLang Components Suite (un completo juego de componentes para construir en dos minutos aplicaciones multilingües elegantes, útiles y amistosas con el usuario) y de Resource Builder (un muy completo editor visual de RC script, ideal para reemplazar al Borland Image Editor y al Borland Resource WorkShop para crear y editar archivos de recursos), por SiComponents: http://www.sicomponents.com ________________________________________________________________________ 6. Buscando archivos en Delphi Por Charl Linssen ¡Hola lector! Para uno de mis proyectos necesitaba un procedimiento que buscara un directorio y todos sus subdirectorios, y que mostrara todos los archivos que contenían. Pensé que podría encontrar un procedimiento como ese en la Internet, pero no pude hallar uno que fuera adecuado, así que decidí escribir uno propio. Aquí esta: Const MAXFILES = 1000; var CurrSearchedDir: Array [1..MAXFILES] of String; OriginalPath, OldSearchedDir: String; InSubDir: Boolean = False; CurrInstance: Integer; [...] procedure search(BasePath:String); var DirInfo: TSearchRec; I:Integer; begin Inc(CurrInstance); If InSubDir then CurrSearchedDir[CurrInstance] := OldSearchedDir + '\' + CurrSearchedDir[CurrInstance-1]; FindFirst(BasePath+'\*', faDirectory, DirInfo); repeat If (DirInfo.Name = '.') or (DirInfo.Name = '..') then Continue; If (ExtractFileExt(DirInfo.Name) <> '.html') and not ((DirInfo.attr and faDirectory) = faDirectory) then Continue; // Remover la línea de arriba si uno busca cualquier archivo if (DirInfo.attr and faDirectory) = faDirectory then Begin InSubDir := True; OldSearchedDir := CurrSearchedDir[CurrInstance]; CurrSearchedDir[CurrInstance] := DirInfo.Name; Search(BasePath + DirInfo.Name + '\'); Continue; End; frMain.ListBox1.Items.Add(OriginalPath + CurrSearchedDir[CurrInstance] + '\' + DirInfo.Name); Until FindNext(DirInfo) <> 0; Dec(CurrInstance); end; Como puede ver al examinar detenidamente este procedimiento, el mismo es recursivo. Esto significa que se llama a sí mismo. Hace eso cuando encuentra un subdirectorio y necesita buscar en ese subdirectorio archivos y posiblemente otros subdirectorios. Esto hace que el procedimiento sea apto para tantos subdirectorios como uno necesite. ¡Divértanse! -- Charl ________________________________________________________________________ 7. Inline Assembler en Delphi (VIII) - Aritmética entera de 128 bits (2) Por Ernesto De Spirito En el ejemplo de código fuente (adjunto) encontrará la implementación de algunas funciones para operar con el tipo de datos Hugeint que fuera presentado en la edición pasada. El propósito es ejemplificar las instrucciones que hemos visto hasta ahora, junto con algunas nuevas: BT (Bit Test): BT dword ptr [eax], edx --> CF = valor del bit número EDX en la memoria apuntada por EAX BTS (Bit Test and Set): BTS dword ptr [eax], edx --> Establece en 1 el bit número EDX en la memoria apuntada por EAX CF = valor anterior de ese bit BTR (Bit Test and Reset): BTR dword ptr [eax], edx --> Establece en 0 el bit número EDX en la memoria apuntada por EAX CF = valor anterior de ese bit BTC (Bit Test and Complement): BTC dword ptr [eax], edx --> Invierte el valor del bit número EDX en la memoria apuntada por EAX CF = valor anterior de ese bit No reproduciremos aquí las funciones puesto que puede encontrarlas en el código fuente adjunto, pero sí mostraremos diferentes implementaciones posibles de la función _IsNeg, simplemente con el propósito de proveer más ejemplos de las instrucciones que hemos visto hasta ahora: function _IsNeg(x: Hugeint): boolean; // Result := x < 0; // Si x < 0 devuelve True (1), de lo contrario devuelve False (0) // Parámetros: EAX = @x asm mov eax, [eax+_3_] // EAX := 32 bits de orden alto de x shr eax, 31 // AL := bit de orden alto de EAX (bit de signo) end; function _IsNeg(x: Hugeint): boolean; asm cmp dword ptr [eax+_3_], 0 // if x[3] < 0 then jl @@negativo // goto @@negativo mov al, 0 // Result := False; ret // exit; @@negativo: // @@negativo: mov al, 1 // Result := True; end; function _IsNeg(x: Hugeint): boolean; asm // Establecer la Señal de Signo con el bit 127 y ponerla en AL mov eax, [eax+_3_] // EAX := 32 bits de orden alto de x or eax, eax // SF := Bit de signo de EAX // alt.: add eax, 0 // ...o: sub eax, 0 // ...o: and eax, eax // ...o: and eax, -1 // o cualquier valor < 0 // ...o: test eax, eax // ...o: test eax, -1 // o cualquier valor < 0 sets al // AL := SF; // Señal de Signo (Sign Flag) // alt.: lahf; shr ax, 31 // ...o: lahf; rol ax, 1; and al, $1 end; function _IsNeg(x: Hugeint): boolean; asm // Establecer la Señal de Acarreo con el bit 127 y asignarla a AL mov eax, [eax+_3_] // EAX := 32 bits de orden alto de x bt eax, 31 // CF := Bit de signo de EAX // alt.: shl/rol/rcl eax, 1 setc al // AL := CF; // Señal de Acarreo (Carry Flag) // alt.: mov al, 0; rcl, 1 // ...o: mov al, 0; adc al, al // ...o: lahf; mov al, ah; and al, $1 // ...o: lahf; ror/rcr/shr/sar ax, 1; shr al, 7 // ...o: lahf; ror/shr/sar ax, 8; and al, $1 // ...o: lahf; rol ax, 8; and al, $1 // ...o: lahf; rcl ax, 9; and al, $1 end; function _IsNeg(x: Hugeint): boolean; asm // Establecer la señal de paridad con el bit de signo negado // y negarla en AL mov al, [eax+_3_+3] // EAX := 8 bits de orden alto de x or al, $7F // PF := Bit de signo negado // alt.: and eax, $80000000 setnp al // AL := Not PF; // Señal de paridad negada // alt.: lahf; rol/shl ax, 6 ó rcl ax, 7; xor al,-1 ó not al; and al, $1; // ...o: lahf; ror/shr/sar ax, 10 ó rcr ax, 11; xor al,-1 ó not al; and al, $1; end; En la próxima parte veremos funciones para sumar, restar, multiplicar y dividir enteros gigantes. ________________________________________________________________________ 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 ________________________________________________________________________ 8. 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 ________________________________________________________________________ ¿Errores Delphi? Capture y registre cada error mostrando unidad, clase, método y número de línea. http://www.eurekalog.com/bannerclick.php?id=15 ________________________________________________________________________ 9. Delphi en la Red Por Dave Murray <irongut @ vodafone.net> Componentes, librerías y aplicaciones ===================================== Shareware/Comercial ------------------- * LMD StoragePack - by LMD Innovative - Shareware (EUR 59) Eight components for saving/restoring of configuration data (e.g. at design time, via extended Property Selection dialog) to/from the Windows Eegistry or Ini-, XML- and binary files, being easy to switch between these formats. Full source code and demo projects included. http://www.ceberus.com/lmd/products/index.php3#P9 Freeware -------- * Mozilla v1.3 - by mozilla.org Mozilla 1.3 is now available for download. First there was image blocking, then came pop-up blocking and now we have junk-mail filtering. Mozilla 1.3 also offers image auto-sizing, newsgroup filters, dynamic profile switching, nearly 2000 bug fixes, and more. http://www.mozilla.org/ * Compile Time Expert v1.12 - by Vit Kovalcik (with source) Compile Time is expert, which generates small file right before compilation. You can include this file in some of your units and easily use time of compilation stored in this file. http://www.fi.muni.cz/~xkovalc * Local Heap Memory Manager v1.0 - by Carsten Zeumer (with source) A Delphi memory manager replacement which allows you to limit the memory available to your application. Helps in finding memory holes in your components or to simmulate low memory conditions. http://www.torry.net/vcl/system/memory/localheapmm.zip * TOpacityForm v1.6.0 - by Vjacheslav Maslov (with source) Allows you to create transparent form. You can change transparency at runtime. Uses Layered technology so only Win2k and later supported. http://www.torry.net/vcl/forms/effects/opcform.zip * JG's TIMDBImport v1.02 - by JustGuy (with source) Native Delphi class for importing data from The Internet Movie Database and process it. Including search results and movie info. http://www.torry.net/vcl/internet/other/imdbimport.zip * TVortex OpenSource IRC v2.8.5 - by JoepezT (w. source) (DELPHI/KYLIX) OpenSource IRC components, includes: TVortexIRC for IRC connectivity; TClusterFile for handling incoming files; TClusterChat for handling incoming/outgoing DCC chats; Identd Server for auth services. http://www.berzerk.net * yEnc into a String - by Joao Barata (with source) (DELPHI/KYLIX) Converts a file into a string, which can be imported to TStringList. http://b-tools.hopto.org Actualizaciones de Delphi ------------------------- * Update: Delphi 6 RTL Update Pack 3 A fix for frame streaming is available for download. This update pack is not cumulative, so you need to have installed the General Update and the Update Pack 2 before applying this update. http://community.borland.com/article/0,1410,29932,00.html * Update: StarTeam integration for Delphi 6, 7 and C++Builder 6 Get access to the functionality of StarTeam directly from within the IDE with these new plug-ins (for owners of purchased products). http://community.borland.com/article/0,1410,29831,00.html Artículos, trucos y consejos ============================ * Sip from the Firehose: CodeWright - by David I About the new Borland CodeWright Product Group. http://community.borland.com/article/0,1410,29854,00.html * Non-Rectangular Translucent Forms - by Philippe Randour How, on Windows 2000/XP, you can easily add a non-standard UI to your application by taking advantage of translucency and transparency. http://community.borland.com/article/0,1410,29579,00.html * Sip from the Firehose: Borland Wins Three Jolt Awards - by David I http://community.borland.com/article/0,1410,29882,00.html * Using Semaphores in Delphi: Part 1 - by Cary Jensen Semaphores are like mutexes on steroids. Not only can they coordinate multiple threads and process, but they can permit more than one simultaneous lock. This article shows how to use these useful objects in a multithreaded environment. http://community.borland.com/article/0,1410,29908,00.html * Registering DLL and ActiveX controls from code - by Zarko Gajic How to register and unregister OLE controls such as DLLs or ActiveX Controls from a Delphi application. http://delphi.about.com/library/weekly/aa040803a.htm * How to convert a WideString to a String? http://www.swissdelphicenter.ch/en/showcode.php?id=1692 * How to know if a form already exist before you dynamically create it? http://www.swissdelphicenter.ch/en/showcode.php?id=1693 * Pointer to variant - caution! http://www.swissdelphicenter.ch/en/showcode.php?id=1450 * How to create a database at run-time with ZEOS? http://www.swissdelphicenter.ch/en/showcode.php?id=1552 * How to enable/disable cut, copy, paste, clear of a TEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1700 * How to use a format parameter more than once? http://www.swissdelphicenter.ch/en/showcode.php?id=1690 * How to insert text at a Bookmark (MS Word)? http://www.swissdelphicenter.ch/en/showcode.php?id=1691 * How to create an Access Database? http://www.swissdelphicenter.ch/en/showcode.php?id=1695 * How to copy/paste TStringGrids cells to/from ClipBoard? http://www.swissdelphicenter.ch/en/showcode.php?id=1696 * How to Get the image size of a JPG, GIF and PNG image file? http://www.swissdelphicenter.ch/en/showcode.php?id=1698 * Determine whether the computer supports hibernation, the sleep states? http://www.swissdelphicenter.ch/en/showcode.php?id=1699 * How to get the language of MS Word? http://www.swissdelphicenter.ch/en/showcode.php?id=1688 * How to locate on a non-indexed field in a TTable? http://www.swissdelphicenter.ch/en/showcode.php?id=1348 * How to add records to TStrings (TTreeview / TListview)? http://www.swissdelphicenter.ch/en/showcode.php?id=1482 * How to convert a ADO Recordset to XML and the reverse way? http://www.swissdelphicenter.ch/en/showcode.php?id=1498 * How to create a TListView which automatically resorts by column click? http://www.swissdelphicenter.ch/en/showcode.php?id=1500 * How to stretch a bitmap? http://www.swissdelphicenter.ch/en/showcode.php?id=1566 * How to rotate the text in a StringGrid cell by 90°? http://www.swissdelphicenter.ch/en/showcode.php?id=1596 * How to change the OnClick behavior of a TRadioButton, TCombobox? http://www.swissdelphicenter.ch/en/showcode.php?id=1609 * How to combine two icons? http://www.swissdelphicenter.ch/en/showcode.php?id=1636 * How to save a TImagelist with all its images to a file? http://www.swissdelphicenter.ch/en/showcode.php?id=1626 * How to show a indeterminate ProgressBar in Win XP? http://www.swissdelphicenter.ch/en/showcode.php?id=1680 * How to search a directory tree for a specified file? http://www.swissdelphicenter.ch/en/showcode.php?id=1654 * How to align Text in a TRichEdit? http://www.swissdelphicenter.ch/en/showcode.php?id=1655 * How to detect whether a file's volume is NTFS? http://www.swissdelphicenter.ch/en/showcode.php?id=1657 * How to sort a Stringlist with the CustomSort Method? http://www.swissdelphicenter.ch/en/showcode.php?id=1664 * How to read/write REG_DWORD values from/to the Registry? http://www.swissdelphicenter.ch/en/showcode.php?id=1665 * How to get notified when the user changes the theme (XP)? http://www.swissdelphicenter.ch/en/showcode.php?id=1669 * How to store a TDateTime in the registry? http://www.swissdelphicenter.ch/en/showcode.php?id=1670 * How to Convert method pointers into function pointers? http://www.swissdelphicenter.ch/en/showcode.php?id=1671 * How to Get / Set the Clipboard text (without using VCL)? http://www.swissdelphicenter.ch/en/showcode.php?id=1677 * How to convert a WideString to a String? http://www.swissdelphicenter.ch/en/showcode.php?id=1692 * How to know if a form already exists before you dynamically create it? http://www.swissdelphicenter.ch/en/showcode.php?id=1693 * How to do a 2D Convolution on an Image? http://www.swissdelphicenter.ch/en/showcode.php?id=1704 * How to capture a Delphi CLX Form? http://www.swissdelphicenter.ch/en/showcode.php?id=1708 * Creating a System Restore Point - by Thomas Stutz How to create and cancel system restore points. http://www.delphi3000.com/articles/article_3575.asp * TEdit that damn background - by Matt Harrison Using WMEraseBkGnd to create a TEdit descendant that is transparent or has a background. http://www.delphi3000.com/articles/article_3576.asp * Introduction to SSL - by Eugene Mayevski Why SSL and how it works. http://www.delphi3000.com/articles/article_3577.asp * Certificate basics - by Eugene Mayevski Key management can be an issue in security-related tasks. Certificates define a standard way of managing keys and associated information. They are also used in SSL/TLS protocol and S/MIME. http://www.delphi3000.com/articles/article_3578.asp * How to store and retrieve GIF,BMP + JPG in a RDBMS - by Marcello Dias http://www.delphi3000.com/articles/article_3579.asp * Add task job - by Smile xiao Add a scheduled task job to your system. http://www.delphi3000.com/articles/article_3582.asp * Complete TFTP Server example, using Indy components - by Kim Sandell Example of multi-thredded TFTP Server, using Indy components. http://www.delphi3000.com/articles/article_3583.asp * Retrieve DSN names and ODBC Drivers list - by Oscar Noe Martin http://www.delphi3000.com/articles/article_3584.asp * No, You're not crazy Sql Server doesnt have generators - Marcello Dias How to make a 'Work around' on this limitation. http://www.delphi3000.com/articles/article_3586.asp * An Application Loader with a TCPServer - by Max Kleiner We had the requirement starting different Delphi apps from a linux or windows server, wherever you are. We call it Delphi Web Start (DWS). http://www.delphi3000.com/articles/article_3588.asp * Drawing a Shaded Rectangle - by Serhiy Perevoznyk Using GradientFill API function. http://www.delphi3000.com/articles/article_3591.asp * Bitmap Rotation - by Serhiy Perevoznyk Rotate a Bitmap Image in 90-Degree Increments. http://www.delphi3000.com/articles/article_3592.asp * Drawing Transparent Bitmaps - by Serhiy Perevoznyk http://www.delphi3000.com/articles/article_3593.asp * Alpha Blending a Bitmap - by Serhiy Perevoznyk http://www.delphi3000.com/articles/article_3594.asp * Simple example for the COMPOSITE Design Pattern - by Jochen Fromm What is the Composite Design Pattern? How do you copy a directory with all subdirectories in a simple way? http://www.delphi3000.com/articles/article_3595.asp * Get and use Sender properties, typecast it - by Steen Pedersen How to use the Senders Properties. http://www.delphi3000.com/articles/article_3596.asp * Get FullPath Application of Any Object - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3597.asp * Add Line into the end of a file - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3598.asp * Mouse Moviment Limiting - by Gilberto Saraiva If you want limit the mouse region, use this procedure. http://www.delphi3000.com/articles/article_3599.asp * How to disable the TreeView Hint - by Gilberto Saraiva http://www.delphi3000.com/articles/article_3600.asp * OpenGL II: moving and rotating 2D shapes - by Eber Irigoyen This article shows you some basic movement and rotating and also tries to explain how openGL works. http://www.delphi3000.com/articles/article_3603.asp * Improve Interbase Client Server Performance - by Peter Mc Leod How do you get the best out of your Interbase Client Server System? http://www.delphi3000.com/articles/article_3606.asp * language for MS Office - by Mike Shkolnik How to read the default language of installed MS Office application? http://www.delphi3000.com/articles/article_3607.asp * PHP Alike implode & explode functions for Delphi - by Ronald Buster Implode returns a string containing the elements of a string array in order with a glue string between each element. Explode is the reverse. http://www.delphi3000.com/articles/article_3609.asp * OutlookExpress Directorie - by Ronald Buster How to find the OutlookExpress mailbox dir. http://www.delphi3000.com/articles/article_3611.asp * Ms Access LastinsertID - by Ronald Buster Retrieve the last insert id of the autoincrement field in Access. http://www.delphi3000.com/articles/article_3612.asp * OpenGL III: Moving and rotating 3D shapes - by Eber Irigoyen How to rotate around a shape's axis or rotate around another object. http://www.delphi3000.com/articles/article_3617.asp * Retrieve Current User and Domain Names on Win NT - Serhiy Perevoznyk How to retrieve the Current User and Domain Names on Windows NT using security functions within the Win32 API. http://www.delphi3000.com/articles/article_3618.asp * How to use TClientDataset as memory dataset - by Mike Shkolnik http://www.delphi3000.com/articles/article_3619.asp * Extended Mapi - by Tommy Andersen Accessing the Extended Mapi interface is not allways trivial. This component helps a quite a bit with this problem. http://www.delphi3000.com/articles/article_3620.asp * Simple way to rotate region - by Nik Ozniev http://www.delphi3000.com/articles/article_3623.asp * Understanding Threads - by Subha Narayanan http://www.delphi3000.com/articles/article_3624.asp * Setting File Summary Information - by Serhiy Perevoznyk How to set File Summary Information for non Office files (NTFS). http://www.delphi3000.com/articles/article_3625.asp * Give Me the Details or File Summary Info - by Serhiy Perevoznyk How to retrieve File Summary Information for non Office files (NTFS). http://www.delphi3000.com/articles/article_3626.asp * D7 ActiveX Web deployment bug workaround - by Robert White A workaround for Delphi 7 bug that disables Web Deployment. http://www.delphi3000.com/articles/article_3628.asp * Removing the popup menu in Flash .OCX with Delphi 4 - by Miguel Lucero Removing the popup menu in Macromedia Flash .OCX with Delphi 4. http://www.delphi3000.com/articles/article_3630.asp * OpenGL IV: Texture mapping - by Eber Irigoyen Texture mapping: The process of applying an image to a primitive. Texture mapping is often used to add realism to a scene. For example, you can apply a picture of a building facade to a polygon representing a wall. This article shows how to do texture mapping so your 3D objects become more realistic. http://www.delphi3000.com/articles/article_3631.asp * Making a reliable drawing procedure (random numbers) - Martin Strand How to make sure the same field/name/whatever is not drawn twice? http://www.delphi3000.com/articles/article_3632.asp * DOC to PRN - by Eddie Shipman Creating PRN file from MS Word DOC File. This works with the Word97 components and to make it work with the Word2000 components, some function calls and parameters must be changed. http://www.delphi3000.com/articles/article_3633.asp * Display a Property dialog for file, folder or drive - by Mike Shkolnik http://www.delphi3000.com/articles/article_3634.asp * HTML Dialog Boxes - by Wes Mess Using the ShowHTMLDialog function. http://www.delphi3000.com/articles/article_3635.asp * A Pragmatic Book for Programmers of Any Level - by Brian Kotek If you ever thought it would be great to have a veteran developer answer all of your methodology questions, take a look at this book. Appropriate for all experience levels it explains the development process from a language-neutral perspective. It's one of my favourite books and it includes some examples in Pascal as well as C and Java. http://builder.com.com/article.jhtml?id=u00320030317BXK01.htm * Deciding Between mySQL and SQL Server - by Sanders Kaufman, Jr. MySQL may be free but what if money isn't the only determining factor? Find out how these two database heavyweights stack up against each other and how to decide which one to use as your database system. http://builder.com.com/article.jhtml?id=u00320030318SKJ01.htm * Relational Databases: Inspiration Behind The Theory - by Susan Harkins Discover the origin of the modern relational data model and what every developer should know about this theory. Also, find out what the most important step is toward creating an efficient and flexible database. http://builder.com.com/article.jhtml?id=u00320030402ssh01.htm * Four Things to Consider Before Upgrading to .NET v1.1 - Tim Landgrave Architects and developers will need to consider four key areas that have changed from v1.0 v1.1 of the .NET Framework. These areas are newly integrated features, new functionality, compatibility issues, and security changes. http://builder.com.com/article.jhtml?id=u00320030409lan02.htm * Fast and Furious Guide to MySQL Database Engines - Sanders Kaufman Jr What if you were a racecar driver and could swap engines with the flip of a switch instead of having to make a trip to the garage? The MySQL database does something like this for developers; it gives you a choice of database engines and an easy way to switch them. Let's look at how you choose the engine and how to change between engines that are available to you. http://builder.com.com/article.jhtml?id=u00320030407SKJ01.htm * Tweak Oracle Data Buffers to Cache Entire Databases - Donald Burleson This advanced Oracle article explores the internal mechanisms of the Oracle data buffers, the RAM that Oracle uses to prevent unnecessary rereads of data blocks from disk. Understanding how data buffers operate is an important key to successfully using them in performance tuning an Oracle database. http://builder.com.com/article.jhtml?id=u00320030408brl01.htm Tutoriales ========== * Nesting DataSets in ClientDataSets - by Cary Jensen Like the name suggests, a nested dataset is a dataset within a dataset. By nesting one dataset inside another, you can reduce your overall storage needs, increase the efficiency of network communications, and simplify data operations. http://community.borland.com/article/0,1410,29825,00.html * Writing Robust Code - by Pedro Agulló Soliveres There are many subtle issues to be aware of when it comes to ensuring code correctness and robustness: this article examines some of these issues, with a special emphasis on contract-based programming. http://www.thedelphimagazine.com/samples/1599/1599.htm * Connection Closed Gracefully - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=1 * Introduction to Web Development with Delphi - by Hadi Hariri http://www.swissdelphicenter.ch/en/showarticle.php?id=2 * Introduction to sockets - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=3 * Introduction to Indy - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=4 * Building Kylix Applications: Indy Chapters - by Chad Z. Hower http://www.swissdelphicenter.ch/en/showarticle.php?id=5 * IntraWeb: Implementing a "Hello World" application - Atozed Software http://www.swissdelphicenter.ch/en/showarticle.php?id=6 * IntraWeb Tutorial: User Input - by Atozed Software http://www.swissdelphicenter.ch/en/showarticle.php?id=7 * Creating Oracle User-Defined Aggregate Functions - by Beth Bowden By creating your own aggregate functions, you can extend Oracle's functionality and encourage code reuse in your applications. Find out how easy it is to add this skill to your repertoire. http://builder.com.com/article.jhtml?id=u00320030401adm01.htm * Download Builder.com's 'Remedial XML' series - by Lamont Adams Six-part series, which started with the basics of XML and moved on through data validation and parsers now available to download complete with all the code in either DOC or HTML format. http://builder.com.com/article.jhtml?id=u00320020717adm01.htm * Relational Databases: Inspiration Behind The Theory - by Susan Harkins Trying to use an RDBMS without applying relational database theory to your design is like trying to drive a standard transmission without using the clutch: you're not going to get very far. This series of articles shows how to apply relational rules and develop an efficient design that protects the validity of your data. The series starts with a look at the origins of the relational data model. http://builder.com.com/article.jhtml?id=u00320030402ssh01.htm * Relational Databases: Using Normal Forms to Create Databases - by Susan Harkins Developers have certain rules, known as normal forms, that they follow to create well-designed databases. This article examines normal forms through the creation of a simple database for storing information about a collection of books. http://builder.com.com/article.jhtml?id=u00320030409ssh01.htm * Relational Databases: Applying the First Normal Form - Susan Harkins The normal forms are so abstract that some developers have trouble figuring out how to apply them. Perhaps the best way to understand the normal forms is to start applying them to data, since rules tend to make more sense when you actually have data to divide. This article works through applying the 1NF rule, which is initially the most complicated to apply, to a sample book catalog database. http://builder.com.com/article.jhtml?id=u00320030416ssh01.htm * Relational Databases: Achieving Normalization - by Susan Harkins The last installment of this series began with a single table and worked through making it conform to 1NF. This table wound up becoming four tables. this article finishes the normalizing process by applying 2NF, 3NF and BCNF. http://builder.com.com/article.jhtml?id=u00320030423ssh01.htm Otros enlaces ============= * Pascal Newsletter: Mozilla Sidebar - by Dave Murray Our latest feature for Mozilla and Netscape 6+ users is a sidebar that lets you keep up to date with the latest issue of the newsletter while you browse the web. Just visit our website and click the 'add sidebar' button on the right-hand side of most pages. http://www.latiumsoftware.com/en/index.php * Pascal Newsletter: Opera Hotlist Panel - by Dave Murray Our latest feature for Opera 7 users is a hotlist panel that lets you keep up to date with the latest issue of the newsletter while you browse the web. Just visit our website and click the 'add hotlist panel' button on the right-hand side of most pages. http://www.latiumsoftware.com/en/index.php * Get Set for .NET with Borland launch events - by Anders Ohlsson http://community.borland.com/article/0,1410,29953,00.html * Built With Delphi - by Baltic Solutions Provides a list of all quality commercial, shareware and freeware products that have been developed using Delphi. http://www.balticsolutions.com/bwd/ * Mastering Delphi 7 - by Marco Cantu At the end of February, Sybex released Marco Cantu's latest book, Mastering Delphi 7. To learn more about its contents, differences from the previous version and download the source code visit Marco's site. http://www.marcocantu.com/md7 * Project JEDI Alliance Program Recently a number of people have approached Project JEDI, interested in having their projects become part of JEDI. The Steering Group announces the JEDI Alliance Program and provides guidelines for projects interested in joining. http://www.delphi-jedi.org/Jedi%3AADMIN_JEDI_ALLIANCE%3A441740 * Complete ASCII Table http://www.asciitable.com * The Latest Builder.com Technology Use Survey - by Lamont Adams http://builder.com.com/article.jhtml?id=u00320030331adm02.htm Noticias ======== * Octane - La nueva versión de Delphi - Open Letter to the Delphi Community - por Simon Thornhill http://bdn.borland.com/article/0,1410,29951,00.html - Octane and Delphi Q&A - por Anders Ohlsso http://bdn.borland.com/article/0,1410,29952,00.html * Blog with Delphi and Borland news http://svd.blogspot.com/ * Delphi / InterBase WebLog - by Craig Stuntz News of interest to Delphi and InterBase developers. http://delphi.weblogs.com/ * News Digest: Update for Borland Customers An analyst news digest for Borland Customers. http://community.borland.com/article/0,1410,29848,00.html * Your Future: Delphi 8 OCTANE - by Zarko Gajic Octane is the code name for the next release of your favorite RAD tool. For the 8th anniversary of Delphi, Borland is preparing the most significant Delphi release: Octane will continue to provide VCL and CLX development for Win32 and Linux as well as new features and continued framework, compiler, IDE, and design time enhancements. http://delphi.about.com/cs/delphifornet/a/aa041703a.htm * SwissDelphiCenter NewsFeed Get the 10 most recent programming tips and developer news from SwissDelphiCenter as an RDF NewsFeed file. With the RDF file you can integrate the tips into your website or use them with a newsticker. http://www.swissdelphicenter.ch/en/newsfeed.php ________________________________________________________________________ ¡Vote por el Boletín Pascal en The Programming Pages! http://www.programmingpages.com/?r=latiumsoftwarecomenpascal ________________________________________________________________________ ¡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/p0046.zip ________________________________________________________________________ Página principal: http://www.latiumsoftware.com/es/pascal/index.php 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!






