Boletín Pascal #10
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
Boletín Pascal #10 - 12-NOV-2000 INDICE 1. UNAS PALABRAS DEL EDITOR 2. MYSQL - ¿QUE ES MYSQL? - LA LICENCIA DE MYSQL - DELPHI Y MYSQL - ODBC - LIBMYSQL.DLL - WINZEOS 3. "POST-IT". VENTANAS AJUSTABLES SIN BORDE NI TITULO - ¿POR QUE UN FORMULARIO SIN BORDE NI TITULO? - ENTREMOS EN CALOR - MANEJANDO UN FORMULARIO SIN BORDE NI BARRA DE TITULO - UN FORMULARIO PRINCIPAL INVISIBLE - NO ES UNA FALLA, ES UNA VENTAJA - "POP-UP MENU" 4. ENLACES ________________________________________________________________________ 1. UNAS PALABRAS DEL EDITOR Aquellos de ustedes que siguen el Boletín para Desarrolladores proba- blemente hayan leído que -por razones de trabajo- ese boletín será mensual. Sin embargo, voy a esforzarme para seguir sacando el Boletín Pascal más o menos dos veces al mes como hasta ahora, aunque apreciaría algo de ayuda. Usted puede ayudar a mantener este boletín contribuyendo artículos sobre programación en Delphi. Retendrá los derechos de autor de todo el material que nos envíe, pero debe otorgarnos un permiso permanente, no revocable y libre de regalías para traducir y publicar su artículo (en su forma original, así como traducido) mientras que lo hagamos en forma completa (incluyendo su noticia de copyright y la información del autor que nos envíe con el propósito de ser publicada, como su dirección de email, sitio web, institución educativa, etc.), sin modificaciones y gratis. Los boletines se publican por email y en nuestro sitio web, y cada edición se licencia para que pueda ser copiada y reproducida por cualquiera siempre y cuando se haga en forma completa (incluyendo las noticias de copyright y la información de los autores), sin modifica- ciones y gratis. Si no está de acuerdo con estos términos, podemos hablar de publicar sus artículos en nuestro sitio web (no en un boletín) bajo sus propios términos de licencia. APROVECHE ESTA OPORTUNIDAD PARA DESTACARSE ENTRE SUS COLEGAS Y AGREGAR UN ARTICULO PUBLICADO A SU CURRICULUM VITAE. EXTENDEMOS CERTIFICADOS. A propósito, en esta edición me complace presentar el primer artículo contribuido, el que también ha sido publicado en nuestro sitio web: * "Post-it". Ventanas ajustables sin borde ni título http://www.latiumsoftware.com/es/articles/00002.php Cambiando de tema, hay dos nuevos trucos Delphi en nuestro sitio web: * ¿Cómo cerrar otra aplicación? http://www.latiumsoftware.com/es/delphi/00034.php * ¿Cómo iniciar una aplicación como un icono en la bandeja del sistema? (Con código fuente completo) http://www.latiumsoftware.com/es/delphi/00035.php Saludos, Ernesto De Spirito eds2004 @ latiumsoftware.com ________________________________________________________________________ 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. MYSQL ¿QUE ES MYSQL? ============== MySQL es un servidor multi-hilos de bases de datos de código abierto, confiable, rápido, compacto, poderoso y multiplataforma. En mi opinión es uno de los mejores productos de la Comunidad del Código Abierto y su principal debilidad es que no soporta subconsultas (aunque hay trabajo en progreso para agregar esta necesaria capacidad). Puede encontrar más información y descargarlo del sitio oficial: http://www.mysql.com LA LICENCIA DE MYSQL ==================== Antes que nada, me gustaría agradecer a Antti Halonen <antti@mysql.com> por responder muy amablemente un largo email acerca de las cuestiones de licencia. MySQL se licencia bajo los términos de la Licencia Pública General GNU. Es gratis para uso interno y para los ISPs. Por ejemplo es gratis si lo usa para desarrollo de software o para las compañías que lo usan como servidor de base de datos, y también es gratis si desarrolla un apli- cación a medida para un cliente (todavía se considera uso interno para ambas partes). El problema surge si planea distribuir aplicaciones comerciales que necesiten MySQL para correr (uso incrustado). Bajo los términos de la GPL, éstas aplicaciones también deben distribuirse como GPL. Si no desea distribuirlas como GPL, puede comprar una licencia comercial por cada aplicación y máquina servidora corriendo MySQL. Por ejemplo, si vende 100 licencias de una aplicación "A" y 50 licencias de una aplicación "B" al mismo cliente, para ser usadas en una red donde sus aplicaciones usarán 10 servidores MySQL corriendo en la misma máquina, entonces deberá comprar sólo dos licencias para poder vender sus aplicaciones a este cliente porque sólo hay una máquina servidora (sin importar cuántos servidores MySQL corran en ella) y dos aplicaciones (sin importar cuántas licencias venda de cada una), así que sólo hay dos combinaciones "aplicación-servidor" (y consiguientemente se necesitan dos licencias): Aplicación "A" - Servidor 1 Aplicación "B" - Servidor 1 La licencia tiene un valor unitario de $200 (USD), y puede comprar muchas licencias antes de usarlas para sacar partido de importantes descuentos. Puede distribuir una aplicación no GPL que use MySQL sin pagar la licencia si el uso de MySQL no es requerido (es decir, si la aplicación puede hacer las mismas cosas usando alternativamente otro sistema, servidor o controlador de bases de datos o lo que sea). DELPHI Y MYSQL ============== Básicamente, hay dos formas de acceder a una base de datos MySQL desde una aplicación Delphi: usando un controlador ODBC o la biblioteca libmysql.dll. ODBC ---- En el sitio web de MySQL puede encontrar el controlador ODBC de MySQL para Windows: http://www.mysql.com/downloads/api-myodbc.html Después de instalar este controlador puede usar los componentes de acceso a datos de la BDE o ADO para acceder a las tablas y realizar consultas a una base de datos MySQL. Para usar ODBC, primero debe crear un DSN usando la applet ODBC Data Sources del Panel de Control. Por ejemplo, yo he creado un DSN llamado MySQL_Test y lo configuré para loguearse como 'root' en el servidor MySQL ubicado en 'localhost' (se puede conectar a un servidor remoto usando su dirección IP o su nombre de dominio) y abrir la base de datos 'mysql'. En un programa Delphi usted tendría que usar un componente TDatabase si no quiere que la BDE muestre el diálogo de login estándar. Deberá establecer mínimamente las siguientes propiedades: AliasName = 'MySQL_Test' DatabaseName = 'MySQL_Test' LoginPrompt = False En un componente TTable o TQuery tiene que establecer la propiedad DatabaseName a 'MySQL_Test' y eso es todo. La ventaja de usar ODBC es que puede usar Datasets estándar de Borland, y la desventaja es que tiene que pasar a través de dos capas para llegar al servidor MySQL (la BDE y el controlador ODBC), aunque hay que decir que aún con ODBC, MySQL es más rápido que otros servidores de base de datos. LIBMYSQL.DLL ------------ También puede acceder a un servidor MySQL usando la biblioteca libmysql.dll. Este archivo no viene con la instalación estándar de MySQL, pero puede bajarlo de: http://www.fichtner.net/delphi/mysql.delphi.phtml También deberá bajar el archivo mysql.pas que es una unidad Delphi que contiene las declaraciones de tipo para usar esta biblioteca. Necesitará incluir esta unidad en la cláusula Uses de cualquier unidad desde la que quiera llamar a las funciones contenidas en la biblioteca. El siguiente ejemplo abre una conexión a un servidor MySQL, abre una base de datos, realiza una consulta y guardar los resultados en una grilla (StringGrid), y finalmente cierra la conexión. uses ..., mysql; procedure TForm1.Button1Click(Sender: TObject); var mysqlcon: TMySQL; // Estructura de conexión MySQL presults: pmysql_res; // Puntero a la estructura de resultados prow: pmysql_row; // Puntero a la estructura de fila pfields: PMYSQL_FIELDS; // Puntero al arreglo de campos i, j: Integer; // Contadores begin // Conectarse al servidor mysql_connect(@mysqlcon, 'localhost', 'root', ''); if mysqlcon.net.last_errno <> 0 then begin ShowMessage (Trim(mysqlcon.net.last_error)); exit; end; // Abrir la base de datos "mysql" if mysql_select_db(@mysqlcon, 'mysql') <> 0 then begin mysql_close(@mysqlcon); // Desconectar ShowMessage('No se pudo abrir la base de datos "mysql"'); exit; end; presults:= nil; try // Enviar la consulta al servidor y obtener los resultados mysql_query(@mysqlcon, 'SELECT * FROM user'); presults := mysql_store_result(@mysqlcon); // Establecer el tamaño de la grilla StringGrid1.ColCount := presults^.field_count; StringGrid1.RowCount := presults^.row_count + 1; // Llenar la cabecera de la grilla con los nombres de los campos pfields := presults^.fields; for j := 0 to presults^.field_count -1 do StringGrid1.Cells[j, 0] := pfields^[j].name; // Llenar la grilla for i := 1 to presults^.row_count do begin prow := mysql_fetch_row(presults); for j := 0 to presults^.field_count -1 do StringGrid1.Cells[j, i]:= prow^[j]; end; finally mysql_free_result(presults); // Liberar la memoria mysql_close(@mysqlcon); // Desconectar end; end; Como puede ver, es bastante complicado, y esto constituye la principal (y yo diría única, pero muy importante) desventaja de usar la biblioteca libmysql.dll. Las ventajas son que uno tiene control total, que es más rápido que usando ODBC y que no se necesita la BDE. Sería lindo tener un descendiente de TDataset que encapsulara la API de libmysql.dll... WINZEOS ------- Esos componentes existen, permitiéndonos acceder a un servidor MySQL usando los controles estándar de datos sin usar BDE/ADO + ODBC. Puede encontrarlos aquí: http://www.zeos.dn.ua El paquete se distribuye bajo los términos de la Licencia Pública General GNU, pero tal como explicáramos puede usarlo libremente para "uso interno", incluyendo el desarrollo de aplicaciones a medida. ------------------------------------ El código fuente completo de este artículo está disponible en: http://www.latiumsoftware.com/descarga/p0010.zip ________________________________________________________________________ 3. "POST-IT". VENTANAS AJUSTABLES SIN BORDE NI TITULO Copyright (c) 2000 Alirio Gavidia <alirio@gavidia.org> Para ver más de mis artículos visite: Programación Orientada en Delphi http://www.gavidia.org/pod/ ¿POR QUE UN FORMULARIO SIN BORDE NI TITULO? =========================================== Cuatro hechos son fundamentales en el presente ensayo: El primero de ellos la existencia de programas que imitan los "Post-it" (aquellas paginitas adheribles que vienen en libretas e inundan las oficinas con colores vistosos). Segundo, el uso de cierta función indocumentada en Windows para arrastrar formularios. Tercero, el problema de cómo crear una aplicación dónde el formulario principal no es visible. Y cuarto, utilizar la barra de tareas de Windows. Los programas que imitan a los "Post-it" que tomo como referencias son fundamentalmente "TurboNote" en Windows y el del KDE de Linux. Ambos programas son fácilmente adquiribles y hacen más que el que aquí muestro. Sin embargo considero este un buen ejercicio docente. Se me ocurre otro programa que se presentan sin título: El reloj redondo (analógico) que viene con "Power Toys" de Windows. Será propuesta para un próximo artículo. ENTREMOS EN CALOR ================= Evolutivamente lo obvio es imitar la nota "post-it" de alguna manera. El primer pensamiento es un formulario con una barra de título sin los botones usuales (minimizar, maximizar, etc) y completamente con un color plano. Esta alternativa es posible y requiere una manejo de Windows algo especializado. En particular he preferido una alternativa más económica en cuanto a código (o al menos eso creo); ella es eliminar la barra de título y bordes del formulario (como se haría con un "splash-screen") y colocar un panel y un memo en un formulario, el primero alineado al tope y el segundo al área cliente. MANEJANDO UN FORMULARIO SIN BORDE NI BARRA DE TITULO ==================================================== El formulario con sólo panel y memo responderá sin inconveniente a las acciones de teclado, pero es obvio que no responderá al arrastre y cambios de tamaño con el ratón (sin borde por dónde agarrarlo). El arrastre se resuelve con una acción indocumentada, al menos así era algún tiempo atrás, a través del mensaje "SysCommand". La línea aquí mostrada, ejecutada desde un formulario, coloca a este en estado de arrastre. Perform(wm_SysCommand, $f012, 0) El asunto con los mensajes no se limita a esto. Los modos de "resize" también se definen de esta manera. A tal efecto definimos un conjunto de constantes con los valores adecuados empezando con el $f012. sc_DragMove = $f012; sc_Leftsize = $f001; sc_Rightsize = $f002; sc_Upsize = $f003; sc_UpLeftsize = $f004; sc_UpRightsize = $f005; sc_Dnsize = $f006; sc_DnLeftsize = $f007; sc_DnRightsize = $f008; Nota: Si usted se pregunta de donde salieron estos valores, bueno, que diré. El primero lo conocí por un Libro de Marco Cantú llamado "Delphi Developers' Handbook", los demás surgen de ensayo y error. Déjeme comentarle así mismo que $f040 produce un resultado desastroso. Además $f020 y $f030 minimizan y maximizan respectivamente, esto último no es necesario para nuestra aplicación. Aunque no estaría de más. No me consta si algo de esto funciona fuera de Windows 98. Adicionalmente en el evento "MouseDown" del panel y del memo, dónde enviamos los mensajes, es necesario llamar "ReleaseCapture" antes de enviar los mensajes señalados. No me extenderé mucho con el código. Es más sencillo analizarlo desde Delphi que desde una página HTLM o DOC. Pero nótese que hay que distinguir dónde se hizo clic en el panel para saber si se requiere un "resize" o sólo arrastrar el formulario. Algo similar sucede con el memo para el "resize" de los lados e inferior. procedure TfrmNota.Panel1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; if y<2 then begin if x<4 then Perform(wm_SysCommand, sc_UpLeftsize, 0) else if x>(Panel1.ClientWidth-4) then Perform(wm_SysCommand, sc_UpRightsize, 0) else Perform(wm_SysCommand, sc_UpSize, 0) end else Perform(wm_SysCommand, sc_DragMove, 0) end; Los fuentes son partes de este artículo y usted podrá ver detalladamente el funcionamiento de la nota. En el ejemplo anexo, además del manejo de eventos de ratón se hace algún manejo del registro de Windows para almacenar información relativa a la nota en sí (como su posición, tipo de letra y color). Presumo que si entiende lo de lo que se ha realizado hasta aquí no requiere explicación del uso del registro de Windows (en cualquier caso parece estar bien documentado en Delphi el uso del registro y hay ejemplos e información al respecto en Internet). UN FORMULARIO PRINCIPAL INVISIBLE ================================= Cuando hice este programa no había pensado en un problema realmente tonto. El usuario debe poder crear y destruir notas, pero que no destruir el formulario inicial porque eso termina la aplicación. Bien, entonces simplemente con no mostrar el formulario principal debe bastar. Si quiere usted entender este tonto problema cree una aplicación en la que además del formulario principal exista un formulario secundario; luego logre que la aplicación arranque sólo mostrando el formulario secundario. Mis intentos resultaron en fracaso. Ahora sé que eso se logra con Application.ShowMainForm := False; en el programa principal antes de crear los formularios, pero en aquel entonces no lo sabía y aproveché el problema para darle una solución original... NO ES UNA FALLA, ES UNA VENTAJA =============================== Dándole vuelta al asunto la solución fue convertir la pantalla principal en una pantalla de presentación que dura una cierta cantidad de tiempo y luego se oculta. En un "timer" se ejecuta este código: procedure TfrmMain.Timer1Timer(Sender: TObject); begin SaveNotes(Sender); if not oculto then begin oculto := True; ShowWindow(Handle, SW_HIDE); ShowWindow(Application.Handle, SW_HIDE); SetWindowLong( Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW); ShowWindow(Application.Handle, SW_SHOW); end end; Con ello queda oculta la ventana principal (la línea inmediata a la asignación de la variable "oculto", que por cierto por defecto es falsa) y la presencia de la aplicación en la barra de tareas. El resto del código es relativamente simple y contiene algunas rutinas para salvar y recuperar el contenido y configuración de las notas (lo primero a disco y lo segundo al registro). Creo que no amerita una discusión profunda por ello dejo al lector la interpretación de la rutina. El proyecto como tal contiene cinco formularios: 1. note, es la nota con el panel y el memo. 2. GenConfig, el formulario de configuración de la aplicación, actualmente sólo configura formatos y contador del reloj. 3. Config, configuración de la nota (color, alineación y fuentes) 4. Main, es el formulario principal, además de eso funciona como pantalla de presentación. 5. Acerca, Versión del programa. Como comentario aparte nótese que debido a la presencia de un "Timer" es posible obligar un "auto save" (autoguardar) para el texto en las notas. Esto se logra recorriendo todos los formularios del tipo nota y guardando su contenido desde el memo. La rutina llamada "SaveNotes" se ejecuta desde el "timer" (teniendo cuidado de no salvar lo que no ha cambiado). Cada nota tiene la variable pública "Changed", la cual es modificada al salvar y en el evento "OnChange" del memo. "POP-UP MENU" ============= La aplicación no cuenta con un menú principal porque no tiene un formulario principal. Toda las acciones distintas a la interacción con el campo memo y movimientos usando ratón se realizan por menúes tipo "Pop-up". Hay dos: uno en la nota y otro en el ícono de la barra de tarea (junto al reloj). Para éste utilizamos las RX. Así que al menos para esta versión será necesario que usted tenga las RX para poder compilar estos fuentes. Si no las conoce, entonces debe hacerlo, son gratuitas ("freeware") y muy buenas. RX Library Web Site: http://www.rxlib.com Authors: Fedor Kozhevnikov (fkozh@iname.com) Igor Pavluk (igorp@mail.com) Serge Korolev (korolev@usa.net) -------------------------- El código fuente que acompaña este artículo puede descargarse desde: http://www.latiumsoftware.com/download/h-notes.zip ________________________________________________________________________ 4. ENLACES * VCL Components - Colección con buscador de más de 4000 componentes freeware y shareware para Delphi y C++ Builder. http://vclcomponents.com/ * The Delphi Search Engine - El Motor de Búsqueda Delphi indexa componentes, documentos, consejos, trucos y cualquier recurso Delphi en la web. También hay un directorio de sitios Delphi disponible. http://www.delphiseek.com/ * delphi3000 - Una plataforma de conocimiento para desarrolladores en Delphi que incluye artículos, recortes de código, foro, componentes, consejos, trucos, DLL, TreeView, XML, ADO, Internet, Web, GUI... http://www.delphi3000.com/ ________________________________________________________________________ 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/p0010.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) 2000 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!






