Boletín Pascal #32
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
Boletín Pascal #32 - 11-FEB-2002 INDICE 1. UNAS PALABRAS DEL EDITOR 2. KISS - Controles simples - TFormPos (Componente) - THalFileList (Componente) - TProgressCircle (TGraphicControl) . Revisitando el uso de "Skin" - TSkin (TGraphicControl) . La relación con sub controles. - TSkinTitleBar (TCustomControl) - En futuro 3. PAGINACION EN WEBBROKER USANDO CLIENTDATASETS 4. CREANDO COMPONENTES EN TIEMPO DE EJECUCION - Acerca de este tutorial - Beneficios de la creación de componentes en tiempo de ejecución - Creando su primer componente (en tiempo de ejecución!) - Asignando eventos - En el futuro 5. RUTINA PARA TRANSFORMAR UNA IMAGEN A ESCALA DE GRISES 6. FOROS 7. DELPHI EN LA RED - Componentes, librerías y aplicaciones . Shareware/Comercial . Freeware - Artículos, trucos y consejos - Tutoriales - Otros enlaces ________________________________________________________________________ 1. UNAS PALABRAS DEL EDITOR Desde comienzos de este boletín, su publicación ha estado a cargo de Ernesto De Spirito quien ha dado lo mejor de sí para que permanezca en pié y crezca tanto en suscriptores como en calidad, y esto nunca habría sido posible sin la colaboración de todos ustedes quienes desinteresa- damente comparten sus experiencias tanto en los foros como en este boletín. A partir de esta edición tendré el honor de encargarme de la publicación, por lo que agradezco todo el apoyo que le han dado al boletín que a la final se traduce en beneficio para la comunidad de programadores Delphi / Kylix, es decir, nosotros mismos. También agradezco todo el apoyo prestado para esta edición y de antemano para las que vienen, al mismo tiempo que sugiero que multipliquemos la semilla germinadora del conocimiento, haciendo extensible este boletín a otros programadores e invitándolos a que se suscriban, así como también para que voten por nuestro sitio siguiendo los enlaces presentados al final del boletín en el apartado "Tú puedes ayudarnos". En esta edición Alirio A. Gavidia B. presenta KISS - Controles simples, una colección de componentes, dentro de los cuales se destaca THalFileList, en donde Alirio encapsula en un componente operaciones recursivas como el recorrido de directorios. También presentamos un artículo de Ernesto Cullen que nos muestra cómo llevar una tabla a HTML incluyendo enlaces "anterior" y "siguiente". Por otra parte, un artículo muy bueno para aquellos quienes se han visto en la necesidad de crear componentes en tiempo de ejecución, Charl Linssen nos presenta un pequeño pero útil tutorial, en donde en unos pocos pasos obtenemos el conocimiento para poner en práctica, por ejemplo, la creación dinámica de una matriz de botones que al hacer clic en alguno de ellos, nos muestre la fila y la columna del mismo. Lucas Martín nos suministra el código para transformar una imagen a escala de grises, y como de costumbre, presentamos la sección "Delphi en la Red" de Dave Murray. Recuerden enviarnos cualquier comentario o sugerencia acerca de los artículos presentados, y a los programadores de Kylix que se hayan lanzado en la aventura de realizar componentes, los invitamos a que compartan su experiencia, para darle un poco mas de apoyo a esta nueva, pero familiar herramienta de desarrollo para Linux. Saludos, Luis Hurtado hurtado@latiumsoftware.com ________________________________________________________________________ JfControls Lib. Multilenguaje. Multiapariencia. Skins. Privilegios. Más de 40 componentes integrados y personalizables. Múltiples problemas de programación resueltos. Administración centralizada de recursos. Para Delphi 3-7 y C++ Builder 3-6. http://www.jfactivesoft.com/spindex.htm ________________________________________________________________________ 2. KISS - Controles simples Por Alirio A. Gavidia B. :KISS Principle: /kis' prin'si-pl/ n. "Keep It Simple, Stupid". A maxim often invoked when discussing design to fend off {creeping featurism} and control development complexity. Possibly related to the {marketroid} maxim on sales presentations, "Keep It Short and Simple". Tomado de THE JARGON FILE, VERSION 2.9.12, 10 MAY 1993. La cita anterior viene a colación por mis labores el pasado fin de semana. Sucede que he estado pensando en un proyecto de desarrollo de VCL y en cómo estimar el tiempo de desarrollo. Este asunto es marginal. Pero finalmente terminé colocando algunas cosas simples en un VCL que sólo clasifica como simple. Me pareció que un nombre como "Librería esotérica para determinación del séptimo decimal de corrección en órbitas geoestacionarias altas" sería inadecuado. Así que como muchas cosas quedará en "Simples" o mejor "KISS". Como verán tengo cinco controles no del todo relacionados, cosa curiosa es con un solo programa de demostración se ve la acción de cuatro de estos controles (no por no relacionados son inútiles). Fundamentalmente este es un trabajo creado (no corregido) en un fin de semana. Así que es SIMPLE para que funcione. Oportunamente comentaré las debilidades de cada control. 1.- TFormPos (Componente) ========================= Uno de esas cosas que muchos terminamos haciendo es guardar la posición y medida de un formulario para reutilizar esos datos en la siguiente sesión. Sólo necesitamos trabajar con TRegistry. Esto es tan simple que hasta parece innecesario convertirlo en VCL. Pero lo utilizo mucho, así que se justifica plenamente un componente que simplemente se arrastrará al formulario y se le definirá un par de propiedades. Allí Ud. dirá "bueno hay muchos controles que hacen más que eso". Cierto, y le recomiendo uno: "TFormStorage" de las RXLIB. Esperen por favor, no se deshagan aún de esto. "TFormPos" toma en consideración un tonto problema de cambio de resolución. Suponga que su programa termina su sesión en la posición X:900, Y:650 de su monitor y Ud. cambia a modo de 640x480 y reinicia el programa. ¿Ve el problema?, mejor dicho no lo verá. Su programa estará fuera de la pantalla. A ver como lo arrastra... déle, déle que Ud. puede. "TFormStorage" de las RX almacenará muchas propiedades, incluso hasta el control activo del formulario. Pero con el cambio de resolución tampoco lo notará. Ahora si Ud. no necesita almacenar 46 propiedades diferentes entonces "TformPos" le puede servir. Si no es así, guárdelo, es un componente simple y sirve de ejemplo. "TFormPos" sólo tiene 5 propiedades de las cuales dos son "Tag" y "Name". Tiene una propiedad "Active" que define si el componente operará. Con "CurrentKey" y "RegistryRoot" se define el lugar donde se almacenará la posición del formulario. El ejemplo está en "SkinDemo.dpr". Respecto al código es interesante notar un par de cosas en la creación de "TformPos": Primero es que requiere "Owner" y que debe ser "TForm". Segundo, debe ser único en el formulario. Para resolver el primer punto basta con incluir este código en el evento create: if (AOwner=nil) or not (AOwner is TCustomform) then raise Exception.Create('Owner of FormPos component must be a form'); Para resolver lo segundo me parece que lo más obvio es revisar si en el formulario hay otro componente igual a "TFormPos" ("Self.ClassType" es precisamente "TFormPos", pero hecho así esta rutina es más general). for i:= 0 to AOwner.ComponentCount-1 do if AOwner.Components[i] is Self.ClassType then raise Exception.Create('FormPos component duplicated'); Para cargar de registro o un archivo los datos de la posición del formulario necesitamos algunas propiedades ya definidas. Por esta razón no podemos ejecutar esto desde el evento "Create". Soluciones no dudo que haya varias. Aquí se optó por trabajar con el Procedimiento "Loaded" definido en "TComponent". procedure TFormPos.Loaded; begin inherited Loaded; if not fInPlace and not (csDesigning in ComponentState) then begin fInPlace := True; LoadCoordinates(Owner); if Assigned(FOnRestorePlacement) then FOnRestorePlacement(Self); end; end; El control dispara dos eventos. Uno antes de salvar y el otro después de cargar. 2.- THalFileList (Componente) ============================= Detesto usar las operaciones para leer un directorio heredadas desde DOS como "Findfirst", "FindNext" y "FindClose". De hecho es demasiado obvio que esto debe ser un objeto porque tiene un proceso de destrucción al final que NO DEBE SER OLVIDADO. Recuerdo, en alguna ocasión, ver que alguien publicó una solución donde envolvió esto en un Objeto (como debe ser). Yo fui dos pasos más allá: lo convertí en Componente VCL y lo hice recursivo. He visto que cada tanto tiempo alguien pregunta como recorrer direc- torios y subdirectorios. Esta es mi solución. Es simple de usar (volvemos a lo de KISS, que es mi leit motiv en este caso). Tiene un solo evento que se dispara con cada archivo leído. Si quiere borrar el contenido de un directorio simplemente en el evento haga un "deletefile" para el parámetro dado, ejecute (método "Execute") con el directorio- máscara y voila. "THalFileList" además tiene una particularidad bien interesante. Notifica cuando el contenido de un directorio cambia. Si la propiedad "ActiveWatch" está habilitada y el evento "OnChange" se disparará con cambios en el directorio. Es posible definir que tipo de cambios disparan el evento a través de la propiedad "NotifyFilter" (las RX tienen una solución a este respecto: "RxFolderMonitor"). El ejemplo está en "DirWatchDemo.dpr" En principio, como VCL no hay ningún reto dentro de este componente ('TFormPos' si los tuvo más allá de mi interés). El método "Create" sólo inicializa variables. Y "destroy" libera la lista de archivos. El monitoreo de los cambios en el directorio sí resultó de interés porque requirió investigación. "FindFirstChangeNotification", "FindNextChangeNotification" y "FindCloseChangeNotification" son punto crucial del monitoreo. La primera función devuelve, normalmente, un "handle" para un objeto de notificación. La segunda nos permite continuar la verificación del estado del referido objeto. El punto importante aquí es esperar un cambio antes de utilizar la segunda función. Entonces se utiliza "WaitForSingleObject". Como no se desea que la aplicación se quede esperando hasta que haya un cambio "WaitForSingleObject" es colocado en un "Thread" (hebra o hilo) de ejecución aparte. Cada vez que la espera termina se crea un nuevo hilo para esperar el siguiente cambio. ------------------------------ ¡Los controles, los controles! ------------------------------ 3.- "TProgressCircle" ("TGraphicControl") ========================================= Le sonará como ... ¡"TProgressBar"!. Cierto, es la versión redonda de "TProgressBar". Sólo hay algunas consideraciones particulares: - Por defecto de 0 a 60. No de cero a 100. La razón es que esto es un reloj. Yo utilizo este control gráfico para representar relojes que miden lapsos en un Cyber-Café. - Recorrido sobre un sub-segmento. Píenselo con calma. Toda la esfera representa una hora entera en, digamos azul. Queremos asignar 20 minutos desde los 30 minutos a los 50 (en rojo). A medida que avanza se deja un rastro amarillo. Al final tenemos tres áreas. La que no se recorrerá en azul. La que se recorrerá en rojo y la ya recorrida en amarillo. Este concepto de tres áreas no siempre tiene sentido, pero es confortable tenerlo disponible. Ejemplo en "SkinDemo.dpr". "TProgressCircle" hereda de "TGraphicControl" y por ello tiene presencia gráfica como control pero carece de foco. Tiene un "canvas" que es lo único necesario. Se hace uso de las funciones "CombineRgn", "CreateRectRgn", "CreatePolygonRgn" y "CreateEllipticRgn". La región elíptica es el reloj en sí. El polígono permite construir cada segmento a dibujar. La región rectangular se crea como requisito para "CombineRgn". Lo demás es un ejercicio matemático interesante sólo como ejercicio mental. El método "Paint" además utiliza "Canvas.Lock / Canvas.Unlock" para evitar interferencias. Según la documentación esto puede generar alguna penalidad de rendimiento, pero, al menos aquí, parece funcionar bien. Revisitando el uso de "Skin" (o membranas como se ha dado por llamar en español). ----------------------------------------- Hace algún tiempo escribí algo sobre "Skin". He puesto en un VCL dos controles para ello. El primero es "TSkin" el segundo "TSkinTitleBar". El manejo de "Skin" se basa en la definición de regiones con una determinada forma o silueta. Esta forma o silueta es determinada a partir de un "bitmap" donde existe un color establecido como transpa- rente (esto es problemático con archivos jpg dado que los puntos suelen sufrir degradaciones de tono en el proceso de compresión). La rutina "GenRegion" parte del "bitmap": dado y genera un arreglo con un conjunto de puntos que definen una región. Este arreglo es entregado a la función de Windows "CreatePolygonRgn" que crea un objeto con la región definida. "SetWindowRgn" (también del API de Windows) dado el objeto que representa la región y el "handle" del formulario establece la forma de este. En realidad "SetWindowRgn" define sobre que zona es permitida la acción de dibujo para la ventana dada. Los puntos fuera de esa región deben seguir existiendo. De hecho las dimensiones de ancho y alto de un formulario se mantienen independientemente de la silueta establecida. La siguiente rutina activa el "skin". function TSkin.ActiveSkin: Boolean; Var Par : Array [0..1024] of TPoint; // Data -> region Cnt : Integer; // Contadores / counters hRegion : tHandle; // region handle (CreatePolyRgn) i : Integer; begin Result := False; if (csDesigning in ComponentState) then Exit; if TCustomForm(Owner).BorderStyle <> bsNone then begin fOriginalBorderStyle := TCustomForm(Owner).BorderStyle; TCustomForm(Owner).BorderStyle := bsNone; TWrapForm(Owner).RecreateWnd; // necesario por cambio de estilo end; Left := 0; Top := 0; Cnt := GenRegion(Par, FBitmap, Left, Top ); if Cnt>0 then begin hRegion := CreatePolygonRgn(Par, Cnt, 0); SetWindowRgn((Owner as TCustomForm).Handle, hRegion, true); Result := true end; // ahora los controles skin for i:=0 to Self.fSubSkinControl.Count-1 do if TObject(Self.fSubSkinControl[i]) is TSkinTitleBar then TSkinTitleBar(Self.fSubSkinControl[i]).ActiveSkin end; Nótese que la rutina para "TskintitleBar" es fundamentalmente la misma pero sin validar el "borderstyle" del formulario ni la activación de sub-controles que para ese caso no existe. La operación contraria ("Deactivate") simplemente establece una región cuadrada del formulario según su ancho y alto. 4.- TSkin (TGraphicControl) =========================== "TSkin" viene de "TGraphicControl" por ello no tiene capacidad de recibir foco (ni nos hace falta). En realidad es como un "TImage" y lo único interesante que tiene es una propiedad "BitMap" donde se define la membrana o "skin". La creación de "TSkin" valida como "Owner" un descendiente de "TCustomForm" y que haya sólo un componente "Tskin" en el formulario (no le veo sentido a colocar dos o más). Se inicializan variables y objetos de uso interno. "fSubSkinControl" internamente almacena una lista de componentes asociados. Estos componentes, actualmente, sólo son de tipo "TSkinTitleBar" y la lista se mantiene para poder realizar operaciones conjuntas (como activación y desactivación que debe ser realizada en estricto orden). Las membranas son cuadradas ("bitmap" al fin) pero el color del punto superior izquierdo se asume como una especie de color "transparente". Esto es para que el control pueda determinar la silueta de la figura en el "bitmap". De resto queda establecer la propiedad "Active" a verdadero. Fundamentalmente hay dos propiedades publicadas "Active" y "Bitmap" la segunda contiene la figura para construir la silueta. "Active" afecta la silueta en sí del formulario y activa en cadena los controles asociados. Cosa curiosa es que puede funcionar aún cuando la propiedad "Visible" esté inhabilitada. ------------------------------------------------------------------------ Advertencias: Ya me pasó que usé Photoshop y me colocó un Píxel con un color ligeramente diferente de otro que yo creía sería el transparente. Al final tuve una figura de 2x2. Eso de que el ojo no distinga bien 65 millones de tonos es problemático. Así que lo que Ud. ve como un color plano puede ser un fondo de una docena de variaciones ligeras de amarillo ocre. ------------------------------------------------------------------------ La activación de "TSkin" requiere que la propiedad "BorderStyle" del formulario sea "bsNone". Para este cambio debe ser recreada la ventana del formulario al activar y desactivar "TSkin", de allí el fuerte parpadeo que se presenta. Respecto a la propiedad "Bitmap" normalmente cuando se crea la propiedad Delphi crea un método SetBitmap donde se establece FBitMap := Value. Esto es incorrecto debido a que se corre el riesgo de que Value sea un objeto cuya destrucción no depende de la clase "TSkin". Este código generaría error: : Skin1.Bitmap := BitMap; Bitmap.Free; Skin1.Active := True; : Así que "SetBitmap" se establece así: procedure TSkin.SetBitmap(const Value: TBitmap); begin FBitmap.Assign(Value); paint; end; Excepto por la llamada a "paint" el control "TImage" funciona de esta forma. La relación con sub controles. ------------------------------ "TSkin" mantiene una lista de subcontroles que permanece protegida. Se vale de "InsertSkinControl" y "RemoveSkincontrol" que son llamadas hechas desde los referidos subcontroles para insertarse o retirarse de la lista. Este mecanismo es más o menos así: Para esta explicación nos referimos a un control ("TSkin") y a un Subcontrol ("TSkinTitleBar") nuestro subcontrol tiene una propiedad que lo relaciona al control, en este caso "Skin". Esta situación es similar con, por ejemplo, "TDBEdit" y "Datasource". Para hacer esto no basta con crear la propiedad en el subcontrol, es conveniente además crear una lista para relacionar todos los subcontroles atados a el control principal (Pensemos que podemos tener más de un "TSkinTitleBar" atado a un único "TSkin"). Esto implica dos cosas: i.- Cuando un subcontrol desaparece debe ser eliminado de la lista. ii.- Cuando un control principal desaparece debe ser eliminado de las propiedades que lo reflejan en los subcontroles. Lo primero se resuelve en el "Destroy" del subcontrol donde se llama al método "RemoveSkincontrol" del control "TSkin". destructor TSkinTitleBar.Destroy; begin if Assigned(FSkin) then FSkin.RemoveSkincontrol(Self); inherited; end; Lo segundo requiere utilizar el método "Notification" que se dispara cuando un componente esta por ser eliminado. Si el componente es el control principal se elimina el enlace y ya. procedure TSkinTitleBar.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = FSkin) then FSkin := nil; // directamente Fskin porque si toco Skin se dispara // SetSkin actuando sobre el Skin que está siendo eliminado end; Cada vez que se define la propiedad "Skin" hay que actualizar la lista de "Skin" en cuanto a sub controles. Una forma es así: property Skin : TSkin read FSkin write SetSkin; procedure TSkinTitleBar.SetSkin(const Value: TSkin); begin if FSkin=Value then Exit; if Assigned(FSkin) then FSkin.RemoveSkincontrol(Self); FSkin := Value; if Assigned(FSkin) then FSkin.InsertSkinControl(Self) end; 5.- TSkinTitleBar (TCustomControl) ================================== "TSkinTitleBar" sólo se diferencia en tres cosas de "TSkin": I.- Es un control con un "handle" de windows por ello usa más recursos y se superpone siempre a "TSkin". II.- Se puede usar para arrastrar. No es que sea arrastrable sino que como efecto neto da un área para poder arrastrar el formulario. Simplemente se comporta como la barra de titulo de los formularios. III.- Afecta a si mismo al definir la silueta, "TSkin" afecta al formulario entero. El control "Owner" de "TSkin" tiene que ser heredado de "TCustomForm" porque es sobre el "handle" del formulario que establece la silueta. "TSkinTitleBar" necesita el formulario para el arrastre. En teoría ambos controles podrían funcionar actuando sobre paneles u otros controles pero no es la funcionalidad deseada. Estrictamente "TSkinTitleBar" no debe depender de "TSkin". Es más si usted desea un formulario cuya área completa sea arrastrable no debería necesitar "TSkin". Sin embargo hay cierta validación que ha sido dejada sólo en "TSkin" de esta forma es necesario usar ambos controles conectados por medio de la propiedad "Skin" de "TSkinTitleBar" así ambos se activaran en el orden correcto al activar "TSkin". "TSkinTitleBar" envía el mensaje wm_SysCommand con el parámetro sc_DragMove ($f012) para iniciar el arrastre del formulario. Esto como respuesta al mensaje que notifica botón de ratón abajo. procedure TSkinTitleBar.WMLButtonDown(var Message: TWMLButtonDown); begin inherited; if not (csDesigning in Self.ComponentState) then begin ReleaseCapture; TCustomForm(Owner).Perform (wm_SysCommand, sc_DragMove, 0) end end; Fuera de ello "TSkinTitleBar" es una versión simplificada de "TSkin" que actúa sobre su propia ventana y no sobre la del formulario al momento de definir silueta. En algún momento he pensado que parte de la funcionalidad de "TSkin" y "TSkinTitleBar" debe ser encapsulada en un ancestro común. Pero por lo pronto no parece proveer ganancia significativa tal acción. Además ambos controles provienen de ramas diferentes "TCustomControl" y "TGraphicControl" aunque ambos tienen como ancestro común "TControl" "TCustomControl" introduce demasiados elementos necesarios para "TSkinTitleBar". Todo esto quizás sea replanteado al introducir "TSkinButton". En futuro. ========== Pienso que esto forme parte de otro proyecto más grande. Por lo pronto úsenlo a su riesgo y con cuidado (que no dependa la vida de nadie de esto). Se pueden hacer muchas pequeñas modificaciones y algunas grandes. Falta algo como un botón con membrana (TSkinButton). Si alguien lo hace y quiere incluirlo como parte de esto bienvenido sea, vale esto con cualquier otro cambio o mejora. Eventualmente publicaré esto en mi "Web site" y mantendré al editor de Latium Software al día con respecto a cualquier cambio. Los estoy utilizando así que posiblemente agregue mejoras y corrija "bugs" (no soy tan iluso de creer porque sea simple no tenga errores, sólo espero que sean errores simples). Existen otros controles para esta librería pero no están listos para esta entrega. Versan sobre el manejo directo de la impresora sin gráficos (sólo texto) en modo crudo y ... simple. P.D.: Estoy creando una lista de tips para publicar en mi web site. Por favor necesito material, mientras más original mejor, de preferencia comentado en español e inédito o poco divulgado. Se citará la fuente. ________________________________________________________________________ 3. PAGINACION EN WEBBROKER USANDO CLIENTDATASETS Ernesto Cullen nos envía un artículo que describe una técnica usando WebBroker con Delphi para mostrar una tabla en una página web de a varios registros cada vez, con enlaces a la página anterior y siguiente. Por razones de espacio en el boletín, no podemos reproducir su artículo aquí, pero puede accederlo siguiendo este enlace: http://www.latiumsoftware.com/es/articles/00013.php A propósito, el código fuente correspondiente está disponible para descarga en la siguiente ubicación: http://www.latiumsoftware.com/download/a00013.zip ________________________________________________________________________ 4. CREANDO COMPONENTES EN TIEMPO DE EJECUCION Por Charl Linssen <charl@atomasoft.com> Acerca de este tutorial ======================= Este tutorial fue escrito por Charl Linssen (e/s/l: 15, masculino, Países bajos). Puede ser copiado sin contactar al autor, pero no puede ser editado de ninguna manera. Para preguntas y comentarios, siéntate libre de compromisos para enviar un correo a <charl@atomasoft.com>. Beneficios de la creación de componentes en tiempo de ejecución =============================================================== Usted probablemente no usará este tipo de creación de objetos muy a menudo. Usualmente creará todos los componentes (incluyendo las formas) haciendo clic en los iconos correspondientes de la paleta de componentes y arrastrándolos a la forma. Bueno, Delphi _es_ una herramienta RAD (Rapid Application Development), así que no hay problema. Sin embargo, la creación de componentes en tiempo de ejecución tiene muchas ventajas. Las principales son las siguientes: - ¡Tamaño del archivo! Hice un pequeño ejemplo. un EXE con un botón creado en tiempo de diseño (y nada emás) es de 291 Kb, mientras que la misma forma solo con el botón creado en tiempo de ejecución es de 290 Kb! Ahora, puede decir "esto es un solo kilobyte para tantos problemas". Bueno, usted tiene razón, pero este es solo un ejemplo con un solo botón! Imagínese la diferencia que representaría en un programa grade con cientos de componentes. - ¡Adaptabilidad! Puede hacer mensajes 100% a la medida, cajas de diálogos y mucho mas. Normalmente usted tiene que hacer todo con el ShowMessage() estándar por ejemplo, y encuentra mucho mas difícil hacer una forma completamente nueva por solo unos pocos mensajes. Ahora usted puede hacer una caja de mensaje que luzca grandiosa por aproximadamente 25 líneas de código! Creando su primer componente (en tiempo de ejecución!) ====================================================== La creación de un componente es fácil. Le mostraré el código ejemplo de crear un botón en tiempo de ejecución: Uses StdCtrls; // Recuerde!!! Procedure CreateButton; var NewButton : TButton; begin NewButton := TButton.create(self); with NewButton do begin Name := 'Button1'; Top := 30; Width := 100; Left := 5; Parent := self; Caption := 'Run-time button!'; end; end; ¡Eso es todo! Ahora, analicemos la parte 'difícil'. Primero 'usamos' la unidad StdCtrls, porque ésta es la unidad que contiene (entre otros) el componente TButton. Esta unidad es automáticamente incluida cuando arrastra un TButton a la forma. Entonces, le decimos a Delphi que NewButton es: un TButton. Luego creamos realmente el botón, usando TButton.Create(Self). Asignamos el resultado a NewButton, así que podemos ajustar los parámetros de nuestro botón mas tarde. Una vez hecho esto, le damos nombre y tamaño al botón. ¡Pero cuidado! Asegúrese de ajustar el parámetro Parent. Éste debe ser ajustado al TComponent en el que el nuevo componente será mostrado. Por ejemplo, cuando un TPanel es arrastrado a la forma, y la propiedad Parent es ajustada a Form1.Panel1, el botón esta "en" el panel. Asignando eventos ================= Ok, genial, obtuvimos un botón por nuestra propia cuenta, y podemos ajustar sus propiedades, pero cuando hacemos clic en él, no pasa nada. Por lo tanto tenemos que asignar el evento OnClick. Para hacer esto, debemos tener un procedimiento que pertenezca a la clase TForm. Extracto: type TForm1 = class(TForm) Panel1: TPanel; procedure FormShow(Sender: TObject); ---> procedure MyClick(Sender:TObject); private { Private declarations } public { Public declarations } end; Como puede ver, debemos asegurarnos que el procedimiento tenga la lista de parámetros correcta (en este caso: Sender: TObject). Simplemente, escribimos el nombre y los parámetros del procedimiento, como en el extracto anterior. Entonces, nos movemos abajo a un lugar libre justo antes del último "end." Allí, volvemos a escribir nuestro procedimiento, sólo que ahora con TForm1 adelante de él: procedure TForm1.MyClick(Sender:TObject); Además, nos aseguramos de escribir un "ShowMessage" o alguna cosa, debido a que Delphi borrará procedimientos "vacíos" cuando esté compilando. Ahora, tenemos nuestro procedimiento, pero aún tenemos que asignarlo al evento OnClick, Para hacer esto, regresamos al procedimiento donde el botón es creado y añadimos una sentencia debajo de 'Caption := ...': OnClick := MyClick; Ahora, compile su programa, y sea feliz! :) En el futuro ============ La mejor manera de aprender, es experimentar. Intente crear algún otro componente, como Panels y Memos. También puede navegar por la red y descargar algunos fuentes. Si tiene preguntas, siéntate libre de compromisos para enviarme un correo a <charl@atomasoft.com>. ________________________________________________________________________ 5. RUTINA PARA TRANSFORMAR UNA IMAGEN A ESCALA DE GRISES Por Lucas Martín <lucas @ menta.net> Coloca un botón (button1), una imagen (image1) y añade en el uses del formulario (form1) "jpeg". Copia la siguiente rutina en el OnClick del botón: procedure TForm1.Button1Click(Sender: TObject); procedure GrayScale(PICT: TPicture); const MaxPixelCount = 32768; type pRGBArray = ^TRGBArray; TRGBArray = ARRAY[0..MaxPixelCount-1] of TRGBTriple; var i, j, Colr : Integer; sl : pRGBArray; // Scanline bmp : TBitmap; begin bmp := TBitmap.Create; try bmp.PixelFormat := pf24bit; bmp.Width := PICT.Graphic.Width; bmp.Height := PICT.Graphic.Height; bmp.Canvas.Draw(0,0,PICT.Graphic); if bmp.PixelFormat <> pf24bit then begin // ShowMessage('Not a 24Bit color bitmap!'); Exit; end; for j:=0 to bmp.Height-1 do begin sl := bmp.ScanLine[j]; for i:=0 to bmp.Width-1 do begin Colr:=HiByte(sl[i].rgbtRed * 77 + sl[i].rgbtGreen * 151 + sl[i].rgbtBlue * 28); sl[i].rgbtRed := Colr; sl[i].rgbtGreen := Colr; sl[i].rgbtBlue := Colr; end; end; PICT.Assign(bmp); finally bmp.Free; end; end; begin GrayScale(Image1.Picture); end; Nota: Para cualquier bug u optimización: ----> <deepsoftquitaestodeaqui @ menta.net> ________________________________________________________________________ 6. FOROS Delphi ====== Foro abierto ------------ 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 Para suscribirte, también puedes hacerlo desde la web o por email: http://espanol.groups.yahoo.com/group/delphi-abierto/join delphi-abierto-subscribe@gruposyahoo.com Nivel Intermedio ---------------- Si sabes mucho de Delphi, pero aún te falta largo trecho para ser un gurú, tal vez prefieras participar en el foro para programadores en Delphi de nivel intermedio: http://espanol.groups.yahoo.com/group/delphi-intermedio Para suscribirte, también puedes hacerlo desde la web o por email: http://espanol.groups.yahoo.com/group/delphi-intermedio/join delphi-intermedio-subscribe@gruposyahoo.com Nivel Avanzado -------------- Si te crees un gurú, y quieres estar en un foro sólo para gurús, lo más probable es que en realidad no necesites estar en un foro, pero bueno, por si acaso, este es nuestro foro para programadores en Delphi de nivel avanzado: http://espanol.groups.yahoo.com/group/delphi-avanzado Para suscribirte, también puedes hacerlo desde la web o por email: http://espanol.groups.yahoo.com/group/delphi-avanzado/join delphi-avanzado-subscribe@yahoogroups.com Free Pascal =========== Nuestro foro para programadores en Free Pascal (freepascal.org) ya superó los 135 miembros y sigue creciendo: http://espanol.groups.yahoo.com/group/freepascal-es Suscripción: http://espanol.groups.yahoo.com/group/freepascal-es/join freepascal-es-subscribe@yahoogroups.com Grupo Kylix =========== El foro para usuarios de Borland Kylix ya alcanzó los 205 miembros: http://espanol.groups.yahoo.com/group/GrupoKylix Suscripción: http://espanol.groups.yahoo.com/group/GrupoKylix/join GrupoKylix-subscribe@yahoogroups.com Desarrolladores de 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 Ya somos más de 270 miembros en este foro. Suscripción: http://es.groups.yahoo.com/group/desarrolladores-software/join desarrolladores-software-subscribe@yahoogroups.com ________________________________________________________________________ 7. DELPHI EN LA RED Por Dave Murray Componentes, librerías y aplicaciones ===================================== Shareware/Comercial ------------------- * ElPack v3 - by EldoS (for Delphi/C++Builder and Kylix) A collection of 70+ VCL/CLX components that offer sophisticated replacements for all major Windows and Qt controls, extend functionality of existing VCL/CLX controls and introduce new features like Unicode, XP Themes and Qt Styles support and much more ... http://www.eldos.org/elpack/elpack.html * CoolControls v. 3.03b (for Delphi 2-6 and BCB 1-5) Award winning package of 60+ highly advanced components and classes. Covers system, GUI and database programming, and original components. Forms of any shape, SKINS and TRANSPARENCY for ALL controls and forms, buttons of various shapes, flat borders, animation, original controls, powerful list and comboboxes, 3D view for most controls with text, multiline string grids with custom colors and fonts for cells, scrolling text, system level components. http://www.cooldev.com/coolcontrols.html * CoolMenus v. 3.08 (for Delphi 2-6 and BCB 1-5) Award winning package that provides you with the way to create the most advanced Windows menus. CoolMenus, especially Multimedia edition has some unique features you will not find in any other menu related packages on the market. Native Delphi code, fast speed and helpful design windows are the reasons of CoolMenus popularity. http://www.cooldev.com/coolmenus.html * CoolHints2k version 1.01a (for Delphi 3-6 and BCB 3-5) With CoolHints2k you can create Office2000-like dialogs and hint system. The package contains all necessary controls and can be used to build ordinal dialogs and other purpose windows. Use Delphi's designer to build the forms and combine controls from the CoolHints2k package with any other VCL you have. http://www.cooldev.com/coolhints2k.html Freeware -------- * MyLittleBase v2.0 - by Anirom, FREEWARE with source (DELPHI/KYLIX) Database component using a flat file format based on csv text. Uses no library or link to any external server, the engine is entirely compiled into your code. New functions include: Excel export, ISAM import/export, sorting, seeking and minimal SQL implementation for queries. Works with Delphi, Kylix and C++ Builder. http://www.mylittlebase.org * Expanded Win32 API Translation Updated - by Marcel van Brakel Update of Project JEDI's full, expanded Win32 API translation. Includes .NET conversions. http://www.delphi-jedi.org/Jedi:APILIBRARY:13630 * TEZColor v1.0 - by Eric Z. Jordens, FREEWARE with source A component derived from TPaintBox to choose and edit a color like any other colorpicker. Besides standard RGB editing it also shows the HSV, HLS and Hex values for the given color. http://www.torry.net/vcl/graphics/other/ezcolour.zip * TmThumbs v1.1 - by Mats Asplund, FREEWARE with source A component that produces thumbnail images from jpeg image files. Two different image modes: Crop and Fill. Handles multiple sourcefiles. Fileprefix, fillcolor, height, width, zoom properties and OnImageCreate event. http://www.torry.net/vcl/graphics/other/mthumbs.zip * TKnob v0.5 - by S. Dianov, FREEWARE with source A component that looks like an audio fader. http://www.torry.net/vcl/misceff/other/sdknob.zip * BitButton v1.30 - Oliver Killguss, FREEWARE w. source (DELPHI/KYLIX) BitButton and Speedbutton based components which extends flat style like Office 97 and includes an automatic grayscale conversion of the image. Also converts glyph for enabled state. http://www.vclcomponents.com/download.asp?ID_COMPONENT=18927 * QDBNavPlus v2.0 - by F H Prieto, FREEWARE with source (DELPHI/KYLIX) Derived from DBNavigator, now you can add Label with a layout, choose a default Language and more. http://www.torry.net/db/visible/db_navigators/fqdbnavplus.zip http://www.torry.net/kylix/db/visual/qdbnavplus.zip * Direct MySQL Objects v1.0 - by C Nicola, FREEWARE w. source (D/KYLIX) Suite of objects to directly connect to MySql server without any aditional dlls. Main advantages are over 4x faster than MySql dll and lower memory footprint (10% less than MySql dll). http://sourceforge.net/projects/directsql * TRSDBEdit v1.0 - by Renato Soares,FREEWARE with source (DELPHI/KYLIX) This component publishes the EchoMode property, making it useful for a Password edit box. http://uk.torry.net/kylix/db/visual/qrsdbedit.zip * TyDecoder v0.1.0 - by Steve Blinch, FREEWARE w. source (DELPHI/KYLIX) A component to decode yEnc binary file attachments from newsgroups. http://code.blitzaffe.com/delphi.php * TyEncoder v0.1.0 - by Steve Blinch, FREEWARE w. source (DELPHI/KYLIX) Encodes binary files using the yEnc algorithm used in newsgroups. http://code.blitzaffe.com/delphi.php * Vortex IRC v1.1 - by Joepezt, FREEWARE with source (DELPHI/KYLIX) Open source IRC component. Requires Internet Component Suite by Francois Piette (see www.torry.net or www.vclcomponents.com). http://vortex.berzerk.net * TVHTMLExport v1.13 - O Killguss, FREEWARE with source (DELPHI/KYLIX) Exports tree from TTreeView into HTML file. Can auto generate links within nodes and produce title, header and footer. Select your own images for node's appearance. Images are copied to the destination path of the generated file. http://www.vclcomponents.com/download.asp?ID_COMPONENT=18951 * Password Protect Console v1.1 - by Uri Fridman, FREEWARE (KYLIX) A console password manager for Linux. Implements in the command line some of the functionality of a password protect GUI. The Source is available on request. http://www.torry.net/kylix/apps_klx_security.htm * ThinkSQL RDBMS for Windows and Linux ThinkSQL is a new relational database management system, designed for modern operating systems and hardware. The aim is to bring it as close as possible to full compliance with the ISO SQL standard. The server has been written entirely in Delphi/Kylix and includes the world's first native dbExpress driver, plus ODBC and JDBC drivers. http://www.thinksql.co.uk * TaoADODataSet Component Suite v2.12 - Aloha OI, FREEWARE with source A nearly full-featured TDataSet descendant for Delphi v3-5 and C++ Builder v3-4. Allows you to link standard data aware components to OLEDB databases such as Access, SQL Server and ODBC data sources bypassing the BDE. ADO can be obtained from Microsoft for free. http://www.alohaoi.com/Software/Products/aoado/default.htm * TAuditFileLog v1.40 - by Aloha OI, FREEWARE with source A Delphi v2-5 component designed to work the with the WinNT Security Event Log. When file auditing is enabled for a particular file, this component will catch any file open access and fire off an event. The event returns the filename, the NT user account name that accessed it and the name of the computer. http://www.alohaoi.com/Software/Products/audit/default.htm * Simple Counter v1.0 - by Jazarsoft, FREEWARE with source (KYLIX) A simple CGI text counter written in Kylix that can count pageview numbers for different pages. View totals directly from your browser. http://www.jazarsoft.com/software/view.php3?id=36 * Wizard v1.1 - by Jazarsoft, FREEWARE with source (KYLIX) Tried to design your own wizard? TWizard helps you integrate the 3 major components of a Wizard (TButton, TNotebook, and TImage). Also designs your wizard steps, giving each a separate side-image. http://www.torry.net/kylix/clx/comptools/jswizard.zip Artículos, trucos y consejos ============================ * Borland Will Push .NET Out Of Windows - By Alan Zeichick http://www.sdtimes.com/news/047/story1.htm * Delphi Database Programming Course - by Zarko Gajic Free online database programming course for beginner Delphi developers focused on ADO techniques. http://delphi.about.com/library/weekly/aa010101a.htm The final chapter has been added since the last issue: Chapter 23 "Deploying Delphi ADO database applications" explains how to make your Delphi ADO database application available to others, the final step is to successfully deploy it to the user's computer. http://delphi.about.com/library/weekly/aa021502a.htm * Creating Custom CLX Components - by Ray Konopka //www.borlandkorea.co.kr/conf2001/PROCEEDINGS/papers/3156/PAPER.HTML * Delphi ADO/DB : Real Problems - Real Solutions - by Zarko Gajic This penultimate chapter points to some great Forum threads initiated by this Course - discussions that solve problems in the field. http://delphi.about.com/library/weekly/aa022902a.htm * Tranlucent Windows with Win2k/XP & Delphi 5 - by Christian Blichmann How to develop applications using free-form forms with anti-aliasing and translucency using Delphi 5. http://www.delphi3000.com/articles/article_3007.asp * Registering an ActiveX for its class (CLSID) - by Bertrand Goetzmann How to get the IUnknown reference on a specific COM object's instance created by an application. Using the RegisterActiveObject function (Win32 API). http://www.delphi3000.com/articles/article_3010.asp * Building an Parser/Parsing Framework Part II - by Marc Hoffmann How to create a simple parsing framework to parse any kind of data? This part shows you how to create a real working DTD parser. http://www.delphi3000.com/articles/article_3011.asp * A background painter class - by César Nicolás Peña Núñez This class paints a background bitmap tiled, centered or stretched. http://www.delphi3000.com/articles/article_3016.asp * The OnLinkClick-Event of TWebBrowser - by Duncan Parsons The TWebBrowser-object is a great way to display offline html-files within your application. Sometimes it would be nice to react within your delphi-application when the user clicks on a link... http://www.delphi3000.com/articles/article_3017.asp * How to save the positions of TCoolBar bands - by Valery Goloshchapov How to easily store the layout (positions) of TCoolbar and TCoolband objects. http://www.delphi3000.com/articles/article_3018.asp * Custom Actions on WebBrowser.Document's OnClick Event - by Hans Gulö Using IE's Document Object Model from within TWebBowser to perform custom actions when a user clicks a link in the document. http://www.delphi3000.com/articles/article_3021.asp * A way to handle displaying screen cursors - by William Egge Setting a screen cursor and reverting back to a previous screen cursor using a stack. http://www.delphi3000.com/articles/article_3022.asp * Changinf DbNavigator's Icons - by Matheus Pecci Want to change the classic icons from dbnavigator? http://www.delphi3000.com/articles/article_3023.asp * Using miniLZO in Delphi - by Dan Strandberg How to use the miniLZO library written in ANSI C in your Delphi application without a dll. http://www.delphi3000.com/articles/article_3024.asp * Nibbles - A Game - by Vimil Saju This is the code for a game called nibbles. http://www.delphi3000.com/articles/article_3025.asp * This works: Save and Restore Coolbars - by Frank Heyne Save and restore Coolbars using an array which holds all settings. http://www.delphi3000.com/articles/article_3026.asp * Controling Winamp from a Dll or Application - by Johannes Fuglsang How to use the Winamp API. http://www.delphi3000.com/articles/article_3027.asp * Return identity id from insert_SQL - by chiefClaudio Hira How to obtain the value of the identity column in a table when inserting a record with an INSERT SQL statement. http://www.delphi3000.com/articles/article_3028.asp * Listing all Functions of a DLL File - by Matheus Pecci How to list all functios and procedures of a dll file? http://www.delphi3000.com/articles/article_3031.asp * How to write to an Access DB using ADO / SQL - by Michael Casse Read an MS-ACCESS Database using ADO, verify if it is an ACCESS MDB and write a Record to MS-ACCESS Database. http://www.swissdelphicenter.ch/torry/showcode.php?id=1007 * How to check if the recycle bin is empty? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1009 * How to run a console application and get its output? - by Superhausi http://www.swissdelphicenter.ch/torry/showcode.php?id=990 * How to get the used memory for a process? - by Evgeny V. Levashov (Works only on Windows NT systems - WinNT, Win2000, WinXP. http://www.swissdelphicenter.ch/torry/showcode.php?id=1010 * Listening to the Clipboard - by Zarko Gajic Expanding on Delphi's TClipboard class (Part 1). How to hook the clipboard notification system to get and respond to events when the clipboard changes using the Win API and messaging system. http://delphi.about.com/library/weekly/aa110700a.htm * Transparency in Delphi 6 - by Zarko Gajic One of the new features Delphi 6 introduced is the ability to create forms that are (semi) transparent. The TForm class supports layered forms with AlphaBlend, AlphaBlendValue, TransparentColor and TransparentColorValue properties. Has no effect prior to Windows 2k. http://delphi.about.com/library/weekly/aa022202a.htm * Windows API Error Handling: Part II - by Marcel van Brakel Concludes the series with a look at retrieving messages from a specific message DLL, setting the last-error code, error modes, and Delphi's approach to error handling. www.delphimag.com/features/2002/02/di200202mv_f/di200202mv_f.asp * Hot Spots : Part I - by Victor Hornback How to create hotspots, regions that detect MouseOver events, to make images behave like Web page hotspots or hotlinks. These regions can represent almost any shape imaginable and are easily created using Windows API functions. Part I shows how to create a hot-spot editor. www.delphimag.com/features/2002/02/di200202vh_f/di200202vh_f.asp * How to easily use HTML Help files in your programs - by Dave Murray Do you long to move from WinHelp to HTML Help in your programs? This unit converts all WinHelp calls to HTML Help enabling you to upgrade with the minimum of effort. http://www.delphi3000.com/articles/article_2994.asp * Building an Easy-to-Use Parsing Framework (Part I) - by Marc Hoffmann How to create a simple parsing framework to parse any kind of data? Our goal will be a class solution which helps up to parse any kind of data and store all information in an easy-to-access object model. http://www.delphi3000.com/articles/article_2995.asp * Initialize StringGrid from INI file - by Eber Irigoyen A function to initialize StringGrid headers, columns, widths, etc. http://www.delphi3000.com/articles/article_3001.asp * How to protect your software against piracy! - by Fernando Martins Useful discussion on software protection systems. (Read the comments) http://www.delphi3000.com/articles/article_3002.asp * Determening DirectX version installed on the system - by Uros Gaber How to determine if DirectX is installed and it's version. http://www.delphi3000.com/articles/article_3003.asp * Why use Packages? - by Max Kleiner Good article on the advantages of application design using packages. http://www.delphi3000.com/articles/article_3005.asp * How to control Excel with OLE? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=156 * How to determine the position of the taskbar? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=347 * How to list the exported functions of a DLL ? - by Colin Pringle http://www.swissdelphicenter.ch/torry/showcode.php?id=960 * How to create a sizable and none border style form? - by Gurkan ASLAN http://www.swissdelphicenter.ch/torry/showcode.php?id=984 * How to clear a varaible from RAM? - by Superhausi How to properly erase a variable so that its data no longer exists in memory. Very usefull for the temporary storage of passwords. http://www.swissdelphicenter.ch/torry/showcode.php?id=988 * How to format currency according to locale settings? - by Superhausi http://www.swissdelphicenter.ch/torry/showcode.php?id=989 * How to get the CPU ID from the registry? - by Eduardo Teixeira http://www.swissdelphicenter.ch/torry/showcode.php?id=994 * How to duplicate a Table? - by JodeQa http://www.swissdelphicenter.ch/torry/showcode.php?id=999 * How to convert a Bitmap to an Enhanced Metafile? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1000 * How to set the number of fixed columns in a TDBGrid? - by T Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1001 * How to compile Delphi Projects with a Batch file? - by Superhausi http://www.swissdelphicenter.ch/torry/showcode.php?id=1003 * How to control Powerpoint with OLE-Automation? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=1005 * Download the official patches for Kylix 1 now! - by John Kaster Patches are: "Debugger patch for Linux 2.4 kernel" and "dbExpress driver update for MySQL 3.23." http://community.borland.com/article/0,1410,28266,00.html * A WebSnap Online Survey: Part II - by Corbin Dunn Completing the WebSnap online survey by adding server-side scripting to the main page and more. //www.delphimag.com/features/2002/02/di200202cd_f/di200202cd_f.asp * RichEdit Print Preview - by Jochen Fromm Displaying a Print-Preview for a Richedit Control seems simple but is not so easy as MSDN Articles Q142320 + Q253262 show. To show a Print-Preview with correct Text-Heights and -Widths, you can draw the RichEdit-Control on a Metafile and print it to the Preview-Canvas. http://www.delphi3000.com/articles/article_2987.asp * Codeing Tip.. - by Derrick Nel How to handle dynamic object creation in a neat and effective way? Read the comments for an interesting discussion on programming style. http://www.delphi3000.com/articles/article_2988.asp * Prime numbers - by Upportune Malters Finding out if a given number is prime using an array of boolean. http://www.delphi3000.com/articles/article_2989.asp * Prime Number Class (Fast Access to Prime Numbers) - by Mike Heydon Following on from Article ID 2989, this class uses TBit which is more memory efficient than an array of boolean. This class can check if a number is a prime or obtain a list of prime numbers from x to y. http://www.delphi3000.com/articles/article_2990.asp * Loading any registered picture format into a stream - Howard Barlow TPicture can load any fileformat registered with it and save to a dfm file. But its generic stream methods are private. This code shows how to get access to these methods and store/load any registered TGraphic descendant to/from a stream or blobfield in a generic way. http://www.delphi3000.com/articles/article_2991.asp * How to read an Access DB using ADO? - by Michael Casse http://www.swissdelphicenter.ch/torry/showcode.php?id=974 * How to create a transparent TForm? - by Mohammad Khorsandy http://www.swissdelphicenter.ch/torry/showcode.php?id=982 * How to get the word under mouse cursor in a TRichEdit? - by T Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=979 * How to move menu items at runtime? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=957 * Dynamic packages in Delphi - by Vino Rodrigues Design-time packages simplify the tasks of distributing + installing custom components. By compiling reused code into runtime packages, which are optional, you can share it among applications. Packages are even better when they are used dynamically. They offer a modular library approach to developing applications. At runtime those modules may become an optional part of your application. This paper shows how to create and use dynamic packages in Delphi. http://community.borland.com/article/0,1410,27178,00.html * A WebSnap Online Survey: Part I - by Corbin Dunn First of a two-part article that shows how to create an online survey using the new WebSnap capabilities of Delphi 6 Enterprise. Introduces WebSnap by comparing it to Web Broker in previous versions of Delphi, explains how to build the sample database and begins to construct the survey application itself. www.delphimag.com/features/2002/01/di200201cd_f/di200201cd_f.asp * The BLOB: Working with InterBase's Binary Data Type - by Bill Todd One of the more useful features of most modern databases is their ability to store binary data - data of any type, format or size. It's useful because it's versatile; you can use a binary field to hold anything from a Word document to an MP3 file. www.delphimag.com/features/2002/01/di200201bt_f/di200201bt_f.asp * TASPObject - ASP programming with Delphi Part 2 - by Curtis W. Socha Now that we know a little bit more about how the TASPObject works we are going to examine a skeletal structure for building a website that is extremely scalable. It is completely possible to use this object as the single entry point for all users. http://delphi.about.com/library/bluc/text/uc010802a.htm * Get a process by executable path + read its memory space - by pic sub Enables you to look into another process's address space. Uses mainly CreateToolhelp32Snapshot, OpenProcess and ReadProcessMemory. http://www.delphi3000.com/articles/article_2965.asp * Component Serialization - by Yoav Abrahami Serialization is the process of saving a component's state to a file using streams. Delphi provides an infrastructure for serialization of components but how do we utilize this infrastructure to the fullest and what are its limitations? http://www.delphi3000.com/articles/article_2969.asp * Determine highest DAO version installed - by Mike Heydon A function to determine the highest version of DAO installed. http://www.delphi3000.com/articles/article_2970.asp * Using XP visual style without components - by mega warrior How to implement WinXP visual styles (themes) in Delphi without using any components via MS Common Controls Livrary v6. http://www.delphi3000.com/articles/article_2971.asp * Getting Detailled Printer Information - by Geers Christophe How to retrieve detailed information on the installed printers on your computer using winspool. http://www.delphi3000.com/articles/article_2974.asp * Query result into a string list - by Fernando Martins How to load the result of a query into a string list. http://www.delphi3000.com/articles/article_2975.asp * COM Activation - by Alessandro Federici Did you ever wonder how COM obejcts are created? Did you know you are not the one that creates them? Read more about COM activation. http://www.delphi3000.com/articles/article_2976.asp * Memory shared in a Dynamic-Link Library - by Bertrand Goetzmann How can several processes share memory to cooperate? This unit shows how use a file-mapping object to set up memory that can be shared by processes that load the DLL. http://www.delphi3000.com/articles/article_2979.asp * Fuzzy Matching Strings - by duncan parsons How to get an idea of how closely 2 strings match. http://www.delphi3000.com/articles/article_2981.asp * Towards a more accurate sort order - by Duncan Parsons Sorting Addresses is a pain at the best of times, especially when a client supplies bad data. This tip attempts to resolve this issue. http://www.delphi3000.com/articles/article_2982.asp * Towards a more accurate sort order in MSSQL7 - by Duncan Parsons Sorting Addresses is a pain at the best of times, especially when a client supplies bad data. This tip attempts to resolve this issue for MSSQL Server. This is a T-SQL version of article 2982. http://www.delphi3000.com/articles/article_2983.asp * Simple Query Builder using ADO Components - by S S B M PUVANANTHIRAN Writing a simple query builder using ADO Components. http://www.delphi3000.com/articles/article_2984.asp * SOAP : The World of Services - by Romeo Lefter Understanding and creating Web services with Delphi. http://www.delphi3000.com/articles/article_2985.asp * How to check if a PopUp Menu is open? - by oLeOlE http://www.swissdelphicenter.ch/torry/showcode.php?id=958 * How to rearrange the tabs in a TPageControl using drag 'n drop? http://www.swissdelphicenter.ch/torry/showcode.php?id=963 * How to obtain a list of loaded drivers under Windows NT? - by T Stutz This code takes advantage of the undocumented API call NtQuerySystemInformation to obtain a list of loaded drivers. http://www.swissdelphicenter.ch/torry/showcode.php?id=961 * How to get the CPU usage in percent on WinNT/2000/XP? - by T Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=969 * How to zoom a Canvas? - by Marc Dürst http://www.swissdelphicenter.ch/torry/showcode.php?id=968 * Listing information about users currently logged on to a workstation By Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=966 * How to check if a TMainMenu is dropped down or not? - by oLeOlE http://www.swissdelphicenter.ch/torry/showcode.php?id=956 * How to retrieve a shortcut's link information? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=970 * Enable/Disable Fast Task Switching under WinXP? - by Thomas Stutz http://www.swissdelphicenter.ch/torry/showcode.php?id=972 * Scaning an image directly into your application - by Ronald Rethfeldt http://www.swissdelphicenter.ch/torry/showcode.php?id=971 Tutoriales ========== * Comparing the Windows 98 and the Windows NT registries - by B. Posey Critical differences exist between the Win95/98/ME and WinNT/2000/XP registries. This article examines those differences and highlights the registries' similarities as well. http://www.techrepublic.com/ article_guest.jhtml?id=r00320010319pos01.htm&fromtm=e006 * Zen Source Library Tutorials Tutorial subjects include TTreeView, COM, OLE structured storage, OLE drag + drop, scripting + more. http://users.iafrica.com/d/da/dart/zen/zen.html * VB to Delphi Tutorial http://www.cyber-matrix.com/vb2delphi.html * Visual Basic to Delphi Conversion Resources http://www.cyber.com.au/misc/vb2d.htm * The Delphi Educator - by Curtis W. Socha Dedicated to teaching some of the more complicated aspects of programming. COM, COM+, DCOM, ASP, Web Servies & Graphics programming are covered. Includes a section dedicated to providing solutions to errors that occur when dealing with COM and it's evil mutant children DCOM and COM+. Also Web Service problems and some solutions. http://absolute-research.com/IISSamples/Default/welcome.htm * Fine-tune WHERE clauses in SQL - by Jeff Davis The secret to creating powerful SELECT statements in SQL is writing efficient WHERE clauses. This turorial discusses how you can bypass open-ended searches by using some advanced tools that will precisely locate the information you need. http://www.techrepublic.com/ article_guest.jhtml?id=r00320020108jed01.htm&fromtm=e003 Otros enlaces ============= * DanceMammal.com Delphi Hints and Tips site, thousands of hints and tips. http://www.dancemammal.com * FreeVCS A freeware source version control and project management system. FreeVCS can be used in local, LAN, WAN, Internet or mixed environments. You can choose a Delphi 4-6 IDE expert or a language independent standalone client. Supported backend databases include DBISAM 2.x, Interbase 5/6, Oracle 7/8, MSSQL 7/2000 & Informix. http://www.thensle.de/index.htm (freevcs@thensle.de) * Quake 2 - Visual C to Delphi Conversion A site dedicated to converting the original Quake2 (version 3.21) Visual C source to Delphi. The project is open to anyone who wishes to participate. http://www.sulaco.co.za/quake2/ * Cetus Links: Delphi - by Jon Perry Huge list of online resources for Delphi from newsgroups and tips sites to components and tools libraries. http://www.cetus-links.org/oo_delphi.html * Trucomania Delphi Tips site in English and Spanish. http://www.q3.nu/trucomania/ * InterBase 6.5: XML Support and a Whole Lot More - by Bill Todd The lowdown on InterBase 6.5, which offers 64-bit file I/O, improved cache management, metadata security, the ROWS clause, and XML export for easy integration with Web apps. Includeds a sample project. www.delphimag.com/features/2002/02/di200202bt_f/di200202bt_f.asp * O'Reilly XML.com All things XML, although no Delphi specific info. Including: news, tutorials, book excerpts, reviews, buyer's guides and an event diary. http://www.xml.com * Workspace 3D - by Ghia Renaud A new GUI written in Delphi, entirely in 3D. The concept is a world with several rooms, each corresponds to a task - Internet room, word processing room, music room, etc. (English and French) http://workspace3d.ath.cx/Workspace3D.htm ________________________________________________________________________ TÚ PUEDES AYUDARNOS Necesitamos tu ayuda para que este boletín pueda continuar y crecer. ¡Contribuye! ============ Si has desarrollado alguna rutina interesante, encontrado una solución a un problema, etc., por favor escríbenos para que evaluemos la inclusión de tu material en el boletín. POR FAVOR no nos envíes elementos compilados, y POR FAVOR no nos envíes material que no sea de tu autoría. Si has encontrado algo interesante en la red, POR FAVOR limítate a enviarnos el enlace. ¡Divulga! ========= La forma más sencilla en que puedes difundir la existencia de este boletín es votándonos en alguno de estos rankings para ayudar a darle más visibilidad a nuestro sitio web y aumentar así el número de suscripciones, que esperamos que en el futuro se traduzca en un aumento en la cantidad de colaboraciones de contenido para hacer de ésta, una publicación más útil para los programadores en Delphi: 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 Son sólo unos segundos para ti que REALMENTE significan mucho para nosotros. También puedes ayudarnos divulgando la existencia de este boletín entre tus colegas pasándoles este enlace: http://www.latiumsoftware.com/es/pascal/index.php Confiamos en poder llegar a los 10.000 suscriptores este año, y agrade- ceremos toda la ayuda que puedas brindarnos para alcanzar ese objetivo. ________________________________________________________________________ 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/p0032.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) 2002 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!






