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.lmdinnovative.com/products/vcl/lmdstoragepack/
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
eds2008 @ 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-2006 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!"
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-2006 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.lmdinnovative.com/products/vcl/lmdstoragepack/
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://cc.codegear.com/Item/19663
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://articles.techrepublic.com.com/5100-10878_11-1044778.html
* 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://articles.techrepublic.com.com/5100-10878_11-5034716.html
* 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.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
http://www.lawebdelprogramador.com/buscar/votar.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/es/file.php?id=p46
________________________________________________________________________
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: eds2008 @ 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
________________________________________________________________________
|