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
eds2008 @ 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-2006 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.dlldll.com/libmysql.dll_download.html
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.marms.com/zeos/eng/zeos_zdo_main.html
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/es/file.php?id=p10
________________________________________________________________________
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/es/file.php?id=p10
________________________________________________________________________
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) 2000 por Ernesto De Spirito. Todos los derechos reservados
________________________________________________________________________
|