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






