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-2006 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://elpack.findmysoft.com/
* 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/cd_products.html#CoolControls
* 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/cd_products.html#CoolMenusPro
* 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/cd_products.html#CoolHints2k
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/apilibrary.html
* 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/ezcolor.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/fpqdbnavplus.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://www.torry.net/quicksearchd.php?String=TRSDBEdit&Title=Yes
* 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/security/passprotcbin.zip
* 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/content/article.aspx?ArticleID=26301
* 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://articles.techrepublic.com.com/5100-10878_11-1047173.html
* 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://articles.techrepublic.com.com/5100-10878_11-1043980.html
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.fredshack.com/docs/freevcs.html (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.programmingpages.com/?r=latiumsoftwarecomenpascal
http://top100borland.com/in.php?who=20
http://www.lawebdelprogramador.com/buscar/votar.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/es/file.php?id=p32
________________________________________________________________________
Página principal: http://www.latiumsoftware.com/es/pascal/index.php
Página del grupo: http://espanol.groups.yahoo.com/group/boletin-pascal/
Para suscribirse / apuntarse: boletin-pascal-subscribe@gruposyahoo.com
Para cancelar / removerse: boletin-pascal-unsubscribe@gruposyahoo.com
Para reportar problemas con la suscripción: eds2008 @ latiumsoftware.com
________________________________________________________________________
Este boletín se provee "TAL Y COMO ESTA", sin garantía de ninguna clase.
Su uso implica la aceptación de nuestros términos de licencia y de la
ausencia de garantía que puedes leer en nuestro sitio web. Allí también
encontrarás una nota sobre marcas registradas. Te animamos a que redis-
tribuyas este boletín, siempre y cuando lo hagas en forma completa
(incluyendo la información de copyright), sin modificaciones y de manera
gratuita. Los artículos son copyright de sus respectivos autores y se
reproducen aquí con el permiso de los mismos.
________________________________________________________________________
Latium Software http://www.latiumsoftware.com/es/index.php
Copyright (c) 2002 por Ernesto De Spirito. Todos los derechos reservados
________________________________________________________________________
|