Boletín Pascal #27 - 10-OCT-2001
INDICE
1. UNAS PALABRAS DEL EDITOR
2. CÓDIGOS DE BARRA (I)
- Código 39
- Lo que se encuentra en la RED del código 3 de 9
- Código 128
- El problema de los números de longitud par
3. POCKETSTUDIO
- El PODER de PASCAL en la PALMa de su mano!
- Beneficios
- Características
- Herramientas adicionales
- Requerimientos de sistema
- Descarga
- Más información
4. YAPI - YET ANOTHER PRINTER INTERFACE
- El uso más simple
- Por qué Yapi es fácil de entender
- Encapsulación extra de Yapi - el concepto de "línea de informe"
- Informes complicados
- Algunas comparaciones
- Conclusión
5. NOTICIAS
- Delphi 6 Update Pack
- Kylix.sk
6. TRUCOS Y CONSEJOS
- Detectando si el salvapantallas está corriendo
- Refrescando un DriveComboBox
- Capturando mensajes de teclado a nivel de la aplicación
- Sabiendo cuándo un formulario se minimiza
- Abriendo archivos de datos separados por comas
7. DELPHI EN LA RED
________________________________________________________________________
1. UNAS PALABRAS DEL EDITOR
En esta edición me complace presentar otro artículo de Alirio Gavidia, y
tengo el gran placer de anunciar el lanzamiento de PocketStudio, un IDE
tipo Delphi para el desarrollo de aplicaciones para Palm OS, y el lanza-
miento de Kylix.sk, un nuevo sitio web para usuarios de Kylix. También
me complace presentar Yapi, un juego de componentes VCL freeware y
shareware para facilitar la impresión.
Me alegra ver que nuestro foro de consulta para programadores en Delphi
en español (delphi-intermedio) sigue creciendo y que ya ha superado los
380 miembros, con un promedio inferior a los quince mensajes diarios el
mes pasado. Como siempre, lo invito a que vea los últimos mensajes y
compruebe que sus miembros hacen un gran esfuerzo por no dejar preguntas
sin contestar:
http://espanol.groups.yahoo.com/group/delphi-intermedio/messages
Para unirse al foro, puede hacerlo desde la web o por email:
http://espanol.groups.yahoo.com/group/delphi-intermedio/join
delphi-intermedio-subscribe@gruposyahoo.com
Puede configurar su suscripción al foro para convertir o no los mensajes
a formato HTML, o para no recibir los mensajes en su email (podrá ver
los mensajes en la web).
El foro de consulta para programadores en Kylix todavía no tiene mucho
movimiento, pero también sigue creciendo. Para suscribirse:
http://espanol.groups.yahoo.com/group/GrupoKylix/join
GrupoKylix-subscribe@yahoogroups.com
Y no sólo los foros crecen, sino también este boletín, que ya cuenta con
más de 4000 suscriptores y del que tal vez haya una edición en portugués
de Brasil en algún futuro cercano. Los que estén interesados en recibir
la edición en portugués, pueden suscribirse desde la web o -más fácil-
por email:
http://br.groups.yahoo.com/group/boletimpascal/join
boletimpascal-subscribe@yahoogroups.com
Bueno, he tenido un mes muy agitado... Si me he olvidado de mencionar
algo, por favor sepan disculpar y háganmelo saber.
Saludos,
Ernesto De Spirito
eds2008 @ latiumsoftware.com
__________________
Colaboraron en esta edición: Pedro Pablo Oviedo Vera, Luis Hurtado y
Álvaro Lapacó.
________________________________________________________________________
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. CÓDIGOS DE BARRA (I)
Por Alirio A. Gavidia
El presente artículo, en dos partes, trata de referir la teoría básica
de creación de códigos de barra y la creación desde Delphi de los
referidos códigos.
Existe todo un conjunto de simbologías para los códigos de barras. Nos
centraremos en "Code 39" y "Code 128". La razón es la mayoría de los
lectores que he hallado soportan el primero, y el segundo tiene alguna
optimización interesante (usa menos espacio).
Los códigos que analizaremos se basan en dos elementos que referiremos
como barra y espacio, también referimos en algunos momentos dos barras
continuas como una barra ancha, igual con los espacios. Sin embargo, una
barra ancha no tiene que ser el doble de una barra normal. Para código
39 esto es cierto, pero es una medida mínima, no máxima. Combinados bajo
ciertas reglas generamos el patrón de nuestro interés.
Código 39
=========
No es el primero (antes está "Codabar" e "Interleaved 2 of 5") pero sí
es primero en algo: soporte alfanumérico. Cada "carácter" del código 39
tiene cuatro espacios y cinco barras combinadas de manera que se tengan
tres anchas (3 de 9) y cinco delgadas, así que cada carácter mide lo
mismo. Hay 44 símbolos diferentes y un carácter de inicio y final que
normalmente se refiere como "*". No hay límite predefinido en la
longitud total del código y cada carácter comienza y termina con una
barra.
Problemas: el carácter de inicio/fin (asterisco) es igual a la "P" leída
de manera invertida. Esto puede generar inconvenientes para los
lectores. Originalmente no se definió con un carácter de verificación
por ello muchos lectores leen el código aún sin carácter de verifi-
cación. Sin embargo yo me tropecé recientemente con una de esas
aplicaciones que requieren el "Checksum". Fue una máquina de caja
registradora. Para calcular el número en cuestión, se suman todos los
valores de los caracteres de data y se dividen por 43. El resto o modulo
es el valor que debe ser colocado antes del carácter de parada.
Existe un modo ASCII que permite representar 128 caracteres del código
ASCII, pero esto convierte varios caracteres en la combinación de dos,
consecuentemente casi se duplica el ancho del código entero. Esto no es
lo único malo. Sucede que si se codifica en ASCII el lector debe ser
configurado en ese modo, caso contrario se leerán los pares como
elementos separados. Por ejemplo la palabra
"Code+"
en modo ASCII
"C+O+D+E$K"
No haré uso de la opción de modo ASCII.
Lo que se encuentra en la RED del código 3 de 9
===============================================
En alguna ocasión tuve en mis manos un "font" de caracteres para
"Windows" tipo 39. Incluía sólo dígitos, carácter de inicio/fin y no
mucho más. Para la mayoría de las aplicaciones que no necesitaran
códigos alfanuméricos era más que suficiente. Me sorprendió investigar
lo asombrosamente alto de los precios por librerías y utilitarios para
códigos de barras. Incluso encontré una empresa que vende el "font".
Si buscan por Altavista 'Z:3of9 BarCode' deben encontrar el "Font" de
Bob Zormeir (bobz@serv.net) que soporta dígitos, las letras mayúsculas y
los símbolos: - . * $ / % +. Es de libre distribución aunque como es
regular establece condiciones para distribución que están en un archivo
adjunto. El mencionado archivo adjunto contiene algunos "tips" realmente
interesantes que invito a leer con detenimiento.
Incluimos el "font" en esta entrega pero no haremos uso de él en ningún
ejemplo ya que al fin y al cabo sólo tienen que incluir el "font" y
usarlo en etiquetas. Los ejemplos tomarán otro enfoque a través de un
conjunto de funciones que mostraremos aquí.
Código 128
==========
Fue mostrado al mundo en 1981 y se considera de alta densidad, de hecho,
mucho mejor que "Code 39" . Es alfanumérico. Cada carácter tiene 11
elementos combinados de forma de presentar tres barras y tres espacios.
Siempre empieza con una barra y termina con un espacio.
Es interesante que hay 106 combinaciones de caracteres generables con
este código, pero cada carácter puede tener tres significados
diferentes. Lo mejor de todo es que hay caracteres que combinan dos
dígitos, veremos esto en más detalle luego. Hay un carácter de inicio,
uno de parada y uno de chequeo.
En realidad hay tres caracteres de inicio que conoceremos como "Start
Code A", "Start Code B" y "Start Code C". Los patrones tendrán signifi-
cados diferentes según el carácter de inicio seleccionado. Por ejemplo la
combinación de códigos que representan CR ("carriage return") la "m" y
el par "77" son iguales. Esto también tiene una consecuencia intere-
sante: hay dos maneras de escribir "77", bien como un solo código o como
la secuencia de dos "7".
Es posible entre el inicio y final de una secuencia cambiar de un tipo
de codificación a otro. Para ello se define un "Shift code".
Se podría tener un "font" de este código pero el uso del "checksum" y
los distintos patrones de inicio lo hacen algo impráctico.
Limitaciones tipográficas no me permiten generar un representación
fidedigna de un código de barras, así que recurriré a la imaginación del
lector. Utilizaré una "x" para representar una barra y un "-" para los
espacios.
Así, el "7" con código 39 sería: x-x--x-xx-xx
Así, el "7" con código 128 sería: xxx-xx-xxx-
Así, el "77" con código 128 sería: xxx-xx-xxx-xxx-xx-xxx (Código A o B)
ó xxxx-xxx-x- (Código C)
El problema de los números de longitud par
==========================================
Código 128 es ahorrativo cuando se codifica números de dos en dos. Ello
es porque los caracteres definidos bajo el código "C" representan duplas
de números desde "00" hasta "99". El problema es que con longitud impar
no hay secuencia en "Code C" que represente un solo dígito. Las
soluciones son dos: Aceptar un cero a la izquierda como carente de valor
o pasar de "Code C" a alguno de los otros modelos (B o A) y entonces
representar el dígito que nos interesa. En muchos casos las aplicaciones
toman los códigos de productos de inventario como alfanuméricos, y no
siempre podemos escoger una longitud par.
Para representar "123" podemos:
1.- Usar codificación "C" y los pares "01" "23". El código completo
sería <Code C>-<01>-<23>-<Check>-<Fin>.
2.- Usar codificación "C" y luego pasar a "B". El código resultante
sería <Code C>-<01>-<Paso a cod B>-<2>-<Check>-<Fin>.
3.- Usar codificación "B" (o "A") . El código resultante sería
<Code B>-<1>-<2>-<3>-<Check>-<Fin>.
Es notable que la primera solución es las más corta. Lamentablemente no
es aplicable en situaciones donde "0123" no equivale a "123".
Próxima entrega:
Versará sobre la creación de códigos de barra tipo 39 y 128 haciendo
para ello uso de Delphi.
________________________________________________________________________
3. POCKETSTUDIO
El PODER de PASCAL en la PALMa de su mano!
==========================================
No puedo recordar la cantidad de veces que me han preguntado si hay un
Delphi para los dispositivos de mano... Si usted se encuentra entre
quienes deseaban capitalizar su experiencia en Delphi para desarrollar
aplicaciones para Palm OS, ahora puede hacerlo! Pocket Technologies,
Inc. ha lanzado PocketStudio Professional Edition v1.0, una solución
completa de desarrollo para dispositivos incrustados (embedded) y de
mano (handheld). La edición profesional de PocketStudio es una nueva e
innovadora herramienta de desarrollo resultante de la poderosa combi-
nación de un compilador avanzado de 32 bits y un entorno integrado de
desarrollo fácil de usar que le permite construir rápidamente aplica-
ciones sofisticadas para Palm OS. PocketStudio provee el poder combinado
igual a C/C++ con la facilidad de uso de Delphi para hacer desarrollos
para PalmOS más simples y más poderosos que la mayoría de los desarro-
lladores jamás pensó posible.
El IDE corre en Windows 9x/NT 4.0/2000 y puede producir aplicaciones
optimizadas, libres de runtimes, y nativas para las plataformas
actualmente soportadas (ver abajo los requisitos de sistema) que se
pueden probar en el emulador de Palm OS (POSE) que se incluye con el
producto.
Beneficios
==========
* Fácil aprender. Los tiempos de aprendizaje y desarrollo se acortan
significativamente.
* La creación de aplicaciones complejas y poderosas es algo simple e
intuitivo.
* Lleve los productos al mercado más rápido que con las herramientas de
desarrollo competidoras.
* Permite a los desarrolladores de aplicaciones de escritorio migrar
fácilmente al desarrollo para PalmOS.
Características
===============
* General
- Crea aplicaciones optimizadas y nativas de PalmOS (muy rápidas y
pequeñas)
- No requiere runtimes (bibliotecas de tiempo de ejecución)
- Inline Assembler
- Archivo de ayuda en línea completo y referencia de la API de PalmOS
- Soporte para aplicaciones multisegmentadas
- Asistentes de proyectos (Project Wizards) - cree una aplicación Palm
de base de datos en minutos
- Ejemplos, ejemplos y más ejemplos
- WebUpdate - manténgase al día con la actualización web integrada
(automáticamente notifica, descarga e instala la última versión de
PocketStudio)
- Conduit Wizard - un asistende de conducto genérico para crear un
conducto simple para sincronizar sus datos Palm con el escritorio
- Soporte para HandEra, Kyocera, Handspring, Symbol, Sony, y la
mayoría de los dispositivos PalmOS disponibles hoy en día
* Entorno Integrado de Desarrollo
- Creado específicamente para desarrollo "handheld"
- Administrador de proyecto para el acceso fácil a todos los aspectos
de su proyecto
- Editores integrados PalmForm y PalmCode
- Diseñador visual PalmForm con arrastrar y soltar
- Navegación visual clara a cada aspecto de su proyecto
- Plantillas de proyecto - proyectos pre-diseñados que sirven como
punto de partida para diseñar sus aplicaciones
- Tecnología PSL - (PocketStudio SnapIn Libraries) agregue las carac-
terísticas que usted desea con la API de IDE abierto. El IDE entero
fue construido esta manera!
- Depuración integrada usando el emulador POSE
- Colección de componentes PXL (PocketStudio Extended Library) de
código de fuente compilado que se enchufan directamente al IDE de
PocketStudio para fácil integración, reutilización de código, y
permitir desarrollos de terceros.
* Editor PalmCode
- Resaltador de sintaxis - especifique cómo aparecen los diversos
elementos de su código en el editor PalmCode.
- Completado de código - muestra los métodos y propiedades de un
componente o un recurso
- Parámetros de código - muestra los argumentos requeridos
automáticamente
- Plantillas de código - inserte código comúnmente usado en su fuente
- Explorador PalmCode - navegación fácil de cada aspecto de su código
a través de una estructura jerárquica de árbol
* Lenguajes soportados
- Lenguaje basado en Pascal
. Acceso a toda la API de Palm OS
. Transición fácil del desarrollo para PCs de escritorio al
desarrollo para dispositivos de mano
. Cree y utilice bibliotecas compartidas
* Diseñador de Recursos
- Diseñador PalmForm - diseño visual con arrastrar y soltar
- Inspector de Componente - edite fácilmente las propiedades y los
eventos de un componente
- Explorador de Recursos - navegación visual clara y edición de todos
los recursos del proyecto, tanto visuales como no visuales
- Editor PalmCode Integrado - acceso inmediato a los eventos y código
para todos los componentes
- Paleta de Componentes - la característica Help Hints (pistas de
ayuda) de la paleta de componentes exhibe una pequeña ventana
emergente que contiene el nombre o descripción breve de un botón
cuando el cursor está sobre el mismo por más de un segundo.
- Cree menús, "dropdowns", u otros recursos en una área conveniente.
* Depurador
- El depurador integrado le puede ayudar a rastrear tanto errores de
tiempo de ejecución como errores de lógica.
- Ejecutando partes específicas de su programa y viendo el estado del
mismo en esos lugares, usted puede monitorear cómo se comporta su
programa y encontrar las áreas donde no se está comportando como
usted pretende.
- El depurador completamente integrado "direct-to-POSE" le permite
ejecutar y probar su aplicación desde el IDE de PocketStudio
- Puntos de ruptura, visor de variables, y paso a través
- Vea las variables en la ventana Watch.
Herramientas adicionales
========================
* Generic Conduit
Permite fácil sincronización de escritorio. Incluye código fuente
completo en Delphi (se requiere TurboSync).
* TurboSync SDK
Versión de evaluación de un kit de desarrollo de conductos para
Delphi.
* Extensivos ejemplos
Larga lista de ejemplos incluidos en el paquete. Gran punto de partida
para cualquier desarrollo para Palm OS.
* Emulador de Palm OS de Palm, Inc. (Palm OS Emulator - POSE)
Requerimientos de sistema
=========================
* Sistemas operativos del anfitrión
- Windows 9x/NT 4.0/2000
* Requisitos mínimos
- Windows 9x/NT/2000
- 32 MB RAM
- 30 MB espacio disponible en disco duro
- CD-ROM para la instalación
* Sistemas operativos destino
- Todas las versiones de Palm OS soportadas por Palm OS SDK 3.5
- Crea aplicaciones optimizadas nativas de Palm OS - no se requieren
runtimes
* Soporte de procesador destino
- Motorola 68328 Dragonball
- Motorola 68ex328
- Motorola 68v2328
(Handspring Visor Prism & Platinum)
Descarga
========
Hay una versión de evaluación gratuita disponible para descargar:
http://pocket-technologies.com/trial.asp
Más información
===============
Para más información, por favor diríjase al sitio web de Pocket
Technologies:
http://www.pocket-technologies.com
---------------------
Partes de este artículo fueron tomadas del sitio web de Pocket
Technologies y son Copyright (c) 2001 Pocket Technologies Inc. - Todos
los derechos reservados. Han sido reproducidas y modificadas aquí con
permiso del autor.
________________________________________________________________________
IBAdmin 3.22 - Complete Interbase SQL tool - Una poderosa herramienta de
administración y desarrollo para manejar servidores y bases de datos
Interbase. IBAdmin provee muchas capacidades para ayudarle en el diseño
y gestión de su base de datos. Diseñe visualmente la estructura de su
BD con el "Database Designer", administre usuarios y permisos con el
"Grant Manager", o emplee el "SQL Debugger" para depurar procedimientos
almacenados y triggers. Disfrute de una edición confortable de código
con Code-Insight y Code Completion. >> http://www.sqlly.com/
________________________________________________________________________
4. YAPI - YET ANOTHER PRINTER INTERFACE
Por Owen Mooney
Yapi es la manera más simple de imprimir con Delphi. Yapi es a la vez
muy simple y sofisticado. Puede ser utilizado con igual facilidad para
aplicaciones de bases de datos como para aplicaciones comunes.
El uso más simple
=================
Antes de escribir sobre los detalles de Yapi, consideremos la prueba de
usabilidad más básica. ¿Qué tan aprisa se puede desarrollar la más
simple posible aplicación de impresión? Tomé el tiempo. Imprimir 'Hola
mundo' (vía vista previa de impresión) tomó apenas 45 segundos. El
proceso es como sigue:
Inicie Delphi, del menú File elija "New Application"
- Elija la paleta de componentes Yapi
- Suelte dos componentes en el formulario
- Elija la paleta de componentes Yapi
- Suelte un botón normal en el formulario
- Haga doble clic en el botón para ir a su código de evento
- Agregue dos líneas de código (véase abajo)
- Presione F9 para ejecutar el programa
- Haga clic en el botón para ver la ventana de vista previa de
impresión, y luego imprima.
El tiempo total no incluyó el tiempo de inicio de Delphi. Las dos líneas
de código están en el evento del botón como sigue:
procedure TForm1.Button1Click(Sender: TObject);
begin
yapitext1.writeln('Hola mundo');
yapipaper1.preview;
end;
¿Qué logramos en estos 45 segundos? En primer lugar obtuvimos el texto
colocado correctamente dentro de los márgenes de la página con la fuente
predeterminada típica (Times New Roman, 12 puntos). En segundo lugar
obtuvimos una ventana de vista previa de impresión. Ésta tiene un botón
"Print now" (imprimir ahora), un botón de diálogo de impresora que
controla la cantidad de copias, la página a imprimir, etc. También
obtuvimos controles de zoom, página anterior, página siguiente, etc.
Así como la vista previa de impresión normal, la vista previa de Yapi
también proporciona un método totalmente único para controlar las líneas
viudas y huérfanas del informe final.
Por qué Yapi es fácil de entender
=================================
Los sistemas de software hacen uso extensivo de metáforas. Una ventana
en una pantalla de la computadora es una metáfora de una ventana física
sobre un documento debajo de ella. Un botón es una metáfora de algo a
ser presionado con un dedo verdadero. Los procesadores de textos son
metáforas de máquinas de escribir, con "hojas" de papel en blanco a
mecanografiar, y una barra de tabulaciones que casi se parece a las
tabulaciones en una máquina de escribir mecánica.
Yapi hace un excelente uso de metáforas. El principio del componente
Yapi es una metáfora para una hoja de papel. El tamaño del papel,
márgenes de la impresión, tabulaciones, etc. se establecen todos de
forma WYSIWYG en la ventana del Inspector de Objetos.
La siguiente metáfora es el texto. Puede haber cualquier número de estos
componentes, cada uno controlando diversas fuentes, colores, corte de
líneas (word wrapping), y posicionamiento dentro del informe.
La tercera metáfora es la tabulación. Éstas se sueltan en el papel y se
mueven a su posición tan fácilmente como en cualquier procesador de
textos.
Mientras todas las opciones de formato se establecen como objetos y sus
propiedades, no sucede lo mismo con el contenido. Aquí es dónde Yapi
toma una separación radical de los generadores de informes y de otras
interfaces de impresión.
Los generadores de informes utilizan un manojo de componentes para poner
la información en los informes. Yapi apenas usa:
write( ... );
writeln( ... );
writeattab( ..., tabNumber);
Toda la complejidad de la colocación en el informe se encapsula en
variaciones de las llamadas a estos tres métodos.
Para nosotros, los programadores más viejos, esto es muy natural. Hemos
estado utilizando write y writeln por años. A los usuarios de genera-
dores de informes esto puede parecerles un paso hacia atrás, pero es muy
fácil. Los programadores ya no están limitados a lo que ofrece el
generador de informes. Pueden poner cualquier cosa en el informe, en
cualquier mezcla de fuentes, incluyendo diversas fuentes en la misma
línea. Incluso bitmaps y gráficos se pueden poner en la misma línea del
texto. Pueden combinar información de base de datos, con datos de la
web, con contenido de emails, con datos de FTP, con el contenido de un
StringGrid, etc. Toda esta información se puede integrar fácilmente en
el mismo informe. Esto se hace todo con algunos "writelns".
Todas las buenas herramientas de impresión deben proveer una buena vista
previa de impresión. Esto requiere la encapsulación del escalamiento de
la presentación y otras acciones asociadas al lienzo (canvas) de la
impresora y al lienzo (canvas) de la vista previa de impresión. Yapi
hace esto, pero también hace otra encapsulación adicional importante
como sigue...
Encapsulación extra de Yapi – el concepto de "línea de informe"
================================================================
Yapi no trabaja con bandas. Trabaja con líneas. Encapsula el concepto de
"texto en una línea" (o imágenes, o gráficos). Maneja todo el posiciona-
miento y paginación de estas líneas casi exactamente de la misma manera
que lo hacen los procesadores de textos. Amplía el concepto de la
"línea" para "texto en esta página" y "texto en todas las páginas" para
sustituir la funcionalidad de las "bandas". Como los procesadores de
textos, el manejo de diversas fuentes, e incluso bitmaps en la misma
línea se maneja correctamente. Todo esto le confiere a Yapi una
"sensación" muy simple y natural, con buen flujo de contenido de página
a página. Además, Yapi tiene características únicas donde el operador
final del programa puede ver la vista previa de impresión y ajustar el
flujo de página a página con control de viudas y huérfanas.
Informe complicados
===================
Una buena prueba para informes es exhibir la tabla "biolife" en DBDemos.
Esta tabla contiene no sólo campos de cadena y campos numéricos, sino
también un campo memo, y un BITMAP. Para un buen generador de informes,
esto se puede establecer usando varios componentes. Yapi, sin embargo,
no tiene ningún componente enlazado a datos, y sin embargo este informe
complejo utiliza solamente 32 líneas de código. Se provee el código
fuente de este informe como ejemplo.
Algunas comparaciones
=====================
Delphi se provee con QReports. La cantidad de generadores de informes y
de interfaces de impresión alternativos indica sus limitaciones. Nuestro
equipo construía un sistema bancario de Unión de Crédito. Evaluamos
QReports y lo rechazamos. Yapi proveyó todos los informes bancarios.
También se evaluó Report Printer Pro para el mismo trabajo y también fue
rechazado como demasiado complejo y desordenado de utilizar con algunos
de los informes complicados que creábamos.
Conclusión
==========
Yapi provee un interfaz de impresión muy simple. Necesita solamente
siete componentes para hacer casi cualquier clase de informe. El manual
de referencia es de 16 páginas pequeñas. El tiempo de aprendizaje es de
solamente 5 minutos. A pesar de esto, se puede llevar a cabo una gama
muy amplia de actividades de impresión, y se pueden producir informes
muy atractivos y abarcativos.
La versión estándar gratuita (FREEWARE) de Yapi se puede descargar del
sitio web de Yapi:
http://www.geocities.com/yapisoftware
(este es un cambio respecto del sitio web anterior)
También hay disponible una versión profesional para evaluación y compra,
y actualmente se la está mejorando a fin de incluir la tecnología
"ExpertImage" para la impresión mejorada de imágenes.
---------------------
El autor puede ser contactado a <yapi@scottech.net>.
________________________________________________________________________
5. NOTICIAS
Delphi 6 Update Pack
====================
A inicios del mes pasado Borland lanzó la primera actualización para
Delphi 6, pero más tarde la retiró tras algunos reportes de errores.
Tres semanas más tarde Borland puso el parche de actualización corregido
disponible para descargar:
http://www.borland.com/delphi/webreg/registeredusers.html
* Download the fixed Delphi 6 Updates - by John Kaster
http://community.borland.com/article/0,1410,27800,00.html
Kylix.sk
========
Por Michal Laclavik
El sitio kylix.sk fue creado para compartir código y experiencia entre
desarrolladores de Kylix, una gran y única herramienta de desarrollo
visual para Linux.
Por favor contribuya para ayudarnos a hacer este sitio útil. El sitio
contiene actualmente solamente características simples, y el equipo de
Kylix.sk comenzará a agregar nuevas características tan pronto como la
comunidad de Kylix comience a utilizar el sitio.
El sitio tiene actualmente las secciones siguientes:
- ARTICLES (artículos). Experiencia que usted quiera compartir con
otros desarrolladores.
- CODE (código). Para compartir código o componentes con otros.
- NEWS (noticias). Enlaces a otros sitios con algo de información.
- JOBS (trabajos). Compañías o individuos capaces de ofrecer trabajo.
- LINKS (enlaces). Lista de todos los enlaces interesantes sobre Kylix o
sitios relacionados.
- MY PROFILE (mi perfil). Utilizado actualmente para editar los perfiles
de los usuarios.
¡Regístrese! Si usted desea agregar artículos, código o trabajos tiene
primero que registrarse. La forma en que se verá este sitio depende de
nosotros, los desarrolladores en Kylix! Si usted tiene cualquier
comentario o pregunta, siéntase libre de contactarnos a <info@kylix.sk>.
________________________________________________________________________
6. TRUCOS Y CONSEJOS
Detectando si el salvapantallas está corriendo
==============================================
A partir de Windows 98 y Windows NT 5.0 se puede usar la función API
SystemParametersInfo para determinar si el salvapantallas está
ejecutándose. En versiones anteriores de Windows NT podemos determinar
si el salvapantallas está corriendo viendo si existe el escritorio
llamado "screen-saver". Este escritorio es donde corre el salvapan-
tallas y existe mientras el salvapantallas está corriendo. Si podemos
abrir ese escritorio o si no podemos porque se nos niega el acceso,
entonces el escritorio existe y consiguientemente el salvapantallas está
corriendo:
function ScreenSaverRunning: boolean;
const
SPI_GETSCREENSAVERRUNNING = 114;
var
VI: TOSVersionInfo;
Running: integer;
hDesktop: HDESK;
begin
Result := False;
FillChar(VI, SizeOf(VI), 0);
VI.dwOSVersionInfoSize := SizeOf(VI);
if GetVersionEx(VI) then exit;
if (VI.dwPlatformid = 1) and (VI.dwMinorVersion > 0) or
(VI.dwPlatformid = 2) and (VI.dwMajorVersion >= 5) or
(VI.dwPlatformid > 2) then begin
// Windows 98 o superior, o Windows NT 5 o superior
SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @Running, 0);
Result := Running <> 0;
end else if (VI.dwPlatformid = 2) and (VI.dwMajorVersion < 5) then
begin // Windows NT 3 o Windows NT 4
// Intentamos abrir el escritorio "screen-saver"
hDesktop := OpenDesktop('screen-saver', 0, False,
MAXIMUM_ALLOWED);
if hDesktop = 0 then
// No se pudo abrir el escritorio. Analizamos la causa.
if GetLastError() = ERROR_ACCESS_DENIED then
// Si es por acceso acceso, es porque el salvapantallas
// lo tiene, y por lo tanto está corriendo.
Result := True
else
// Si es por otra razón, el salvapantallas no está corriendo
Result := False
else begin
// Se pudo abrir el escritorio, lo que significa que el
// salvapantallas está corriendo.
CloseDesktop(hDesktop); // Cerramos el escritorio
Result := True;
end;
end;
end;
Refrescando un DriveComboBox
============================
El componente TDriveComboBox no tiene un método Refresh para actualizar
la lista de unidades, pero podemos forzar a que la lista se vuelva a
generar asignando el valor de la propiedad TextCase:
with DriveComboBox1 do TextCase := TextCase;
Eso equivaldría a DriveComboBox1.Refresh; si existiera.
Capturando mensajes de teclado a nivel de la aplicación
=======================================================
Capturamos los mensajes del teclado con el evento OnMessage del objeto
Application. Puede encontrar artículos similares, pero el código
presentado aquí (adjunto) es más completo y considera ciertos casos
especiales. No puedo tratar detalladamente el código fuente, pero aquí
van algunas explicaciones generales...
Para la tecla INTRO (VK_RETURN) queremos trasladar el foco al siguiente
control en el caso de cuadros de texto, así que preguntamos si el
control activo desciende de TCustomEdit, que incluye TEdit, TDBEdit,
TMaskEdit, TDBMaskEdit, TMemo, TDBMemo y otros componentes provistos por
terceros. Puesto que deseamos excluir TMemo, TDBMemo y, en general, todo
descendiente TCustomMemo, realizamos una provisión especial en este caso
(dejando el mensaje sin cambios y sin realizar ninguna acción), quedán-
donos así con los cuadros de edición de una sola línea, a los que
añadimos cuadros de lista, cuadros combinados, etc. Para estos elementos
substituimos la tecla INTRO (VK_RETURN) por un tabulador (VK_TAB), tanto
para los mensajes WM_KEYDOWN como los mensajes WM_KEYUP.
Sin embargo, en el caso de un cuadro combinado (cualquier descendiente
de TCustomCombobox), cuando la lista se despliega deseamos mantener el
comportamiento tradicional de la tecla INTRO (es decir, que cierre la
lista).
Sería agradable tener un atajo de teclado para el botón predeterminado
de un formulario (el botón con su propiedad Default puesta en True),
como por ejemplo CTRL+INTRO. Esta característica se incluye en el
código. La manera que se logra es un poco compleja de explicar... Quizás
hubiera sido más fácil iterar por los componentes en un formulario para
encontrar un botón capaz de recibir el foco y con Default = True, y
entonces llamar su método Click, pero hemos usado un código similar al
que se usa en los formularios VCL, que considera el hecho que la tecla
INTRO puede ser deseada de atrapar por muchos controles, no solamente un
botón.
También quisiéramos que la tecla flecha ABAJO (VK_DOWN) fuera mapeada
como TAB (VK_TAB). Para este caso utilizamos un código más simple. Por
supuesto, también quisiéramos que la tecla flecha ARRIBA (VK_UP) fuera
mapeada a una combinación SHIFT+TAB. Bien, no es posible mapear a una
tecla con un modificador. Podemos descartar la tecla y simular los
eventos de presionar la tecla SHIFT y luego TAB, o podemos cambiar el
estado de la tecla SHIFT en el arreglo de estado del teclado (como
hicimos con la tecla CTRL la combinación CTRL+INTRO), pero decidimos
tomar un enfoque diferente (simplemente establecer el foco al control
anterior al control activo en el orden de tabulación).
Finalmente, para las aplicaciones españolas es generalmente deseable
sustituir el punto del teclado numérico por un coma (que es el separador
decimal en español).
Sabiendo cuándo un formulario se minimiza
=========================================
Los formularios no tienen un evento OnMinimize, pero podemos capturar
el mensaje WM_SYSCOMMAND para saber si el formulario está siendo
minimizado.
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMSysCommand(var Message: TWMSysCommand);
message WM_SYSCOMMAND;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if Message.CmdType = SC_MINIMIZE then
// El formulario está por ser minimizado
;
inherited; // Dejamos que el formulario procese el mensaje
if Message.CmdType = SC_MINIMIZE then
// El formulario ha sido minimizado
;
end;
Si no queremos que el formulario se minimice, debemos salir del procedi-
miento antes de llamar a inherited.
Abriendo archivos de datos separados por comas
==============================================
La BDE tiene un controlador (driver) ASCII que nos permite abrir
archivos de texto que contienen datos en formato delimitado por comas.
Cada línea en el archivo de texto es un registro, y los valores de los
campos se separan por comas (puede ser otro caracter). Por ejemplo,
consideremos los siguientes datos:
+-----+-----------+---+------+------+
| 123 | Product A | 1 | 2.10 | 2.90 |
+-----+-----------+---+------+------+
| 456 | Product B | 1 | 1.70 | 2.50 |
+-----+-----------+---+------+------+
Los mismos serían guardados en el archivo de texto (por ejemplo
Table1.txt) como:
123,Product A,1,2.10,2.90
456,Product B,1,1.70,2.50
Para poder abrir tal archivo como una tabla, tenemos que crear otro
archivo de texto describiendo la estructura de la tabla. El mismo debe
tener el mismo nombre pero con extensión SCH (por ejemplo Table1.sch).
Se parece mucho a un archivo INI, por ejemplo:
[Table1]
FILETYPE=VARYING
CHARSET=ascii
DELIMITER=
SEPARATOR=,
Field1=Code,Long Integer,11,00,00
Field2=Name,Char,17,00,11
Field3=Value1,Float,20,02,28
Field4=Value2,Float,20,02,48
Field5=Value3,Float,20,02,68
Ahora, para abrir el archivo de datos no se olvide de establecer la
propiedad TableType del componente TTable a ttASCII.
________________________________________________________________________
7. DELPHI EN LA RED
Artículos, trucos y consejos
============================
* Delphi Database Programming Course - By Zarko Gajic
Free online database programming course for beginner Delphi developers
focused on ADO techniques. Three new chapters have been added in the
last month (Chapter 15 "Lookup!", Chapter 16 "Compacting an Access
database with ADO and Delphi" and Chapter 17 "Database reports with
Delphi and ADO").
http://delphi.about.com/library/weekly/aa010101a.htm
* Component writing, part 3 - By Peter Morris
This article is the final part of a three part article on components.
This final part will cover property / component editors, how to write
dedicated editors for your component / property, and how to write
"hidden" components.
http://www.howtodothings.com/showarticle.asp?article=327
* Web Site inside a Delphi EXE - By Zarko Gajic
How to store Web-style content inside a Delphi application
http://delphi.about.com/library/weekly/aa061901a.htm
* "The Big Brother" Delphi code toolkit - By Zarko Gajic
Going undercover: hiding from the task list, disabling task-switch,
removing from the TaskBar, disabling shut down, ...
http://delphi.about.com/library/weekly/aa022701a.htm
* Twain and Delphi - By Zarko Gajic
Acquire images from scanners, cameras and image capture devices using
Delphi. See how to import (and wrap in a component) an image scan
control within Delphi.
http://delphi.about.com/library/weekly/aa030299.htm
* Developing Cross Platform Portable Applications (for beginners)
By Ismo Horppu
http://users.jyu.fi/~ishorppu/projects/cpd_english.htm
* Data-Aware Tree Views - by Roland Rundzjo
Graphically Presenting Hierarchical Information
http://www.ocdelphi.org/bfeature.htm
* Creating a custom database login form - by Tom Wolken
http://www.elementkjournals.com/ddj/9809/ddj9891.htm
* Multiple Selections in a String Grid - By Christian Ebenegger and
Thierry Revillard
http://www.undu.com/Articles/011005c.html
* Help for component creators - by Pintér Gábor.
Create a help file for your new component that is exactly like
Delphi's internal help pages. With source code, examples, and
installation instructions.
http://community.borland.com/article/0,1410,26679,00.html
* How to adjust TDBGrid column widths automatically - by Philippe
Randour
This handy procedure automatically adjusts the size of static DBGrid
columns to fit the DBGrid client width when the user resizes the form
containing the grid. Say goodbye to the horizontal scrollbar!
http://community.borland.com/article/0,1410,27548,00.html
* Using COM+ object pooling with Delphi 6 - by Vincent Parrett
Delphi 6 introduces support for COM+ object pooling, which can provide
significant performance improvements under some circumstances. We take
a look at Delphi 6's object pooling support.
http://community.borland.com/article/0,1410,27568,00.html
* Changes to TThread in Delphi 6 and Kylix - by Craig Stuntz
Delphi's TThread class and its various support methods have been
significantly revised in Delphi 6. This article will discuss what
these changes mean to developers of multithreaded applications.
http://community.borland.com/article/0,1410,27655,00.html
* Installing InterBase to start automatically and run as a service under
Linux - by Richard Combs
http://community.borland.com/article/0,1410,27761,00.html
* Resource Meter for Windows 95/98/ME - by Wen Kiat Chua
How to the System, User, GDI resources for Windows 95/98/ME
http://www.delphi3000.com/articles/article_2732.asp
* Add-in for MS Office Applications - by Daniel Wischnewski
How to write an addin (plugin) for MS Office applications.
http://www.delphi3000.com/articles/article_2719.asp
* C++-like templates in Delphi Object Pascal - by Rossen Assenov
How to make C++-like templates in Object Pascal.
http://www.delphi3000.com/articles/article_2695.asp
* Rolling up a form - by Si Carter
A new effect for forms
http://www.delphi3000.com/articles/article_2696.asp
* Making your own anti-virus - by Rafael Ribas Aguiló
Prevent Love-Letter and other VBS viruses by yourself.
http://www.delphi3000.com/articles/article_2685.asp
Componentes VCL
===============
* Moveable/Sizable TPanel with standard or color SizeGrip - by Kevin
Gallagher
http://www.delphi3000.com/articles/article_2745.asp
* Fill In Combo Box - by Daniel Wischnewski
Simple, enhanced combo box, that fills in the text area with possible
options from the items list
http://www.delphi3000.com/articles/article_2743.asp
Tutoriales
==========
* Pascal for Delphi Programmers- by Bryan Valencia
http://www.209software.com/books/p4dp/p4dp.html
* Web programming in Delphi
http://www.209software.com/books/wpid/
* Foundations in Database Development with Delphi and C++Builder - by
Cary Jensen
Introduction to the basic techniques for building BDE database
applications using Delphi or C++Builder
http://community.borland.com/article/0,1410,20564,00.html
Enlaces
=======
* KYLIX.SK
http://kylix.sk
________________________________________________________________________
¡TÚ PUEDES AYUDARNOS!
Necesitamos tu ayuda para que este boletín pueda continuar y crecer. Una
forma en que puedes ayudarnos es enviando este enlace a tus amigos:
http://www.latiumsoftware.com/es/pascal/index.php
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, que esperamos en el futuro se traduzca también en un
mayor número de colaboraciones de artículos, trucos, etc.:
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=p27
________________________________________________________________________
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) 2001 por Ernesto De Spirito. Todos los derechos reservados
________________________________________________________________________
|