Boletín Pascal #43 - 03-FEB-2003
Índice
1. Unas palabras del editor
2. MS Exchange API vía CDO (Collaboration Data Objects)
Librería de base para CDO - Hablando con el servidor MS-Exchange
3. Aplicaciones distribuidas, la forma fácil (II)
Conceptos básicos de MsgConnect. Un simple sistema de chat.
4. Modificando los diálogos estándar de Windows
Modificando controles de los diálogos Abrir/Guardar de Windows
5. Huevo de Pascua de Delphi
Conozca mejor su Delphi
6. Foros / listas de correo
7. Delphi en la Red
- Componentes, librerías y aplicaciones
. Shareware
. Freeware
- Artículos, trucos y consejos
- Tutoriales
- 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
Me gustaría agradecer a Mike Heydon, Eugene Mayevski, Igor Siticov y
a Bogdan Grigorescu por contribuir artículos para esta edición, y me
complace entregarles a Igor y a Mike las licencias de premio para esta
edición:
* Igor Siticov ("Modificando los diálogos estándar de Windows")
· TSDBGridFooter v2.0 por Jovan Sedlan, Shareware ($74.50)
Este componente es una poderosa herramienta que provee cálculos auto-
máticos para su DBGrid y muestra información en un pie configurable
debajo de la grilla. Ha sido diseñado para trabajar con TSDBGrid
(también incluido), aunque puede usarse con cualquier descendiente de
TCustomDBGrid.
http://www.softpile.com/Development/Libraries/Review_24756_index.html
* Mike Heydon ("MS Exchange API vía CDO (Collaboration Data Objects)")
· SDL Component Suite 7.0 - por Software Development Lohninger ($99)
La SDL Component Suite provee un amplio rango de componentes para la
ciencia y la ingeniería, por ejemplo matemáticas, estadísticas,
química, diagramas, visualización de datos, transformadas de Fourier
(FFT), ploteos 3D, mapas geográficos, ajuste de curvas, etc.
Disponible para Delphi 3-7 y BCB 4-6.
http://www.lohninger.com/sdlindex.html
Para la próxima edición, tenemos disponibles los siguientes premios para
dos de los autores que colaboren artículos en inglés:
* Greatis Form Designer v3.4 - por Greatis Software, Shareware ($49.95)
Es un diseñador de formularios en tiempo de ejecución que le permite
mover y cambiar el tamaño de cualquier control de su formulario. No
necesita preparar su formulario para usar Form Designer. Simplemente
suelte el componente TFormDesigner en cualquier formulario, establezca
la propiedad Active en True y ¡disfrute! Para Delphi 4-7 y BCB 3-6.
http://www.greatis.com/formdes.htm
* llPDFLib v1.1 - por llionsoft, Shareware ($70, $280 con fuentes)
llPDFLib en una biblioteca en puro Object Pascal para crear documentos
PDF. No usa ninguna DLL ni software externo de terceras partes para
generar ficheros PDF. La librería consiste del componente TPDFDocument
con propiedades y métodos como los del TPrinter de Delphi, pero
diseñado para generar un fichero PDF.
http://www.llion.net/
En otro orden de cosas, se ha abierto un nuevo lugar donde los usuarios
de Delphi y Kylix pueden compartir componentes, tutoriales y ejemplos
con otros programadores. Los navegantes pueden no sólo subir y bajar
archivos, sino también calificar las descargas y añadir comentarios:
* Descargas Delphi y Kylix - del Club de Programadores
http://clubdeprogramadores.com/descargas/tema.php?Id=15
Espero que disfruten esta edición.
Saludos,
Ernesto De Spirito
eds2008 @ latiumsoftware.com
________________________________________________________________________
Object Inspector 1.2 (por Greatis Software) es un juego de componentes
que incluye un componente especial para acceder a las propiedades y
eventos de cualquier componente, un inspector común que se puede usar
para inspeccionar todo en su aplicación, y un inspector de componentes
listo para usar que imita al Inspector de Objetos del IDE. Admite la
configuración de fuentes y colores. http://www.greatis.com/objinsp.htm
________________________________________________________________________
2. MS Exchange API vía CDO (Collaboration Data Objects)
Librería de base para CDO - Hablando con el servidor MS-Exchange
Copyright (c) 2002 Mike Heydon
Este es un vasto tema y está fuera del alcance de este artículo el
tratarlo en profundidad. Esta librería provee las bases para alguien que
quiera desarrollar usando CDO. Hay muchas referencias en la Red, pero la
mejor fuente es el archivo CDO.HLP que viene en el CD de Exchange o que
está en (http://www.cdolive.com/start.htm). El sitio cdolive.com es un
excelente sitio de referencia que discute todos los aspectos incluyendo
instalación y versiones, y también ofrece descargas (CDO.HLP se puede
descargar desde allí).
Mi clase básica provee la siguiente funcionalidad:
* Funciones y métodos de utilidad
function CdoNothing(Obj : OleVariant) : boolean;
function CdoDefaultProfile : string;
function VarNothing : IDispatch;
procedure CdoDisposeList(WorkList : TList);
procedure CdoDisposeObjects(WorkStrings : TStrings);
procedure CdoDisposeNodes(WorkData : TTreeNodes);
* Constructores Create que permiten el logon del perfil predeterminado,
el logon de un perfil específico, y un logon de usuario impersonado
con perfil (esto se requiere para un logon exitoso en aplicaciones
de servicios de Windows).
constructor Create; overload;
constructor Create(const Profile : string); overload;
constructor Create(const Profile : string;
const UserName : string;
const Domain : string;
const Password : string); overload;
* Métodos para cargar stringlists, treeviews, etc. e iteración de
objetos.
function LoadAddressList(StringList : TStrings) : boolean;
function LoadObjectList(const FolderOle : OleVariant;
List : TList) : boolean;
function LoadEMailTree(TV : TTreeView;
Expand1stLevel : boolean = false;
SubjectMask : string = '') : boolean;
function LoadContactList(const FolderOle : OleVariant;
Items : TStrings) : boolean; overload;
function LoadContactList(const FolderName : string;
Items : TStrings) : boolean; overload;
procedure ShowContactDetails(Contact : OleVariant);
Los métodos de arriba cargan varias listas en stringlists, lists o
treeviews. Las listas con los objetos construidos dentro de estas
estructuras de datos se liberan en cada sucesiva llamada a un método
Load*. Sin embargo, la liberación final es responsabilidad del
desarrollador. Puede hacer esto por sí mismo o usando las funciones
de utilidad CdoDispose*(). Vea la documentación del código fuente
para mayor entendimiento.
function First(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Last(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Next(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function Prior(const FolderOle : OleVariant;
out ItemOle : OleVariant) : boolean;
function AsString(const ItemOle : Olevariant;
const FieldIdConstant : DWORD) : string;
Los métodos de arriba proveen iteración a través de los objetos en
listas como Bandeja de entrada, Contactos, etc. La función AsString
devuelve un valor de campo, tal como dirección de email, nombre,
nombre de la empresa, etc. (hay una miríada de estos campos definidos
en la sección CONST, bajo "Field Tags").
* Propiedades
property CurrentUser : OleVariant read FCurrentUser;
property Connected : boolean read FConnected;
property LastErrorMess : string read FlastError;
property LastErrorCode : DWORD read FlastErrorCode;
property InBox : OleVariant read FOleInBox;
property OutBox : OleVariant read FOleOutBox;
property DeletedItems : Olevariant read FOleDeletedItems;
property SentItems : Olevariant read FOleSentItems;
property GlobalAddressList : Olevariant read FOleGlobalAddressList;
property Contacts : Olevariant read FOleContacts;
property Session : OleVariant read FOleSession;
property Version : string read GetFVersion;
property MyName : string read FMyName;
property MyEMailAddress : string read FMyEMailAddress;
El constructor Create establece los objetos predefinidos InBox (bandeja
de entrada), OutBox (bandeja de salida), DeletedItems (elementos elimi-
nados), SentItems (elementos enviados), GlobalAddressList (lista global
de direcciones), Session (sesiones) y Contacts (contactos). Las otras
propiedades se explican por sí mismas.
Tal como mencioné antes, la funcionalidad de CDO es vasta en la medida
que objetos como InBox (bandeja de entrada) tienen muchos métodos y
propiedades que incluyen actualizar, insertar, eliminar, etc. El archivo
CDO.HLP le ayudará a exponer estos miembros de clase. Mi clase es la
base de CDO para ayudarle a simplificar la construcción de aplicaciones
y probablemente se muestre mejor con fragmentos de código de ejemplo.
Créame, se puede escribir todo un libro sobre este tema, pero vale la
pena estudiar una alternativa más rápida que usar la API de MS Outlook.
uses Cdo_Lib;
var
Cdo: TcdoSession;
MailItem: OleVariant;
// Itera a través de los emails en la bandeja de entrada
begin
Cdo := TCdoSession.Create;
if Cdo.Active then
begin
Cdo.First(Cdo.InBox, MailItem);
while true do
begin
if not Cdo.Nothing(MailItem) then
begin
Subject := MailItem.Subject;
EMailAddress := Cdo.AsString(MailItem.Sender,
CdoPR_EMAIL_AT_ADDRESS);
EMailName := MailItem.Sender.Name;
BodyText := MailItem.Text;
// Borra el email
MailItem.Delete;
// Obtiene el siguiente email
end;
MailItem := Cdo.Next(Cdo.Inbox.MailItem);
end;
end;
Cdo.Free;
end;
// Ejemplo de cargar emails en un treeview y mostrarlos
// al hacer clic en el treeview
unit UBrowse;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, ExtCtrls, StdCtrls, Buttons,
ImgList, CDO_Lib;
type
TFBrowse = class(TForm)
Panel1: TPanel;
Panel3: TPanel;
Label1: TLabel;
Label2: TLabel;
lbFrom: TLabel;
lbDate: TLabel;
Memo1: TMemo;
Panel2: TPanel;
OKBtn: TBitBtn;
tvCalls: TTreeView;
ImageList1: TImageList;
StatusBar1: TStatusBar;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure tvCallsClick(Sender: TObject);
procedure btnPrintClick(Sender: TObject);
private
{ Private declarations }
Doc: OleVariant;
Cdo: TCdoMapiSession;
public
{ Public declarations }
end;
var
FBrowse: TFBrowse;
implementation
{$R *.DFM}
procedure TFBrowse.FormShow(Sender: TObject);
var
TN: TTreeNode;
begin
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
Cdo := TCdoMapiSession.Create;
Cdo.LoadEMailTree(tvCalls, true, '*Support ---*');
tvCalls.SortType := stText;
TN := tvCalls.Items[0];
TN.Expand(false);
tvCalls.SetFocus;
Screen.Cursor := crDefault;
end;
procedure TFBrowse.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
CdoDisposeNodes(TvCalls.Items);
Cdo.Free;
end;
procedure TFBrowse.tvCallsClick(Sender: TObject);
var
TN: TTreeNode;
begin
TN := tvCalls.Selected;
Memo1.Clear;
lbFrom.Caption := '';
lbDate.Caption := '';
if TN.Data <> nil then
begin
Doc := TOleVarPtr(TN.Data)^;
Memo1.Text := Doc.Text;
lbFrom.Caption := Doc.Sender.Name;
lbDate.Caption := FormatDateTime('dd/mm/yyyy hh:nn',
Doc.TimeSent);
end;
end;
end.
________________________________________________________________________
¿Cuándo fue la última vez que votó por el Boletín Pascal? Por favor
apoye esta iniciativa votándonos en "The Programming Top 100!"
Sólo hay que seguir el enlace y hacer clic en "here" ("aquí") donde dice
"Click here to vote!" ("¡Haga clic aquí para votar!"). Luego aparecerá
el ranking de los más votados. Su voto significa mucho para nosotros.
________________________________________________________________________
3. Aplicaciones distribuidas, la forma fácil (II)
Conceptos básicos de MsgConnect. Un simple sistema de chat.
Por Eugene Mayevski <Mayevski @ eldos.org>
En la primera parte de este artículo echamos un breve vistazo
a los métodos usados para intercambiar información ente dife-
rentes partes de la aplicación. Esta parte tratará con el
deasarrollo de una simple aplicación de chat para Intranets.
Encontrará un ejemplo (muy primitivo, pero completo) incluido con la
aplicación MsgConnect: http://www.msgconnect.com/download.html
Se llama SendNote (EnviarNota). Como su nombre lo indica, esta
aplicación le permite enviar notas de texto al destinatario. Puede
usar este ejemplo como material de referencia para este texto.
Comencemos por el principio. Decidimos usar MsgConnect pues se jacta de
ser de plataformas cruzadas y orientado a mensajes. Para entregar un
mensaje necesitamos tres cosas:
1. Un componente para enviar el mensaje
2. Un componente para entregar el mensaje
3. Un componente para recibir el mensaje
A diferencia de la mayoría de las formas de intercambio de datos, donde
las partes remitente y destinatario están en diferentes componentes,
MsgConnect usa el mismo componente para enviar y recibir mensajes.
Tal como se describe en la sección "Getting Started" de la documentación
de MsgConnect, necesitará sólo tres componentes: Messenger (mensajero),
Transport (transporte) y Queue (cola).
Messenger es el núcleo de MsgConnect -lleva a cabo todo el procesamiento
del mensaje. Al igual que el subsistema de mensajes de Windows®, que
está basado en hilos, la clase Messenger fue diseñada para ser el único
componente Messenger en un hilo. En otras palabras, sólo una instancia
de la clase Messenger puede ser creada por cada hilo de ejecución. Puede
crear más, pero esto (a) no tiene mucho sentido y (b) complica la lógica
de su aplicación.
Transport se usa para entregar el mensaje al destinatario. Actualmente
hay dos transportes, uno basado en Archivos Mapeados en Memoria (MMF) y
el otro en Sockets. Se está creando un transporte basado en HTTP y hay
planes para otros transportes más adelante. El transporte toma el
mensaje de Messenger, lo empaqueta (adicionalmente también aplica
encripción, compresión y control de integridad) y lo transfiere al
destinatario. La aplicación destinataria también tiene que tener una
instancia activa del transporte de la misma clase. Esto significa que si
envía un mensaje usando un transporte Socket, es necesario tener un
transporte Socket activo en el otro lado (el del destinatario).
Queue (cola) se usa para despachar los mensajes recibidos de una manera
cómoda. Puede tratarse como una casilla de correo en una oficina postal.
Cuando envía una carta a una casilla postal, envía un mensaje binario a
la cola. Probablemente Mailbox (casilla de correo) hubiera sido un mejor
nombre para el objeto Queue, pero no lo cambiaremos ahora. Cada
Messenger puede tener tantas colas como quiera. Las colas se identifican
con un nombre simbólico. Hay ciertas limitaciones para los nombres de
las colas, y se describen en la documentación.
¿Cómo hace el Messenger para saber donde enviar un mensaje? Cuando le
pide al Messenger que envíe algo, le pasa la dirección del destinatario.
Esta dirección contiene tres partes:
* Identificador del transporte. Este puede ser el nombre del
componente de transporte o de la clase, tal como se describe
en la documentación.
* Dirección del destinatario. Esta dirección es específica a cada
transporte.
* Nombre de la cola destino.
Y la última pregunta importante: ¿MsgConnect garantiza el envío y el
orden de los mensajes? Bueno, los sistemas distribuidos son diferentes
a los monoproceso respecto de cuando y como estos sistemas se inician
y detienen y que enlaces externos mantienen. En otras palabras, no es
posible garantizar que el sistema remoto recibirá y procesará el
mensaje. Esto está más allá del control de MsgConnect. Pero al menos el
envío se garantiza de la siguiente forma: si usa uno de los métodos
SendMessage*() (y no PostMessage()) para enviar un mensaje, obtendrá una
notificación acerca del éxito o fracaso del envío.
En cuanto al orden de la entrega, dada la naturaleza bidireccional de
MsgConnect (si la conexión existe puede usarse para enviar mensajes en
cada dirección, completamente independiente la una da la otra) existe
una posibilidad de que dos mensajes programados para entregarse a un
destinatario al mismo tiempo no sean entregados en el orden en que
fueron puestos en la cola. Esta situación puede ocurrir sólo cuando se
usa el mismo transporte tanto en el cliente como en el servidor (o sea,
inician y aceptan conexiones al mismo tiempo). Esto se llama modo de
transporte p2p para la clase SocketTransport. La solución es fácil, pero
trataremos esta cuestión en la próxima parte del artículo - por ahora no
la necesitamos.
Ahora que ya sabemos lo básico, comencemos a construir nuestra primera
aplicación "powered by MsgConnect": un chat simple.
Primero creamos el objeto Messenger, el objeto Queue y el objeto
SocketTransport. En diferentes entornos de desarrollo esto puede
hacerse por código o colocando un componente en el Diseñador.
Luego necesitamos enlazar los objetos Queue y SocketTransport al
Messenger estableciendo su propiedad Messenger a la instancia
agregada la clase Messenger. En lenguajes que no soportan propiedades,
esto se hace llamando al método SetMessenger().
Luego establecemos las propiedades del transporte (como se muestra en
los proyectos de ejemplo): MessengerPort (14583 en nuestro ejemplo),
TransportMode (p2p en nuestro caso porque nuestro chat envía y recibe
mensajes por el mismo transporte) y por supuesto la propiedad Active.
MessengerPort es donde el SocketTransport espera las conexiones
entrantes, y TransportMode define como se comporta el transporte cuando
sea activado.
La aplicación recibe los mensajes ya sea (a) usando el evento
OnUnhandledMessage de la clase Queue o (b) usando objetos
MessageHandler. El uso de objetos MessageHandler es una forma cómoda de
poner manejadores para diferentes mensajes en diferentes métodos. Para
nuestro simple sistema de chat con un mensaje usamos un evento
OnUnhandledMessage, así que necesitaremos crear un método manejador del
evento OnUnhandledMessage. Este método será llamado cuando llegue un
mensaje.
Tal como dijimos antes, MsgConnect emula el subsistema de mensajes de
Windows y el objeto Messenger se usa dentro de un hilo. Enviamos un
mensaje usando uno de los métodos PostMessage() o SendMessage*().
Recuerde llamar estos métodos desde el mismo hilo en que se creó el
objeto Messenger (la versión Java de MsgConnect no tiene esta restric-
ción).
Para enviar un mensaje al destinatario de nuestra simple aplicación de
chat, el usuario deberá ingresar el texto, el nombre del remitente (no
se usa para despachar los mensajes y es sólo informativo) y la dirección
del destinatario. Aquí viene la parte engañosa: en nuestra aplicación de
chat permitimos al usuario ingresar el nombre de la computadora o la
dirección de IP. Más tarde se usan sin traducción como la dirección del
destinatario del mensaje. En aplicaciones más complejas uno buscará los
nombres de usuarios en una lista o realizará otra traducción nombre->
dirección (usaremos esto al desarrollar una aplicación de mensajería
instantánea).
El siguiente paso es desarrollar un protocolo. Un protocolo es una
secuencia de llamadas o mensajes, usados para intercambiar información
entre las dos partes de la conexión. En nuestro simple chat usamos un
protocolo muy primitivo que consiste de un solo mensaje - todos los
datos que se envían se incluyen en este mensaje.
Así que tenemos algo para enviar. ¿Cómo enviamos enviamos el mensaje?
Recuerde que a diferencia de la mensajería de Windows, MsgConnect puede
transferir datos binarios con tamaño de hasta 2 Gb.
Para enviar un mensaje usamos una instancia de la clase Message (un
registro en C++ y en Delphi). Llenamos las propiedades enteras:
Param1, Param2 y MsgCode. MsgCode tiene el mismo significado que en la
mensajería de Windows: se usa para encontrar el manejador correcto en el
arreglo de MessageHandlers dentro de la cola (Queue) destino.
Luego necesitamos adjuntar los datos de nuestra aplicación. Enviamos el
nombre del remitente y el cuerpo del mensaje. Los empaquetamos en una
sola cadena y la empaquetamos a la clase Message.
Un poco más de poesía ahora. MsgConnect puede enviar datos binarios
dentro de un mensaje enviado con los métodos SendMessage*() en una o
ambas direcciones. En otras palabras, puede adjuntar algunos datos;
el destinatario los procesará y adjuntará los datos binarios result-
tantes a la respuesta. Recuerde que en la mayoría de los casos envía
datos en una sola dirección, así que de modo predeterminado la pro-
piedad BinDataType de la clase/registro Message es bdtConst. Si el
destinatario del mensaje debe reemplazar los datos asociados con sus
propios datos y devolverlos, necesitará establecer la propiedad
BinDataType a bdtVar. bdtVar le dice al Messenger que ponga los datos
junto con la respuesta al empaquetar.
OK, hemos creado un mensaje y estamos listos para enviarlo. ¿Cuál de los
métodos PostMessage()/SendMessage*() deberíamos usar? Eso depende de la
forma en que construyamos nuestra aplicación.
La forma más simple es -por supuesto- PostMessage(). Coloca un mensaje
en la cola y regresa inmediatamente. En este caso, el mensaje se envía
en una sola dirección y el mensaje resultado no se devuelve. Sin
embargo, hay una contra en este enfoque: su aplicación nunca sabe si el
mensaje fue realmente enviado. Esto es como un "pager": puede enviar un
mensaje, pero a menos que le pida a su contacto que lo llame inmediata-
mente no sabrá si el mensaje ha sido enviado. Y peor aún, si su contacto
no lo llama no significa que no recibió el mensaje.
Así que SendMessage*() parece una mejor opción. Hay tres funciones
SendMessage*() similares: SendMesage(), SendMessageCallback(), y
SendMessageTimeout(). Todas envían un mensaje e intentan esperar el
resultado, pero los detalles de su comportamiento difieren.
SendMessage() no regresa hasta que el mensaje resultado se recibe u
ocurre un error. Durante la llamada a este método los mensajes de
Windows (donde corresponda) no se procesan y su interfaz de usuario
no se actualizará (a menos que envíe mensajes desde otro hilo, pero
esto va más allá del presente artículo).
SendMessageTimeout() es similar a SendMessage(), con la diferencia que
SendMessageTimeout() regresa incondicionalmente ya sea cuando se recibe
la respuesta o cuando el plazo expira. En realidad, SendMessage se
implementa a través de SendMessageTimeout().
Mientras que SendMessageTimeout() es útil en ciertos casos, hay otros en
que necesitamos otra solución. Ésta es el método SendMessageCallback().
Envía un mensaje y regresa inmediatamente. La aplicación deberá llamar
luego al método DispatchMessages() del Messenger.
Como en Windows, la aplicación debe llamar al método DispatchMessages()
para despachar los mensajes recibidos y llamar los manejadores apro-
piados. DispatchMessages() se usa para recibir tanto mensajes originales
como respuestas. Cuando la aplicación recibe una respuesta, la siguiente
llamada a DispatchMessages llamará la función callback.
Este esquema requiere que la aplicación (a) llame DispatchMessages() de
vez en cuando y que (b) continúe sus operaciones después de que expiró
el tiempo de "timeout". Este requerimiento obliga al uso de un tempori-
zador (timer). El temporizador llama a la función que se usa para llamar
a DispatchMessages() y además lleva la cuenta del tiempo transcurrido
desde que el mensaje se envió.
En nuestro simple chat empleamos un temporizador, tal como mencionamos
arriba. La función callback recibe la notificación acerca del envío y
añade un registro al historial del cuadro memo.
Ahora tenemos descritas todas las partes de la aplicación. Nada ayudará
más que una muestra de código, así que puede ver en lo que hemos
terminado en el ejemplo SendNote.
En la siguiente parte de este artículo crearemos un el diseño completo
de una aplicación de mensajería instantánea con MsgConnect.
________________________________________________________________________
Greatis Runtime Fusion incluye Form Designer Pro ($ 49.95) y Object
Inspector Pro ($ 49.95), y cuesta sólo $89.90 - Ahórrese $10 y obtenga
demos adicionales. Permita que el usuario diseñe formularios en tiempo
de ejecución con Runtime Fusion. >>>> http://www.greatis.com/runtime.htm
________________________________________________________________________
4. Modificando los diálogos estándar de Windows
Modificando controles de los diálogos Abrir/Guardar de Windows
Por Igor Siticov
SiComponents: http://www.sicomponents.com
Pregunta: ¿Cómo cambiar textos como "Nombre de archivo:",
"Tipo de archivos:" y los textos de los botones
en los diálogos estándar de Windows?
A veces necesitamos cambiar algún texto u otra cosa en los diálogos
Abrir/Guardar de Windows. Desafortunadamente, los componentes de
diálogos de Delphi no proveen acceso a todos los controles de los
diálogos comunes de Windows, pero podemos realizar esto con la API de
Windows.
El ejemplo de abajo muestra como cambiar el texto de los controles del
diálogo Abrir.
Primero, necesitamos determinar los identificadores de los controles
del diálogo. Estos son los siguientes:
const
LB_FILETYPES_ID = 1089; // etiqueta "Tipo de archivos:"
LB_FILENAME_ID = 1090; // etiqueta "Nombre de archivo:"
LB_DRIVES_ID = 1091; // etiqueta "Buscar en:"
Segundo, necesitamos enviar un mensaje a la ventana de diálogo para
cambiar los controles deseados; algo como lo siguiente:
// uses ..., Windows, CommDlg;
procedure TForm1.OpenDialog1Show(Sender: TObject);
const
LB_FILETYPES_ID = 1089;
LB_FILENAME_ID = 1090;
LB_DRIVES_ID = 1091;
Str1 = 'Four';
Str2 = 'Five';
Str3 = 'One';
Str4 = 'Two';
Str5 = 'Three';
begin
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
IDOK, LongInt(Pchar(Str1)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
IDCANCEL, LongInt(Pchar(Str2)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_FILETYPES_ID, LongInt(Pchar(Str3)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_FILENAME_ID, LongInt(Pchar(Str4)));
SendMessage(GetParent(OpenDialog1.Handle), CDM_SETCONTROLTEXT,
LB_DRIVES_ID, LongInt(Pchar(Str5)));
end;
Nota: Los identificadores de los diferentes cuadros de diálogo y sus
valores pueden ser obtenidos importando los recursos de diálogo de
comctrl32.dll en cualquier editor de recursos y viendo estos identi-
ficadores en formato RC.
__________________
Igor Siticov es el autor de TsiLang Components Suite (un completo juego
de componentes para construir en dos minutos aplicaciones multilingües
elegantes, útiles y amistosas con el usuario) y de Resource Builder (un
muy completo editor visual de RC script, ideal para reemplazar al
Borland Image Editor y al Borland Resource WorkShop para crear y editar
archivos de recursos), por SiComponents: http://www.sicomponents.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
________________________________________________________________________
5. Huevo de Pascua de Delphi
Conozca mejor su Delphi
Por Bogdan Grigorescu [bogdang@gmx.net]
deGrigg Solutions - www.aiua.ro disponible pronto
Pregunta: ¿Hay huevos de Pascua en Delphi?
Sé que esta no es la clase de artículos técnicos que Ud. esperaría en
este boletín, pero mucha gente preguntó si no hay "huevos de Pascua" en
Delphi. Aquí va:
1) En Delphi 5 (lo he visto trabajar una edición Enterprise no parchada,
pero creo que es lo mismo para todas) abra el diálogo About.
2) Mantenga presionada la tecla Alt y escriba JEDI o DEVELOPERS o TEAM
o QUALITY.
3) Después de una gran palabra DELPHI que se desplaza fuera de la
pantalla verá:
- una alabanza al Joint Endeavour of Delphi Innovators (y un enlace a
su sitio en el diágolo About) o
- los nombres de los desarrolladores/equipo/QA que hizo de Delphi
un producto tan bueno
4) Mientras el texto tipo "Gerra de las Galaxias" todavía se mueve,
puede usar la tecla Abajo (o Arriba) para rotar el texto que se
mueve hasta darlo vuelta por completo, y ahora verá el mensaje:
"Use the Source, Luke" (1)
__________________
(1) N. de T.: "Usa el Fuente, Luke", rima intraducible con
"Use the Force, Luke" --> "Usa la Fuerza, Luke")
__________________
Nota del Editor: El huevo de Pascua parece estar presente en otras
versiones y ediciones de Delphi, pero hay reportes de excepciones
fatales al tratar de comprobar su existencia. Use bajo su propio riesgo.
________________________________________________________________________
6. 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-abierto. Programación en Delphi (todos los niveles). Si estás
en la etapa de aprendizaje o si no te agradan los foros discriminados
por niveles, este foro es para ti.
http://espanol.groups.yahoo.com/group/delphi-abierto
Suscripción:
http://espanol.groups.yahoo.com/group/delphi-abierto/join
delphi-abierto-subscribe@gruposyahoo.com
* 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@gruposyahoo.com
* 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
________________________________________________________________________
7. Delphi en la Red
Por Dave Murray <irongut @ vodafone.net>
Componentes, librerías y aplicaciones
=====================================
Shareware/Comercial
-------------------
* LMD-Tools 7 - por LMD Innovative
Una librería de más de 300 componentes incluyendo controles para un
superior diseño de la interfaz, programación de sistema, trabajo con
archivos y con bases de datos, componentes para Internet, multimedia,
entrada de texto/datos (RichEdit), visualización de texto con formato
y mucho más. Las características avanzadas incluyen transparencias,
efectos de fuentes y fondos, y hasta soporte HTML en varios controles.
http://www.lmdinnovative.com/products/lmdtool7/
* Greatis Form Designer v3.4 - por Greatis Software, Shareware ($49.95)
Es un diseñador de formularios en tiempo de ejecución que le permite
mover y cambiar el tamaño de cualquier control de su formulario. No
necesita preparar su formulario para usar Form Designer. Simplemente
suelte el componente TFormDesigner en cualquier formulario, establezca
la propiedad Active en True y ¡disfrute! Para Delphi 4-7 y BCB 3-6.
http://www.greatis.com/formdes.htm
Freeware
--------
* MsgConnect - por EldoS Group y TamoSoft - Licencia: GPL/Comercial
MsgConnect en un esquema de comunicación multiplataforma e indepen-
diente del protocolo diseñado para simplificar la tarea de construir
aplicaciones y componentes de capa intermedia cliente-servidor y
peer-to-peer. MsgConnect se encarga de un amplio rango de tareas
técnicas de bajo nivel, permitiendo a los desarrolladores concentrarse
en la lógica de negocios de su aplicación.
http://www.msgconnect.com
* PGP Components for Delphi v3.3.2 - by Michael in der Wiesche (source)
Provides a direct interface from Delphi 2-7 to PGP 6.5.x, 7.x or 8.x.
Capabilities: Encode and decode (encrypt/decrypt/sign/verify); Create
and verify file detached signatures; Import, export, revoke and delete
keys; Several key management functions; Key generation (DH/DSS, RSA);
Keyserver functions; Utilities.
http://home.t-online.de/home/idw.doc/PGPcomp.htm
* TurboPower Async Professional v4.06 - by TurboPower (with source)
A comprehensive communications toolkit, it provides direct access to
serial ports, TAPI, and the MS Speech API. It supports fax, terminal
emulation, VOIP, & more.
https://sourceforge.net/projects/tpapro/
* TurboPower FlashFiler v2.13 - by TurboPower (with source)
A client-server database for Delphi and C++Builder. It features a
component-based architecture and the server engine can be embedded in
your applications. FlashFiler is easy to configure, performs well and
includes SQL support.
https://sourceforge.net/projects/tpflashfiler/
* TurboPower Orpheus v4.06 - by TurboPower (with source)
An award-winning UI toolkit for Delphi and C++Builder. It contains
over 120 components covering everything from data entry to calendars
and clocks. Other components include an Object Inspector, LookOut bar,
and report views.
https://sourceforge.net/projects/tporpheus/
* TurboPower Internet Professional v1.15 - by TurboPower (with source)
A set of VCL components providing Internet connectivity for Delphi and
C++Builder. Includes POP3, SMTP, NNTP, FTP, HTTP, Instant Messaging
and HTML viewer as well as components for low-level socket access.
https://sourceforge.net/projects/tpipro/
* TurboPower Essentials v1.11 - by TurboPower (with source)
Contains 13 native VCL controls for Delphi and C++Builder. They
include drop-down calendars and calculators, roll-up dialogs, 3D
labels, tiled backgrounds, scrolling messages, menu buttons and more.
https://sourceforge.net/projects/tpessence/
* TurboPower ShellShock v1.02 - by TurboPower (with source)
Provides a set of components that let you customize applications with
the functionality available in the Windows Shell and Windows Explorer,
all without writing code. The components are written in native VCL for
Delphi and C++Builder.
https://sourceforge.net/projects/tpshellshock/
* TurboPower LockBox v2.07 - by TurboPower (with source) (DELPHI/KYLIX)
A cross-platform toolkit for data encryption. It contains routines and
components for use with Delphi, C++Builder and Kylix. It provides
support for Blowfish, RSA, MD5, SHA-1, DES, triple- DES, Rijndael and
digital signing of messages.
https://sourceforge.net/projects/tplockbox/
* TurboPower B-Tree Filer v5.55 - by TurboPower (with source)
A fast library of file-based database routines for Turbo Pascal and
Delphi. Supports stand-alone programs or those running on Microsoft-
compatible networks including Novell Netware.
https://sourceforge.net/projects/tpbtreefiler/
* TurboPower OnGuard v1.13 - by TurboPower (with source)
A library to create demo versions of your Delphi and C++Builder
applications. Create demo versions that are time-limited, feature-
limited, limited to a certain number of uses, or limited to a certain
number of concurrent network users.
https://sourceforge.net/projects/tponguard/
* TurboPower String Resource Manager v1.0.4 - by TurboPower (w/source)
A tool for building string resource libraries in Delphi. It prevents
string resource clashes + simplifies translation of string resources.
https://sourceforge.net/projects/tpsrmgr/
* TurboPower Async Professional CLX v1.01 - TurboPower (source) (KYLIX)
A comprehensive communications toolkit for Borland Kylix. It provides
direct access to serial ports, and supports terminal emulation, file
transfer protocols and much more.
https://sourceforge.net/projects/tpaproclx/
* Drag and Drop Component Suite 3.7 - by Angus Johnson and Anders
Melander (with source)
Enables COM drag-and-drop of files, folders, text, bitmaps and URLs
between applications. Copy, move and link operations. Clipboard
support. Drag image support. Automatic scrolling of the target window
during the drag operation. Relatively simple to derive custom drag-
and-drop components to support other data formats.
http://www.torry.net/vcl/system/draganddrop/DragDrop0402.zip
* TMPAnimatedCursors - by Markus Stephany (with source)
A component to manage + use animated cursors within your applications.
http://www.mirkes.de/en/delphi/vcls.php
* TukangOmong 0.0.1 (with source)
Indonesia Text-to-Speech Engine.
http://www.kioss.com/kioss/proyek.php?nama=aTukangOmong
Artículos, trucos y consejos
============================
* IntraWeb: A New Way to the Web - by Cary Jensen
IntraWeb is a framework and component set that permits you to quickly
and easily build interactive Web sites using Delphi, Kylix or
C++Builder and it may very well change the way you develop Web
applications from now on.
http://community.borland.com/article/0,1410,29650,00.html
* WebSnap Tips and Tricks - by Nick Hodges
Nick shares some of his tips and tricks to make WebSnap do the things
you need it to do.
http://community.borland.com/article/0,1410,29537,00.html
* Web Services Training: Free Trial! - by Anders Ohlsson
You may not know this, but Borland has an *awesome* Web Services
training CD for sale. And a free teaser for it.
http://community.borland.com/article/0,1410,28381,00.html
* Protect your Delphi Software - by Zarko Gajic
Want to know more about the issues surrounding the protection of your
Delphi applications from any unauthorized usage?
http://delphi.about.com/library/weekly/aa012803a.htm
* "The Big Brother" Delphi Code Toolkit 2 - by Zarko Gajic
Taking control over the system - the Delphi way. Disabling Windows
system keys, Windows shell elements - this time using dWinLock Delphi
component.
http://delphi.about.com/library/weekly/aa012103a.htm
* Top 6 Testing and Debugging Tools - by Zarko Gajic
If you're looking for the best Delphi testing and debugging tools,
look no further. The list contains tools to help you speed up your
development by finding possible bugs, memory leaks, etc.
http://delphi.about.com/od/toppicks/tp/aatpdebug.htm
* Learn the Security Ropes for .NET with this Book - by Lamont Adams
Review of ".NET Security" by Jason Bock, Pete Stromquist, Tom Fischer,
and Nathan Smith.
http://builder.com.com/article.jhtml?id=u00320030109adm01.htm
* How to detect if an application is being debugged - by m3Rlin
www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=214
* How to get the date a file was last accessed - by m3Rlin
www.delphifaq.net/modules.php?op=modload&name=FAQ&op=view&id=215
* Link Label Component - by Daniel Wischnewski
A simple label component for links to web pages, Email, etc.
http://www.delphi3000.com/articles/article_3511.asp
* Extract field from DataSet into TStringList - by Stewart Moss
Component to extract a specific field from a dataset in a TStringList.
Useful for populating TlistBoxes that you dont want to be data aware.
http://www.delphi3000.com/articles/article_3512.asp
* D6 + ADO + SQLServer Convert to Oracle Backend ???? - by Hans Pieters
http://www.delphi3000.com/articles/article_3513.asp
* Save DataSet as CSV Textfile - by Kjetil Rodal-Jalasto
Procedure that saves the content of a DataSet as a CSV textfile, works
fine with both BDE and DBExpress datasets.
http://www.delphi3000.com/articles/article_3514.asp
* Distributed Applications, the easy way II - by Eugene Mayevski
Is there a way to have a flexible data exchange system and don't go to
deep into technical details? This second part of the article describes
basics of MsgConnect usage.
http://www.delphi3000.com/articles/article_3515.asp
* OLE Drag and Drop Delphi Overview - by Herbert Poltnik
http://www.delphi3000.com/articles/article_3520.asp
* Multi Socket Port Scanner - by guy gafni
http://www.delphi3000.com/articles/article_3521.asp
* Adjust a TWinControl's size at RunTime - by quark quark
http://www.delphi3000.com/articles/article_3523.asp
* Delphi ActiveX/Midas Development Hints - by Herbert Poltnik
This document provides a basis for developing multi-tier database
applications that have zero client configuration administration.
http://www.delphi3000.com/articles/article_3524.asp
* Duplicating a Database Record - by Andrew Baylis
http://www.delphi3000.com/articles/article_3525.asp
* Pass a recordset from COM object to ASP VBScript - by Bernhard Angerer
How to return a resultset (dataset) from COM to ASP.
http://www.delphi3000.com/articles/article_3527.asp
* Messing with other applications memory - by Colin Myerscough
http://www.delphi3000.com/articles/article_3528.asp
* Creating a system wide shortcut or hotkey - by Jim McKeeth
http://www.delphi3000.com/articles/article_3529.asp
* How to create a thumbnail from a JPEG image - by Rafael Cotta
http://www.delphi3000.com/articles/article_3530.asp
* OLE Drag and Drop - by Herbert Poltnik
How to drop an email from Outlook into a Delphi form.
http://www.delphi3000.com/articles/article_3533.asp
* Automation Interface Confusions Straightened Out - by Graham Wideman
Interfaces, dispinterfaces, variants, IDispatch, etc.
http://www.wideman-one.com/gw/tech/Delphi/autointf/index.htm
* Understanding Delphi COM (OLE) Interface References, AddRef and All
That - by Graham Wideman
COM References Reference Counting, AddRef and Release, and a test
application to demonstrate how it really works.
http://www.wideman-one.com/gw/tech/Delphi/dragdrop/comrefs/index.htm
* Notes on Delphi Constructors and Destructors - by Graham Wideman
Constructors and Destructors: Virtual or not?
http://www.wideman-one.com/gw/tech/Delphi/ConstDest.htm
* Delphi ActiveX Controls: Unusable in MS Office Document Pages - by
Graham Wideman
Click and paint Problems when single-component ActiveX control
inserted is in Office document pages.
http://www.wideman-one.com/gw/tech/Delphi/dax/index.htm
* Delphi ActiveForm Controls: Clipping bug on scrolled pages ...with
plausible solution... - by Graham Wideman
ActiveForm clipping problem in Office document pages.
http://www.wideman-one.com/gw/tech/Delphi/dax/afxclipbug.htm
* Hardware I/O Port Programming with Delphi and NT - by Graham Wideman
Delphi I/O Port Programming under Windows NT and an I/O Port Map
Manipulator driver (gwiopm.sys).
http://www.wideman-one.com/gw/tech/Delphi/iopm/index.htm
* Precision Timing Under Windows Operating Systems - by Graham Wideman
Measuring Time, and Scheduling Routines under Windows. Checking the
Scheduler granularity. Numerous references.
http://www.wideman-one.com/gw/tech/dataacq/wintiming.htm
* Multitasking discussion - by Graham Wideman
Basics of Processes, Threads, Time Slices and Priority
http://www.wideman-one.com/gw/tech/dataacq/multitasking.htm
* Observing the Timing Behavior of Applications in Windows 95/98/NT
Using LabVIEW - by Graham Wideman
How well can applications that you write in LabVIEW or other languages
perform under Windows OSes? Does LV use Special Magic or simply make
most judicious used of the OS timing services?
http://www.wideman-one.com/gw/tech/dataacq/labview/index.htm
Tutoriales
==========
* .NET Remoting - by Alain "Lino" Tadros
This article explains and demonstrates the .NET Remoting framework and
builds Remotable Objects, Hosting servers and Clients to exercise the
different activation models.
http://community.borland.com/article/0,1410,29563,00.html
* Maximize DataSnap efficiency in Delphi - by Bob Swart
This tutorial is mainly concerned about the data throughput bottleneck
between the DataSnap Server and Client, including ways to prevent it
by limiting the amount of data being sent. But, before you can limit
throughput you have to measure it.
http://builder.com.com/article.jhtml?id=u00220030117swa01.htm
* Tweak App Performance with Index Tuning Wizard - by Eric Roland
Debugging is a critical aspect of any development project. SQL Server
provides the Profiler tool and the Index Tuning Wizard to aid you in
the search for rogue code in your applications.
http://builder.com.com/article.jhtml?id=u00320021220ero01.htm
* .NET Demystifies Encryption - by William Dawson
.NET makes cryptography a little simpler by putting everything into
one SDK. Find out how to encrypt and decrypt a text file with the
System.Security.Cryptography namespace. Code in C# but good tutorial.
http://builder.com.com/article.jhtml?id=u00220030120wdx01.htm
* OLE Drag and Drop In Delphi - por Graham Wideman
Comprehensive tutorial with source code examples.
http://www.wideman-one.com/gw/tech/Delphi/dragdrop/index.htm
Otros enlaces
=============
* Descargas Delphi y Kylix - del Club de Programadores
Componentes, tutoriales y ejemplos para descargar. También puedes
subir tu material para compartirlo con otros.
http://clubdeprogramadores.com/descargas/tema.php?Id=15
* Borland Rolls Out Branding Effort - by Scott Van Camp
Borland Software Corp., a company considered dead in the water in the
mid-1990s but now in the midst of a comeback, has launched a $12
million ad campaign to reintroduce the Borland brand.
http://www.technologymarketing.com/mc/news/
article_display.jsp?vnu_content_id=1807206
________________________________________________________________________
¡Tú puedes ayudarnos!
Por favor danos una mano y ayúdanos a llegar a los 10.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@gruposyahoo.com
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://www.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
http://www.lawebdelprogramador.com/buscar/votar.php?id=615
Por favor vota. Son sólo unos segundos para ti que REALMENTE pueden
hacer la diferencia. Necesitamos tu ayuda para poder continuar.
________________________________________________________________________
Si no has recibido el archivo con el código fuente completo de los
ejemplos que se presentan en este boletín, puedes descargarlo de la
siguiente dirección: http://www.latiumsoftware.com/es/file.php?id=p43
________________________________________________________________________
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) 2003 por Ernesto De Spirito. Todos los derechos reservados
________________________________________________________________________
|