Boletín Pascal #50 - 25-JUL-2004
Índice
1. Unas palabras del editor
2. Obteniendo el tipo de unidad
3. Inno Setup Review
4. Cómo correr una sola instancia de una aplicación (Parte 1)
5. Foros / listas de correo
6. Delphi en la Red
- Componentes, librerías y aplicaciones
· Shareware
· Freeware
· Actualizaciones de productos Borland
- Artículos, trucos y consejos
- Tutoriales y capacitación
- Noticias
- Otros enlaces
________________________________________________________________________
Tecno Soft Solutions. Reseller Autorizado de Symbol Technologies, líder
mundial en captura de códigos de barras. >>> http://www.tecno-symbol.com
________________________________________________________________________
1. Unas palabras del editor
Ha pasado casi un año desde el último número del boletín, y durante este
tiempo ambos hemos estado muy ocupados con el trabajo, la familia y
otros proyectos. Muchas veces hablamos de volver a publicar el boletín,
pero nunca lo logramos. Después de algunos mensajes de apoyo de los
suscriptores del boletín (y algo de trabajo de Dave), finalmente
estamos de regreso. El el plan es publicar una edición cada dos meses
desde ahora, provisto que consigamos las contribuciones, premios y
tiempo. :) Hablando de tiempo, la verdad que el mío es en extremo
limitado, así que aprovecho este espacio para pedir voluntarios para
traducir el boletín del inglés al español.
Como siempre, nos gustaría agradecer a los autores que contribuyeron
artículos para esta edición, Lennie De Villiers y Peter Johnson, y nos
complace entregarles los premios para esta edición a:
* Lennie De Villiers - 'Obteniendo el tipo de unidad'
Storage Library v3.29 - por DeepSoftware.Ru ($39)
Storage Library es una elegante solución para el manejo de la
configuración de las aplicaciones. Soporta trabajar con archivos INI,
Registro de Windows, archivos XML, objetos TStream. Provee encripción,
soporte Unicode, trabajar con propiedades públicas sin programar,
almacenar la posición de los formularios, y mucho más...
http://www.deepsoftware.ru/rsllib/index.html
* Peter Johnson - 'Cómo correr una sola instancia de una aplicación
(Parte 1)'
SMExport v4.50 - por Scalabium Software ($50)
Conjunto de componentes para fácil exportación a diferentes formatos
de archivo: CSV/Text, MS Excel, MS Access, MS Word, HTML,
XML, SPSS, PDF, RTF, SQL etc. Disponible para Delphi 3-7 y BCB 3-6.
http://www.scalabium.com (mshkolnik@...)
Esperamos contar con dos premios para los autores que contribuyan
material en inglés para el próximo número, pero no sabemos cuáles serán,
así que envíennos sus artículos y tal vez se ganen una bonita sorpresa.
Bien, eso es todo. Esperamos que disfruten esta edición.
Saludos,
Dave Murray y Ernesto De Spirito
boletin-pascal-owner@...
__________________
Colaboraron en esta edición: Lennie De Villiers, Peter Johnson
________________________________________________________________________
Help & Manual 3.50 por EC Software · Shareware ($ 279) - Una herramienta
visual de autoría de ayuda para generar archivos WinHelp (.HLP), Adobe
PDF, páginas HTML y los nuevos archivos HTML HELP (.CHM) introducidos
en Windows 98, así como otros formatos de archivo y documentación
impresa, todo desde una misma fuente. Una herramienta imprescindible
para cualquier desarrollador de software. http://www.helpandmanual.com/
________________________________________________________________________
2. Obteniendo el tipo de unidad
Por Lennie De Villiers <Lennie at openmindconnections dot com>
http://www.openmindconnections.com/
A veces puede querer determinar si una unidad de disco es removible,
fija, CD-ROM, disco RAM, o unidad de red. Para lograr este puede usar
la función API de Windows GetDriveType.
GETDRIVETYPE
============
Declaración:
GetDriveType(lpRootPathName : PChar);
Parámetros
lpRootPathName
Puntero a una cadena terminada en nulo que especifica el directorio raíz
del disco del que se retornará información. Se requiere la barra
invertida al final. Si pRootPathName es NULL, la función usa la raíz del
directorio actual.
Valor de retorno
El valor de retorno especifica el tipo de unidad. Puede ser uno de los
siguientes valores:
· DRIVE_REMOVABLE
El disco puede removerse de la unidad.
· DRIVE_FIXED
El disco no puede removerse de la unidad.
· DRIVE_REMOTE
La unidad es una unidad remota (de red).
· DRIVE_CDROM
La unidad es una unidad de CD-ROM.
· DRIVE_RAMDISK
La unidad es un disco RAM.
La función devolverá DRIVE_UNKNOWN si no se puede determinar el tipo de
unidad, o DRIVE_NO_ROOT_DIR si el camino de la raíz no es válido.
Por ejemplo:
-----------
case GetDriveType(PChar(DriveEdit.Text + ':\')) of
DRIVE_REMOVABLE:
ReportLabel.Caption := 'El disco puede removerse de la unidad';
DRIVE_FIXED:
ReportLabel.Caption := 'El disco no puede removerse de la unidad.';
DRIVE_REMOTE:
ReportLabel.Caption := 'La unidad es una unidad remota (de red).';
DRIVE_CDROM:
ReportLabel.Caption := 'La unidad es una unidad de CD-ROM.';
DRIVE_RAMDISK:
ReportLabel.Caption := 'La unidad es un disco RAM.';
else
MessageDlg('Error: No puede determinarse el tipo de unidad el ' +
'camino de la raíz no es válido.', mtError, [mbOk], 0);
end;
Este ejemplo obtiene una letra de unidad de un cuadro de texto llamado
DriveEdit y lo pasa a la función GetDriveType. El código automática le
agregará los dos puntos y la barra invertida al final ( :\ ). La
sentencia CASE reportará el valor devuelto por la función GetDriveType
a una etiqueta llamada ReportLabel.
Si GetDriveType no devuelve uno de esos valores listados, o sea, si
devuelve DRIVE_UNKNOWN o DRIVE_NO_ROOT_DIR, se mostrará un mensaje de
error.
Para una referencia más completa de la función API GetDriveType WinAPI
vaya a http://msdn.microsoft.com/library/psdk/winbase/filesio_2m3p.htm
________________________________________________________________________
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
________________________________________________________________________
3. Inno Setup Review
Por Dave Murray <irongut at vodafone dot net>
http://www.paranoia.clara.net/
Inno Setup por Jordan Russell es un instalador gratuito para programas
Windows. Primero introducido en 1997, Inno Setup está a la altura y
hasta sobrepasa muchos instaladores comerciales en características y
estabilidad. Lo he estado usando por un par de años, así que deseaba ver
qué nuevas características había en la última versión (4.2.7
2004-06-27).
Inno Setup es un instalador basado en scripts para toda las versiones
de Windows de 32 bits. Es muy flexible y configurable, y produce
instaladores de único y compacto EXE. Hay extensiones de terceros
disponibles y soporta scripts en Pascal para mayor configuración. Sus
características clave incluyen:
* Soporte para todas las versiones de Windows de 32 bits
* Instalador de EXE único o múltiples discos
* Interfaz con asistentes estándar, incluyendo el último estilo
Windows 2000/XP
* Tipos de instalación configurables, ej. Completa, Mínima, Avanzada
* Capacidades completas de desinstalación
* Compresión Zip, bzip2 y LZMA (7-Zip)
* Comparación de información de versión, reemplazo de archivos en
uso y conteo de archivos compartidos
* Registro de librerías DLL, OCX y de tipos
* Instalación de fuentes
* Creación de atajos en cualquier lugar; incluyendo el Escritorio y
el Inicio Rápido
* Creación de entradas en el Registro y archivos .INI
* Creación de instaladores multilenguaje
* Instalación y desinstalación silenciosa
* Ejecución de otros programas o scripts Pascal durante la
instalación
* Soporte de automatización COM
* Extensiones de terceros
* Código fuente completo disponibles (Delphi 2-5)
* Gratuito, incluso al distribuir aplicaciones comerciales
Trabajando con Inno Setup
-------------------------
Al ejecutar Inno Setup aparece un diálogo ofreciendo crear un script en
blanco, crear un nuevo script empleando un asistente o abrir un script
existente. Hay varios ejemplos que ayudan a explicar cómo crear scripts
o realizar ciertas tareas durante la instalación. Le recomiendo usar el
asistente para crear el esquema inicial de su script.
Los asistentes preguntarán por toda la información habitual como el
nombre de la aplicación y versión, nombre de la empresa y sitio web,
directorio de la instalación, nombres de archivos y accesos directos.
También tiene algunas características más avanzadas como crear un
acceso directo de Internet para su sitio web y mostrar archivos antes
y/o después de la instalación.
Los scripts de Inno Setup se parecen mucho a ficheros INI. Cada sección
de un script controla un aspecto diferente de la instalación. Por
ejemplo la sección [Setup] contiene configuraciones globales usadas por
el instalador y el desinstalador, y la sección [Tasks] define tareas
definibles por el usuario a realizarse durante la instalación. Los
elementos dentro de las secciones pueden tomar uno o más parámetros.
Por ejemplo el elemento AppPublisherURL en la sección [Setup] toma la
dirección de su sitio web. La mayoría de los elementos pueden tener
constantes incrustadas en ellos que son traducidas a sus respectivos
valores literales dependiendo de las elecciones del usuario y la
configuración del sistema: por ejemplo {sys} se refiere al directorio
de Sistema de Windows. Hay numerosas secciones y elementos, pero no se
preocupe, la documentación es excelente.
Después que haya terminado de escribir su script, el siguiente paso es
compilarlo en un instalador completo, listo para correr. De modo prede-
terminado, se crea en un subdirectorio llamado Output dentro del
directorio conteniendo el script. También hay un compilador en línea
que puede usarse como parte de un proceso automatizado de construcción.
El paso final es probar su instalador. El instalador y desinstalador
acepta parámetros en línea de órdenes que pueden ser útiles para los
administradores de sistema y para otros programas que los llamen. Los
parámetros incluyen /SILENT, /LANG y /DIR. Ambos programas devuelven un
código de retorno que puede ser usado para determinar si la instalación
o desinstalación falló y por qué.
Nuevo en la Versión 4.0
-----------------------
La Versión 4 agregó soporte de scripts en tiempo de ejecución a Inno
Setup. El motor de scripting es RemObjects Pascal Script por Carlo Kok.
Este moderno lenguaje de scripting símil Delphi permite una sofisticada
configuración de su instalador. Las posibilidades incluyen: agregar
páginas de asistente propias en tiempo de ejecución, remoción de tipos,
componentes y/o tareas bajo ciertas condiciones definibles, instalación
de elementos basada en condiciones definibles. Se incluye un depurador
integrado de tiempo de ejecución.
También se ha agregado soporte multilenguaje y se pueden especificar
versiones regionalizadas de todos los varios archivos de información. La
sección [Languages] define los lenguajes disponibles al instalador y se
puede mostrar un diálogo Select Language (elegir lenguaje). La sección
[LangOptions] opcional se puede usar para definir configuraciones espe-
cíficas al lenguaje, como fuentes.
Se agregaron muchas otras características y mejoras a la versión 4.
Algunas de las más útiles incluyen archivos no seguros (DLLs), instala-
ción / desinstalación silenciosa, mejoras al IDE, y la división en
múltiples discos ahora soporta CDs y DVDs.
Últimas Características
-----------------------
(v4.1.3 2004-01-28)
Desde que originalmente escribí este artículo aparecieron varias
versiones menores con muchas mejoras. El instalador pasó por un cambio
de cara con palabrerío simplificado, escalamiento de fuentes e imágenes
mejorado, y soporte multimonitor mejorado. Ahora contiene información
de versión configurable y usted pues especificar su icono.
El soporte de automatización COM provee la capacidad de controlar
otras aplicaciones aplicaciones y llamar DLLs ActiveX durante la
instalación. Esto le permite configurar el IIS o el SQL Server, leer y
escribir XML, leer y escribir documentos Office y mucho más.
(v4.1.6 2004-02-19)
¡La gente detrás de Inno Setup debe haber estado trabajando día y noche
porque en las últimas pocas semanas lanzaron tres actualizaciones! El
cambio más significativo es la adición de compresión LZMA. LZMA es el
algoritmo usado por el archivador 7-Zip de Igor Pavlov. Típicamente
comprime al menos un 20% mejor que el método bzip existente.
El IDE del compilador se ha mejora con un nuevo comando Run | Terminate
(Ejecutar | Terminar) y una nueva opción Build | Low Priority During
Compile (Construir | Baja Prioridad Durante la Compilación). El IDE
también muestra un icono animado y una barra de progreso durante la
compilación y el código de retorno devuelto después de una ejecución de
prueba.
(4.2.7 2004-06-27)
Los últimos cuatro meses desde la última vez que actualicé este
artículo han visto muchas mejoras a Inno Setup. El soporte multilenguaje
ha sido enormemente mejorado. El asistente de script ahora usa
constantes de mensaje definibles de modo que ahora no tiene que traducir
frases en inglés en los scripts generados. Una nueva sección
[CustomMessages] le permite fácilmente regionalizar sus propias entradas
de descripciones y mensajes. De modo predeterminado, los lenguajes cuya
página de códigos no concuerda con la del sistema del usuario no
aparecerán en el diálogo Select Language. Además, se han agregado
traducciones oficiales en catalán, checo, holandés, francés, alemán,
noruego, polaco, portugués, ruso y esloveno.
Inno Setup ahora incluye encripción 128-bit ARCFOUR opcional. La
contraseña de desencripción puede ser provista desde la línea de órdenes
para instalaciones silenciosas. Asimismo, con la señal noencryption los
archivos individuales pueden tener la encripción apagada si fuera
necesario.
Ahora se soportan las mejoras introducidas a la applet Agregar/Quitar
Programas del Panel de Control de Windows 2000. Puede mostrar un botón
"Modificar" y un diálogo "Soporte" con comentarios, información de
contacto y un enlace a su archivo léame.
La compresión predeterminado ahora es LZMA en vez de Zip, y una nueva
pasada de optimización coprime los archivos ejecutables aún más. El
nuevo parámetro /LOG de la línea de órdenes crea un archivo de registro
en el directorio TEMP del usuario detallando el proceso de instalación
para depuración. El motor de scripting en tiempo de ejecución se basa
ahora en RemObjects Pascal Script SVN code revision 916. Han habido un
montón de otros cambios incluyendo mejoras a las páginas del asistente
y a los diálogos, y corrección de errores.
Extensiones de Terceros
-----------------------
Una de las fortalezas de Inno Setup's es la saludable comunidad de
extensiones de terceros. Éstas incluyen herramientas como iwz2iss que
convierte proyectos InstallShield en scripts Inno Setup e InnoScript
que hace lo mismo para proyectos VB.
La extensión más útil es probablemente ISTool por Bjørnar Henden, un
front-end GUI para crear y editar scripts Inno Setup. Le proporciona
fácil acceso a todas las secciones del script con diálogos a medida para
editar los elementos. Estos diálogos contienen campos para todos los
posibles parámetros con casillas de verificación para cualquier posible
señal. ISTool tiene soporte arrastrar y soltar completo, usted puede
arrastrar archivos desde el Explorador y soltarlos en un directorio en
la sección [Files]. También puede importar proyectos VB e InstallShield
y simplifica el proceso de crear versiones regionalizadas.
Recientemente, varias extensiones de terceros, incluyendo ISTool, han
sido reempaquetados como el Inno Setup QuickStart Pack. No son oficiales
o requeridas, pero a Inno Setup más fácil de usar, especialmente para
nuevos usuarios.
Soporte
-------
El soporte se provee primariamente a través de los grupos de noticias en
news.jrsoftware.org. Hay tres grupos de noticias disponibles: para
cuestiones generales de Inno Setup, para scripts Pascal de tiempo de
ejecución y para extensiones de terceros. Estos grupos de noticias están
disponibles sólo a través de su servidor de noticias o de su interfaz
web.
Hay también disponible una lista de corre para notificarlo de nuevos
lanzamientos importantes. Los anuncios de parches pequeños generalmente
no se envían a la lista de correo sino que se anuncian en el grupo de
noticias general.
Conclusión
----------
Inno Setup es una gran herramienta para empaquetar sus aplicaciones.
Los scripts son fáciles de escribir y la documentación está bien
escrita y es exhaustiva. El asistente inicial es verdaderamente muy
útil y lo uso para todos mis scripts. Inno Setup es configurable y
extensible, y puede usarse como parte de un proceso de construcción
automatizado. Al combinarlo con algunas extensiones de terceros, es
un producto difícil de superar, ¡y además el precio es muy bueno!
Referencias
-----------
· Inno Setup
http://www.jrsoftware.org/isinfo.php
· Grupos de noticias Inno Setup
news://news.jrsoftware.org/jrsoftware.innosetup
news://news.jrsoftware.org/jrsoftware.innosetup.code
news://news.jrsoftware.org/jrsoftware.innosetup.thirdparty
http://news.jrsoftware.org/read/
· ISTool
http://www.istool.org/
· iwz2iss
http://strony.wp.pl/wp/mikequ/eng/iwz2iss.htm
· InnoScript
http://www.randem.com/innoscript/innoscript.htm
· RemObjects Pascal Script
http://www.remobjects.com/
________________________________________________________________________
¡Vota por el Boletín Pascal (Pascal Newsletter) en The Borland Top 100!
http://top100borland.com/in.php?who=20
________________________________________________________________________
4. Cómo correr una sola instancia de una aplicación
Parte 1: Un acercamiento inicial
Por Peter Johnson, Copyright (c) 2003
<delphidabbler at tiscali dot co dot uk>
http://www.delphidabbler.com/
Resumen
-------
Este artículo discute cómo asegurar que sólo una única instancia de una
aplicación pueda ejecutarse. Una aplicación esto chequeando si ya hay
una instancia corriendo, y terminando en caso afirmativo. También
veremos cómo una instancia duplicada puede pasarle sus parámetros de
línea de órdenes a la instancia en ejecución antes de terminar.
Introducción
------------
El método de evitar múltiples instancias de una aplicación usado aquí
está basado en la detección de la existencia de una aplicación con una
clase de ventana principal determinada, y el paso de la línea de órdenes
se hace mediante mensajes WM_COPYDATA (tal como lo usa mi programa
Version Information Spy en http://www.delphidabbler.com/vis). Hay otros
métodos para lograr los mismos fines -- siendo uno muy común el uso de
Mutexes y el paso de datos a través de un archivo mapeado en memoria.
Este método no se tratará aquí, pero hay otros artículos en la red que
le muestran cómo hacerlo.
Un bosquejo de la metodología es:
buscar la ventana de nivel superior de la clase correcta
si tal ventana existe
activar la ventana
pasar los datos de línea de órdenes a la ventana vía WM_COPYDATA
terminar esta instancia de la aplicación
de lo contrario
iniciar esta aplicación normalmente
procesar los parámetros de la línea de órdenes
fin
Ahora examinaremos el proceso en detalle.
Determinando si su programa está corriendo
------------------------------------------
Usamos la API de Windows FindWindow para buscar una ventana de nivel más
alto de la clase requerida. Esta rutina puede buscar por el título de la
ventana (no confiable porque pueden cambiar mientras un programa está
corriendo), la clase de la ventana (mejor) o ambos. Optamos por chequear
el nombre de clase de la ventana, sin importar el título. No obstante
hay un problema con este enfoque -- en Delphi el nombre de clase del
formulario principal se usa de manera predeterminada como el nombre de
clase de la ventana de nivel superior. Es decir, si la clase del
formulario es TForm1, el nombre de clase del formulario también es
TForm1. Dado que es posible tener más de una aplicación Delphi corriendo
que use este nombre de clase de ventana, necesitamos darle a la ventana
principal de nuestro programa un nombre de clase que sea (muy) poco
probable que sea usado por otra aplicación. Hacemos esto reescribiendo
(overriding) el método CreateParams del formulario principal como sigue:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
StrCopy(Params.WinClassName, cWindowClassName);
end;
Aquí, cWindowClassName es una constante establecida a algún nombre de
clase apropiado. Para asegurarnos su unicidad podemos usar un GUID como
D9CE4126-B845-42B2-ABAE-3678FF6EC836. Sin embargo, encuentro que un
nombre basado en el nombre de la empresa, el nombre de la aplicación y
posiblemente el número principal de versión es suficientemente poco
probable que sea usado por otras aplicaciones. Un ejemplo sería
DelphiDabbler.MyApp.2.
Ahora que tenemos un nombre de clase de ventana apropiado podemos
encontrar el handle de la ventana principal de cualquier instancia
existente de nuestra aplicación usando la siguiente función:
function DuplicateAppInstWdw: HWND;
begin
Result := FindWindow(cWindowClassName, nil);
end;
La función devolverá el handle de cualquier ventana de alto nivel con el
nombre de clase dado por la constante cWindowClassName. Devolverá 0 si
no hay tal ventana, así que si la función devuelve 0, no tenemos
instancia existente y podemos correr nuestra aplicación, pero si la
función devuelve un valor distinto de cero, una instancia existente está
corriendo y debemos terminar la instancia actual.
Debemos ser muy cuidadosos respecto de dónde realizamos esta compro-
bación -- si corremos esta comprobación después de haber creado la
ventana principal de nuestra aplicación, la función siempre retornará
un manejador de ventana, y éste puede ser el manejador de nuestra propia
ventana! Por consiguiente, es importante realizar esta comprobación
antes de que la aplicación cree su formulario principal. Podemos
hacerlo realizando la comprobación en el el archivo de proyecto (.dpr),
antes de que se cree el formulario principal. El archivo de proyecto
puede ser modificado como sigue:
function CanStart: Boolean;
var
Wdw: HWND;
begin
Wdw := DuplicateAppInstWdw;
if Wdw = 0 then
// no hay instancia en ejecución:
// podemos iniciar nuestra aplicación
Result := True
else
// Instancia en ejecución: Intentar pasarle la línea de órdenes
// y terminar la instancia si tiene éxito
// (rutina explicada después)
Result := not SwitchToPrevInst(Wdw);
end;
begin
if CanStart then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
Nótese que la aplicación sólo se inicia si la función CanStart devuelve
verdadero, de lo contrario termina instantáneamente. CanStart devuelve
verdadero si no hay otra instancia de la aplicación (es decir, si no se
encuentra una ventana de nivel superior con el nombre de clase de
ventana). Si se encuentra una instancia previa, intentamos cambiar a
ella usando la función SwitchToPrevInst. La implementación de esta
función se explica después en este artículo. Por ahora será suficiente
con saber que la función activa la ventana principal de la instancia
previa de la aplicación e intenta pasarle cualesquiera parámetros de
línea de órdenes. La función devuelve verdadero si tiene éxito, y falso
si falla. Notar que vamos adelante e iniciamos esta instancia de la
aplicación si el intento de pasar la línea de órdenes a la instancia
previa no tiene éxito. Esta es una forma a prueba de fallos de asegurar
que la línea de órdenes se procesa.
Esto cierra la parte de cómo iniciar una sola instancia de la apli-
cación. Ahora necesitamos descubrir cómo pasar cualquier dato de línea
de órdenes a la instancia previa.
Pasando la línea de órdenes a la instancia previa
-------------------------------------------------
Cuando el programa detecta que otra instancia está ejecutándose, debe
pasar su línea de órdenes al programa en ejecución. Hacemos esto en la
rutina SendParamsToPrevInstance. Esta rutina envía los parámetros a la
ventana principal de la instancia existente de la aplicación mediante
el uso del mensaje WM_COPYDATA.
Pasando datos a otra aplicación con WM_COPYDATA
-----------------------------------------------
Este mensaje es provisto por Windows para el propósito de pasar datos a
través de límites de procesos -- es decir, para enviar datos a otras
aplicaciones. Dato que el mensaje envía datos entre espacios de direc-
ciones, debemos ser cuidadosos de adherir a las reglas que gobiernan
esta cuestión. Las reglas son:
* No podemos pasar punteros, sólo los datos reales
* La aplicación que envía debe asignar y liberar la memoria requerida
por los datos
* La aplicación receptora no debe liberar los datos
* La aplicación receptora debe copiar los datos a almacenamiento local
si debe accederlos después que el manejador de mensajes regresa
* Debemos usar SendMessage y no PostMessage para enviar el mensaje
El mensaje WM_COPYDATA usa una estructura del tipo TCopyDataStruct para
almacenar y describir los datos a enviar. Esta estructura tiene tres
campos:
* dwData: DWORD -- almacena un valor de 32 bits definido por el usuario
* lpData: Pointer -- apunta a un bloque de datos definido por el usuario
(usado si se enviará un valor de más de 32 bits)
* cbData: DWORD -- tamaño del bloque de datos definido por el usuario
Función SendParamsToPrevInstance
--------------------------------
Como se mencionó arriba, la función SendParamsToPrevInstance se usa
cuando tenemos que pasar parámetros de línea de órdenes a la instancia
previa de la aplicación. La función devuelve verdadero si la aplicación
receptora procesa el mensaje WM_COPYDATA apropiadamente, y falso si el
mensaje no es manejado o si la aplicación receptora reporta un error.
He aquí la implementación:
function SendParamsToPrevInstance(WndH: HWND): Boolean;
var
CopyData: TCopyDataStruct; // estructura de datos WM_COPYDATA
I: Integer; // variable de control de ciclo
DataSize: Integer; // tamaño requerido por los parámetros
Data: PChar; // puntero a la memoria de los parámetros
PData: PChar; // puntero al siguiente parámetro
begin
// Establece el paquete de datos a enviarse a la otra instancia.
// Contiene COPIA de los parámetros: no pueden enviarse punteros con
// WM_COPYDATA. Guardaremos cada cadena parámetro en un buffer,
// separados por #0 y terminados por un segundo #0.
// Ejemplo: Primero#0Segundo#0Tercero#0#0
// Primero calcular el tamaño de los parámetros
DataSize := 0;
for I := 1 to ParamCount do
Inc(DataSize, Length(ParamStr(I)) + 1);
Inc(DataSize); // for final #0
// Ahora asignar memoria y copiar los parámetros en ella
Data := StrAlloc(DataSize);
try
PData := Data;
for I := 1 to ParamCount do
begin
// Copiar la cadena de parámetro, terminada en nulo
StrPCopy(PData, ParamStr(I));
Inc(PData, Length(ParamStr(I)) + 1);
end;
// Cierre final con #0
PData^ := #0;
// Establecer la estructura de copia de datos:
// Marca de agua opcional: permite una comprobación simple de la
// la validez del paquete en la aplicación receptora
CopyData.lpData := Data; // datos a ser copiados
CopyData.cbData := DataSize; // tamaño de los datos
CopyData.dwData := cCopyDataWaterMark; // marca de agua en
// campo de datos
// Enviar el mensaje de copia de datos
// Establecer el resultado de acuerdo al resultado devuelto por
// la otra instancia
Result := SendMessage(WndH, WM_COPYDATA, 0, LPARAM(@CopyData)) = 1;
finally
// Ahora liberar la memoria usada por el paquete de datos
StrDispose(Data);
end;
end;
La función primero junta los parámetros de línea de órdenes en una sola
estructura de datos. Esta estructura de datos es una secuencia de
parámetros de programa separados por #0, y terminada por otro caracter
#0 (esta sintaxis es comúnmente usada en Windows para almacenar una
lista de valores de cadena). Por ejemplo, los tres parámetros 'Uno',
'Dos' y 'Tres' se almacenaría como 'Uno'#0'Dos'#0'Tres'#0#0.
Habiendo asignado la memoria requerida y almacenados los datos en ella,
establecemos TCopyDataStruct.lpData para que la apunte, y registramos
el tamaño de la estructura de datos en TCopyDataStruct.cbData.
Usamos el campo TCopyDataStruct.dwData para almacenar un valor de marca
de agua de 32 bits para validar el mensaje WM_COPYDATA. El uso de esta
marca de agua provee una comprobación de los datos y le indica a la
aplicación receptora que el mensaje y sus datos han sido enviados desde
nuestra propia aplicación. La marca de agua puede ser cualquier valor
de 32 bits -- nosotros usamos el valor almacenado en la constante
cCopyDataWaterMark.
Después de usa SendMessage para enviar el mensaje a la ventana principal
de al aplicación existente. La dirección de la estructura TCopyData se
pasa en el campo LParam del mensaje. Establecemos el resultado de la
función a verdadero si el mensaje devuelve 1, y falso en caso contrario.
Finalmente, liberamos la memoria usada por para almacenar los parámetros
de la línea de órdenes.
La aplicación receptora necesitará saber cómo extraer los datos del
mensaje WM_COPYDATA, y discutiremos esto a continuación.
Manejando WM_COPYDATA
---------------------
Asó como saber cómo enviar datos a otras instancias de sí misma, una
aplicación también necesita saber cómo manejar el mensaje WM_COPYDATA
para recibir tales datos. Hacemos esto en el formulario principal del
programa escribiendo un manejador estándar de mensajes de Delphi, que
se declara en la declaración de la clase del formulario como sigue:
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
Esta es la implementación:
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
PData: PChar; // camina por los datos
Param: string; // un parámetro
begin
// comprueba si la marca de agua es válida
if Msg.CopyDataStruct.dwData <> cCopyDataWaterMark then
raise Exception.Create('Datos inválidos en WM_COPYDATA');
// extrae las cadenas de los datos
PData := Msg.CopyDataStruct.lpData;
while PData^ <> #0 do
begin
Param := StrPas(PData);
// procesa el parámetro:
// (escribir el método para realizar el procesamiento requerido)
ProcessParam(Param);
Inc(PData, Length(Param) + 1);
end;
// establecer el valor de retorno indicando que manejamos el mensaje
Msg.Result := 1;
end;
El manejador de mensaje procesa los datos referenciados por la
estructura de datos TCopyDataStruct. El mensaje WM_COPYDATA tiene un
puntero al registro en su campo LParam. En vez de acceder al valor
LParam directamente y convertir el tipo, usamos el mensaje provisto
por Delphi TWMCopyData para "crackear" el registro de mensaje -- su
es campo CopyDataStruct provee fácil acceso a los datos de la
estructura.
Primero comprobamos la marca de agua almacenada en
TCopyDataStruct.dwData, generando una excepción si no es válida.
Luego obtenemos un puntero a la lista de parámetros delimitados por
#0, y caminamos por el buffer, haciendo una copia de cada parámetro
antes de pasarlo al método ProcessParam method (un lugar reservado
para cualquier procesamiento que tenga que aplicarse a cada parámetro
en turno). El bucle se detiene cuando se encuentra el caracter
terminador #0. Antes de volver, establecemos el resultado del
mensaje en 1 para indicar que el mensaje ha sido manejado.
Activando la instancia previa
-----------------------------
Cuando la instancia previa de una aplicación se activa por una nueva
instancia, su ventana puede visualizarse normalmente, maximizada,
minimizada o invisible. Puede estar parcial o totalmente oculta por
otras ventanas. Si está minimizada, invisible o total o parcialmente
oculta, no habrá retroalimentación visual para el usuario de que la
instancia previa ha sido usada en lugar de la aplicación que inició.
Hay varias diferencies decisiones de diseño que podrían tomarse respecto
de cómo manejar estas situaciones. Optaremos por asegurar que la ventana
se hace prominente cuando es activada. Si la ventana se muestra normal-
mente o está maximizada, simplemente la ponemos al frente el orden Z.
Si, por el contrario, la ventana está minimizada, la restauramos y si
está oculta la mostramos.
Cuando una aplicación se inicia y encuentra que hay una instancia
previa, a la ventana principal de la instancia previa se le envía un
mensaje propio diciéndole que se "despierte". Este mensaje se define
como
const
UM_ENSURERESTORED = WM_USER + 1;
Enviamos este mensaje en la rutina SwitchToPrevInst mencionada arriba.
La implementación de la rutina se mostrará después en este artículo.
La aplicación receptora deberá manejar y actuar sobre este mensaje.
Hacemos esto en el formulario principal de la aplicación, otra vez
usando un manejador de mensaje de Delphi, declarado en la clase del
formulario como:
procedure UMEnsureRestored(var Msg: TMessage);
message UM_ENSURERESTORED;
La implementación del manejador de mensaje es:
procedure TForm1.UMEnsureRestored(var Msg: TMessage);
begin
if IsIconic(Application.Handle) then
Application.Restore;
if not Visible then
Visible := True;
Application.BringToFront;
end;
En este manejador de mensaje verificamos si la aplicación está mini-
mizada (comprobado el estado de la ventana especial Application) y la
restauramos si es así. Luego mostramos el formulario principal si
actualmente está oculto. Finalmente traemos el formulario principal
al frente del orden Z.
Toques finales
--------------
Sólo nos resta implementar finalmente la función SwitchToPrevInst a la
que nos refiriéramos antes en este artículo. La función tiene dos
propósitos principales:
1. Asegurar que cualquier parámetro de línea de órdenes se envíe a la
instancia previa
2. Activar la instancia previa, asegurando que su ventana principal se
muestra
La función toma el handle de la ventana principal de la instancia previa
de la aplicación como parámetro (el que no debe ser cero). Recuerde que
debemos devolver verdadero si los parámetros son exitosamente pasados a
la instancia previa, y falso en caso de error. La implementación de
SwitchToPrevInst es como sigue:
function SwitchToPrevInst(Wnd: HWND): Boolean;
begin
Assert(Wnd <> 0);
if ParamCount > 0 then
Result := SendParamsToPrevInstance(Wnd)
else
Result := True;
if Result then
SendMessage(Wnd, UM_ENSURERESTORED, 0, 0);
end;
Si tenemos parámetros de línea de órdenes, intentamos enviarlos a la
instancia previa usando la rutina SendParamsToPrevInstance, devolviendo
verdadero o falso según se tuvo éxito o no. Si no hay parámetros,
nuestra función no tiene datos que enviar a la instancia previa y
devuelve verdadero. Sólo si la función tiene éxito enviamos un mensaje
UM_ENSURERESTORED a la instancia previa para hacer que muestre su
ventana principal en el frente.
Juntando todas las piezas
-------------------------
El código fuente adjunto contiene el esqueleto de un proyecto Delphi que
implementa todo el código tratado en este artículo. El proyecto contiene
tres módulos que pueden usarse como moldes para una aplicación real:
* Un archivo de proyecto incorporando las modificaciones requeridas al
código generado por Delphi.
* Una unidad conteniendo las varias funciones usadas para manejar y
activar la instancia única de la aplicación.
* Una unidad de formulario esqueleto conteniendo los varios manejadores
de mensaje y otro código necesario del formulario. El formulario en
sí no contienen componentes.
Una solución reutilizable
-------------------------
La solución al problema de arriba funciona y provee un molde para usar
en cualquier aplicación. Sin embargo el código fuente debe ser adaptado
para cada aplicación. Podemos encontrar una solución reutilizable --
algo oriendado a objetos. Bueno, ¡en parte! En la próxima edición, la
segunda parte de este artículo le mostrará una solución orientada a
objetos que, aunque requiere alguna modificación al formulario principal
y al archivo de proyecto, al menos mueve la mayor parte del código a una
clase extensible.
__________________
Peter Johnson es un programador hobbyista que vive en West Wales (Reino
Unido) y que "chapotea" en Delphi. Mantiene el sitio web DelphiDabbler
(http://www.delphidabbler.com/) donde publica sus artículos y sus
aplicaciones y componentes Delphi gratuitos. Una versión completa de
este artículo se encuentra disponible en:
http://www.delphidabbler.com/articles.php?article=13
________________________________________________________________________
Delphi BUGS?
Catch & Log every BUG showing Unit, Class, Method, Line #.
Now with support for IntraWeb applications and Anti-Freeze feature.
http://www.eurekalog.com/bannerclick.php?id=15
________________________________________________________________________
5. Foros / listas de correo
Recordamos a los suscriptores las direcciones de nuestros foros. Para
unirse a algún foro, lo más recomendable es hacerlo desde la web para
así tener acceso a todas las áreas del foro y la configuración de las
opciones de suscripción, pero también es posible suscribirse por email.
Para suscribirse desde la web es necesario poseer un ID de Yahoo! (si
no tienes el tuyo, puedes conseguirlo gratis registrándote como usuario
de Yahoo!).
* Delphi-intermedio. Programación en Delphi (nivel intermedio). Si ya
sabes mucho de Delphi, pero todavía te falta un largo trecho para ser
un gurú (o no tanto), este foro es para ti.
http://espanol.groups.yahoo.com/group/delphi-intermedio
Suscripción:
http://espanol.groups.yahoo.com/group/delphi-intermedio/join
delphi-intermedio-subscribe@...
* Delphi-avanzado. Programación en Delphi. Sólo para gurús.
http://espanol.groups.yahoo.com/group/delphi-avanzado
Suscripción:
http://espanol.groups.yahoo.com/group/delphi-avanzado/join
delphi-avanzado-subscribe@yahoogroups.com
* GrupoKylix. Programación en Kylix.
http://espanol.groups.yahoo.com/group/GrupoKylix
Suscripción:
http://espanol.groups.yahoo.com/group/GrupoKylix/join
GrupoKylix-subscribe@yahoogroups.com
* FreePascal-es. Programación en Free Pascal (freepascal.org).
http://espanol.groups.yahoo.com/group/freepascal-es
Suscripción:
http://espanol.groups.yahoo.com/group/freepascal-es/join
freepascal-es-subscribe@yahoogroups.com
* Desarrolladores-Software. Un lugar para tratar todos aquellos temas
relacionados con el desarrollo de software y su comercialización, y
para compartir experiencias en el ámbito laboral, profesional o
comercial con otros.
http://es.groups.yahoo.com/group/desarrolladores-software
Suscripción:
http://es.groups.yahoo.com/group/desarrolladores-software/join
desarrolladores-software-subscribe@yahoogroups.com
* Componentes. Un foro para buscar/recomendar componentes de software
(componentes VCL y CLX, objetos ActiveX, librerías DLL, etc.), así
como utilidades, tutoriales, información, etc.
http://espanol.groups.yahoo.com/group/componentes
Suscripción:
http://espanol.groups.yahoo.com/group/componentes/join
componentes-subscribe@yahoogroups.com
________________________________________________________________________
¡Vota por el Boletín Pascal (Pascal Newsletter) en The Delphi Top 200!
http://top200.jazarsoft.com/delphi/rank.php3?id=latium
________________________________________________________________________
6. Delphi en la Red
Por Dave Murray <irongut at vodafone dot net>
Componentes, librerías y aplicaciones
=====================================
Shareware / Comercial
---------------------
* SMExport Suite v4.50 - by Scalabium Software ($50)
SMExport suite is a component set for easy data exporting into
different file formats: CSV/Text, MS Excel, MS Access, MS Word, HTML,
XML, SPSS, PDF, RTF, SQL etc. Available for Delphi 3-7 and BCB 3-6.
http://www.scalabium.com (mshkolnik@...)
* Storage Library v3.29 - by Deepsoftware.Ru ($39)
Storage library - elegant way for application settings management.
Supports working with ini files, registry, xml files, TStream objects.
Provides encryption, unicode support, working with published
properties without programming, saving form position and much more...
http://www.deepsoftware.ru/rsllib/index.html
* COM Genie v1.00 - by WS&V (£10)
A Component Object Model navigator designed to enable you to navigate
the interfaces of a COM object in a hierarchal manner. Functions that
return functional interface pointers can be expanded to reveal the
contents of the relevant interface, and its functional interfaces.
The free demo is restricted to the first 80 interfaces.
http://web.ukonline.co.uk/alison.burgess2/
Freeware
--------
* Borland Research Project: BabelCode
BabelCode is a C# to Delphi for .NET code conversion utility. It is
implemented as a web service and an ASP.NET client.
http://dotnet.borland.com/babelcode/
* CrossKylix v2.65.11 - by Simon Kissel (with source)
Integrates the Kylix compiler into the Delphi IDE allowing compilation
of native Linux apps. Console projects, packages and visual CLX apps
are fully supported with compile warnings, hints and error messages.
http://crosskylix.untergrund.net/
* Inno Setup v4.2.7 - by JR Software (with source)
A free installer for Windows that rivals commercial installers in
features and stability. See review in this issue for details.
http://www.jrsoftware.org/isinfo.php
* TurboPower XML Partner v2.60 - by TurboPower (with source)
Add the power of XML to Borland Delphi, C++ Builder and Kylix projects
through native, easy to use VCL and CLX components. These components
simplify the process of creating, modifying, and parsing XML data.
http://sourceforge.net/projects/tpxmlpartner
* Form Explorer v1.0
Herramienta que permite editar y tener una vista previa de los
archivos de formularios del entorno Borland Delphi en formato texto,
de una manera simple y ágil. El propósito es que el usuario pueda
editar y tener una vista previa de sus formularios sin necesidad de
ingresar al entorno Borland Delphi.
http://delphiuser.iespana.es/delphiuser/projects.html
* Constructor para Borland Delphi v1.0
Herramienta para generar código personalizado para crear cuadros de
mensajes, selectores de carpetas y cuadros "acerca de", de una manera
simple y ágil. El propósito es que el usuario pueda generar un código
personalizado de acuerdo a sus necesidades de manera visual.
http://delphiuser.iespana.es/delphiuser/projects.html
Actualizaciones de productos Borland
------------------------------------
* Delphi 7.1 Update Has Been Fixed And Is Live
Updated to fix the persistent field issue in the original release. The
latest version enforces data integrity without raising an exception.
http://community.borland.com/article/0,1410,32400,00.html
* Borland Delphi 8 Janeva Integration Plugin
Allows Delphi applications to communicate with J2EE based applications
using Borland Janeva. CORBA integration will come in the near future.
http://codecentral.borland.com/codecentral/ccWeb.exe/listing?id=21772
* Delphi 8 HelpKit
Assists developers to integrate their help files with Borland's.
http://cc.borland.com/codecentral/ccweb.exe/listing?id=21767
* Updated Delphi 8 License
New Delphi 8 license provides additional permissions for developers of
VCL for .NET components. Supercedes all previous Delphi 8 licenses.
http://community.borland.com/article/0,1410,32293,00.html
* ilink32 Version 5.66 Update for C++ Customers
Resolves an access violation when linking together large numbers of
object files. For C++BuilderX (including Mobile) and C++Builder 6.
http://community.borland.com/article/0,1410,32448,00.html
Artículos, trucos y consejos
============================
* Why You Can't Pass a List to an InterBase SQL Param - by Craig Stuntz
When writing a WHERE clause in your InterBase SQL, it would sometimes
be convenient to write WHERE FOO IN (:SomeParam) and pass a list of
values to SomeParam. You can't do that; here's why.
http://community.borland.com/article/0,1410,32076,00.html
* Agile Management June 2004: The S-Curve Explained - David J. Anderson
Provides some more insight as to what causes the S-curve effect and
how to minimize it by paying attention to a few areas at the beginning
and end of a project.
http://community.borland.com/article/0,1410,32411,00.html
* .NET tip: Getting the User's Home, Temp or My Documents Directory
- by Charlie Calvert
How to retrieve commonly used directories when using .NET.
http://community.borland.com/article/0,1410,32384,00.html
* A Hint About .NET WinForms Controls ToolTips - by John Kaster
This article explains how .NET Extender Providers can be used to
include ToolTips for .NET WinForms controls.
http://community.borland.com/article/0,1410,32345,00.html
* Beyond Proprietary Databases: Helen Borrie on the Future of Firebird
"It's very satisfying to learn of yet another big corporation or
enterprise software product that has switched to Firebird, and, as the
word gets out, it happens more often."
http://www.linuxinsider.com/story/34399.html
* IntraWeb And ActiveForms - by Bob Swart
How to use IntraWeb and ActiveForms together to create some innovative
solutions for your intranet / extranet needs.
http://www.thedelphimagazine.com/samples/1749/1749.htm
* Manage Complexity With State Machines - by Rob Bracken
Explains state machines and how to use them to model a wide range of
real-world problems, making code easier to debug, maintain and modify.
http://www.thedelphimagazine.com/samples/1738/1738.htm
* Handling SQL Mail - by Jason Sweby
Use the email facilities built into MS SQL Server to send email from
your applications in response to database triggers, and more.
http://www.thedelphimagazine.com/samples/1729/1729.htm
* Fun With Threads - by Steven Soroka
Some practical tips to make threading in your apps more efficient.
http://www.thedelphimagazine.com/samples/1712/1712.htm
* NTFS Compression And Sparse Files - by Marcel van Brakel
Explains what the NTFS file compression and sparse files features have
to offer and how to make use of them in your own software.
http://www.thedelphimagazine.com/samples/1696/1696.htm
* XML Topic Maps - by Craig Murphy
Discusses how XML topic maps provide a mechanism to intelligently
classify information, and how to implement topic maps in your apps.
http://www.thedelphimagazine.com/samples/1686/1686.htm
* An Introduction To Endo-Testing Using Mock Objects - by Sascha Frick
Problems arise when applying unit testing and test driven development
principles to complex projects. Describes how to overcome the problems
with endo-testing and mock objects.
http://www.thedelphimagazine.com/samples/1677/1677.htm
* All About ECO - by Malcolm Groves
A series of blog posts on ECO.
http://blogs.borland.com/malcolmgroves/category/83.aspx
Tutoriales y capacitación
=========================
* BDNtv: Introduction to Together for Visual Studio .NET v2.0
Part 1 of a 4 part tutorial, this episode gives you a quick intro to
Together for Visual Studio .NET version 2.0. (Flash)
http://community.borland.com/article/0,1410,32395,00.html
* BDNtv: LiveSource with Together for Visual Studio .NET v2.0
Part 2 of a 4 part tutorial, this episode gives you an intro on using
LiveSource with Together for Visual Studio .NET version 2.0. (Flash)
http://community.borland.com/article/0,1410,32396,00.html
* BDNtv: Audits with Together for Visual Studio .NET v2.0
Part 3 of a 4 part tutorial, this episode gives you a quick intro on
using audits with Together for Visual Studio .NET version 2.0. (Flash)
http://community.borland.com/article/0,1410,32397,00.html
* BDNtv: Patterns with Together for Visual Studio .NET v2.0
Part 4 of a 4 part tutorial, this episode gives you an intro on using
patterns with Together for Visual Studio .NET version 2.0. (Flash)
http://community.borland.com/article/0,1410,32399,00.html
* Building CORBA Applications with Delphi 8 and Janeva (1) - P. Glowacki
Shows the necessary steps to build simple CORBA server and client
applications with Borland Janeva 6.0 and Borland Delphi 8 for .NET.
http://community.borland.com/article/0,1410,32074,00.html
* Introduction to Delphi for .NET and the New IDE - by Xavier Pacheco
Provides an overview of Delphi for .NET, with a focus on how to use
Delphi to develop software for business solutions. Sample chapter from
the book 'Delphi for .NET Developer's Guide'.
http://www.informit.com/articles/article.asp?p=174323
* Gekko Software
Tutorial on building automation server objects using Delphi. Assumes a
basic knowledge of Delphi and object orientation. The more experienced
developer will find useful hints and background information.
http://www.gekko-software.nl/Delphi/
Noticias
========
* Borland Reports Strong Sales
Despite a tough quarter in the industry, Borland was able to nail
several large deals including a multimillion dollar deal with British
Telecommunications that helped push Q3 revenues up to $76.5 million.
www.santacruzsentinel.com/archive/2004/July/23/biz/stories/02biz.htm
* Borland Solution Selected by BT to Transform Systems Engineering
Borland's ALM solution will underpin BT's Systems Engineering
Programme, which was set up to develop a single design and delivery
methodology for all future IT projects across BT Group.
http://www.tmcnet.com/usubmit/2004/Jul/1059138.htm
* Boo Hoo Hoo for Victims of XP SP2
Quite a few applications will break under the new security-focused
service pack. Problems in the debugger in Borland's Delphi in RC 1
were fixed quickly, although another tester reports that multiple
applications under SP2 cannot access the Borland Database Engine.
http://www.eweek.com/article2/0,1759,1624962,00.asp
* Borland Developer News - .NET Edition, July 2004
The July 2004 installment of the Borland .NET Development Newsletter.
Contains information, news, and links for Delphi and C#Builder .NET.
http://community.borland.com/article/0,1410,32443,00.html
* Many Ways to Skin .NET and Java Integration
.NET and J2EE used to be web services islands but now vendors have
begun shipping tools that bridge the two architectures. Borland's
Janeva has a twist on the translation theme.
http://sdtimes.com/news/106/story7.htm
* Message from Business Objects: Potential Security Vulnerability
Notice of a security vulnerability in Crystal Reports web API. Effects
Crystal Reports for both C#Builder and JBuilder and requires a patch.
http://community.borland.com/article/0,1410,32402,00.html
* Interbase / Firebird Database Name Buffer Overflow Vulnerability
A vulnerability in Firebird and Interbase can be exploited to cause a
DoS and potentially compromise a system due to a boundary error in the
handling of database names that can cause a buffer overflow by passing
a long database name when connecting.
http://secunia.com/advisories/11756/
* Borland Developer News - .NET Edition, June 2004
The June 2004 installment of the Borland .NET Development Newsletter.
Contains information, news, and links for Delphi and C#Builder .NET.
http://community.borland.com/article/0,1410,32390,00.html
* Borland Teams Up With eBay and PayPal
eBay and Borland have announced a new relationship that will provide
Borland developers with access to tools and resources for creating web
services applications for the eBay and PayPal platforms.
http://community.borland.com/article/0,1410,32373,00.html
* Borland and Microsoft Arm Systems Integrators with Application
Development and Deployment Best Practices
Borland presented alongside Microsoft and leading systems integrators
a road map for delivering the Visual Studio 2005 Team System. This
will provide a set of best practices, architecture guidance and
integrated tools designed to enable IT organizations to successfully
build and deploy custom solutions for the Windows Server System.
http://home.businesswire.com/portal/site/google/index.jsp?
ndmViewId=news_view&newsId=20040524005402&newsLang=en
* Borland Brings RM to the Masses
Requirements Management is a key discipline underlying software
quality and success but business requirements are too often lost in
translation before they ever become software capabilities. The best RM
solutions address both human and technology adoption barriers.
http://www.adtmag.com/article.asp?id=9223
* eWeek Application & Web Services Development Award
WINNER: Microsoft Visual Studio .Net 2003.
RUNNER-UP: Borland Enterprise Studio For Java 7.
http://www.eweek.com/article2/0,1759,1560688,00.asp
Otros enlaces
=============
* Delphi User
En este nuevo sitio web encontrarás dos descargas interesantes: Form
Explorer y Constructor para Borland Delphi. Se detallan más arriba en
la sección Freeware.
http://delphiuser.iespana.es/delphiuser/
* Borland Blog Central
Blogs by Borland staff.
http://blogs.borland.com/
* Delphi 8 Documentation Available as PDF
Registered users of Delphi 8 can now download this PDF that provides
conceptual, procedural, and Language Guide topics. English-only.
http://www.borland.com/products/downloads/download_delphi_net.html
* IDC Recommends Borland Janeva for Interoperability
Developers who want to use a mixture of .NET, J2EE and CORBA should
consider using Borland Janeva. Find out why in this PDF from IDC.
http://www.borland.com/features/pdf/idc_interopToday_may04.pdf
* D7 Ent/D8 Arch Component Migration List
Are you planning to move from Delphi 7 to Delphi 8? Check this chart
to see how easy it will be for you.
http://community.borland.com/article/0,1410,31984,00.html
* Mozilla-Delphi Project
The Mozilla-Delphi project provides resources for working with Mozilla
technologies in the Borland Delphi and Kylix programming environments.
http://delphi.mozdev.org/
* Delphi Dabbler
Delphi Pascal source code library, components, programming articles,
tutorials and free programs.
http://www.delphidabbler.com/
* Borland Delphi 8 (review)
Good compatibility makes this impressive package ideal for Delphi
users moving to .Net.
http://www.vnunet.com/Products/Software/1154731
________________________________________________________________________
Irongut's Delphi Pages
Dedicada a la programación con Borland Delphi y Kylix. Tenemos artículos
sobre programación, noticias Borland y Delphi, código fuente y componen-
tes para usar en sus aplicaciones y más. http://www.paranoia.clara.net/
________________________________________________________________________
¡Tú puedes ayudarnos!
Por favor danos una mano y ayúdanos a llegar a los 20.000 suscriptores
en los próximos meses. Una forma en que puedes ayudarnos es enviando
este enlace a tus amigos:
http://www.latiumsoftware.com/es/pascal/index.php
boletin-pascal-subscribe@...
Otra forma es votándonos en alguno de estos rankings para darle más
visibilidad a nuestro sitio web y aumentar así el número de suscrip-
ciones al boletín:
http://news.optimax.com/delphi/links/links.exe/click?id=70C517ECAE6E
http://www.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
http://top200.jazarsoft.com/delphi/rank.php3?id=latium
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/p0050.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@...
Para cancelar / removerse: boletin-pascal-unsubscribe@...
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
Irongut's Delphi Pages http://www.paranoia.clara.net/
Copyright 2004 by Ernesto De Spirito + Dave Murray. All rights reserved.
________________________________________________________________________