Boletín Pascal #27
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
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 eds2004 @ 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-7 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/ibadmin2.htm ________________________________________________________________________ 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://www.cc.jyu.fi/~ishorppu/english/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.sandbrooksoftware.com/cgi-bin/TopSite2/rankem.cgi?id=latium http://news.optimax.com/topdelphi/links.exe/click?id=70C517ECAE6E http://www.programmingpages.com/?r=latiumsoftwarecomenpascal http://www.top219.org/cgi-bin/vote.cgi?delphi&83 http://top100borland.com/in.php?who=20 http://top200.jazarsoft.com/delphi/rank.php3?id=latium http://213.65.224.200/cgi-bin/toplist.cgi/hits?Id=80 http://www.programacion.net/votar-enlace.php?id=474 http://www.lawebdelprogramador.com/buscar/enlace.php?id=615 Por favor vota. Son sólo unos segundos para ti que REALMENTE pueden hacer la diferencia. Necesitamos tu ayuda para poder continuar. ________________________________________________________________________ Si no has recibido el archivo con el código fuente completo de los ejemplos que se presentan en este boletín, puedes descargarlo de la siguiente dirección: http://www.latiumsoftware.com/descarga/p0027.zip ________________________________________________________________________ Página principal: http://www.latiumsoftware.com/es/pascal/index.php Página del grupo: http://espanol.groups.yahoo.com/group/boletin-pascal/ Para suscribirse / apuntarse: boletin-pascal-subscribe@gruposyahoo.com Para cancelar / removerse: boletin-pascal-unsubscribe@gruposyahoo.com Para reportar problemas con la suscripción: eds2004 @ latiumsoftware.com ________________________________________________________________________ Este boletín se provee "TAL Y COMO ESTA", sin garantía de ninguna clase. Su uso implica la aceptación de nuestros términos de licencia y de la ausencia de garantía que puedes leer en nuestro sitio web. Allí también encontrarás una nota sobre marcas registradas. Te animamos a que redis- tribuyas este boletín, siempre y cuando lo hagas en forma completa (incluyendo la información de copyright), sin modificaciones y de manera gratuita. Los artículos son copyright de sus respectivos autores y se reproducen aquí con el permiso de los mismos. ________________________________________________________________________ Latium Software http://www.latiumsoftware.com/es/index.php Copyright (c) 2001 por Ernesto De Spirito. Todos los derechos reservados ________________________________________________________________________ |
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
¿Errores? ¿Omisiones? ¿Comentarios? Por favor contáctanos!






