Boletín Pascal #4
INDICE
1. UNAS PALABRAS DEL EDITOR
2. OBTENIENDO EL ICONO DE UNA APLICACION O DOCUMENTO
ExtractAssociatedIcon
BUSCADOR DE ARCHIVOS: Agregando iconos
3. FE DE ERRATAS
4. DETERMINANDO SI HAY UNA CONEXION A INTERNET
5. TUTORIALES DE DELPHI
________________________________________________________________________
1. UNAS PALABRAS DEL EDITOR
Me complace anunciarles que pronto tendremos nuestro propio dominio en
Internet y si todo sale bien estaremos mudados a nuestro nuevo sitio
para la semana próxima. Nos hacemos comerciales, y eso significa que
habrá unos avisos publicitarios en nuestras páginas web para ayudar a
pagar las cuentas, y probablemente en el futuro tendremos que incluir
una pequeña publicidad en este newsletter, pero trataremos de mantenerlo
libre de avisos comerciales tanto tiempo como nos sea posible.
Saludos,
Ernesto De Spirito
eds2008 @ 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. OBTENIENDO EL ICONO DE UNA APLICACION O DOCUMENTO
ExtractAssociatedIcon
=====================
Para obtener el icono de una aplicación o documento podemos usar esta
función de la API de Windows declarada en la unidad ShellAPI:
function ExtractAssociatedIcon(hInst: HINST; lpIconPath: PChar;
var lpiIcon: Word): HICON; stdcall;
hInst: Es el manejador de la aplicación. Este valor está contenido en la
variable predefinida HInstance.
lpIconPath: Un puntero a un buffer de caracteres que debería contener
una cadena terminada en nulo con el nombre y camino del programa,
biblioteca (DLL) o documento. Si es un documento, la función
pondrá allí el nombre y camino completo de la aplicación asociada
de la que se extrae el icono, así que debería asignar un buffer lo
suficientemente grande.
lpiIcon: El indice del icono (el primer icono en el archivo tiene índice
0). Si lpIconPath especifica un documento, entonces la función
establece lpiIcon (por eso se pasa por referencia) con el índice
de la posición del verdadero icono extraido de la aplicación
asociada (definido en la asociación de archivos).
Valor devuelto:
Si la función falla, devuelve 0. Si tiene éxito, devuelve un manejador
de icono que es un valor entero que Windows usa para identificar el
recurso asignado. No es necesario llamar a la API DestroyIcon para
liberar el icono puesto que será liberado automáticamente cuando la
aplicación finalice, aunque puede hacerlo si quiere.
Ahora bien, ¿que hacemos con el manejador de icono? Normalmente lo que
queremos es un icono, más precisamente una instancia de la clase TIcon.
Todo lo que tenemos que hacer es crear un objeto TIcon y asignar este
manejador en su propiedad Handle. Si luego le asignamos otro valor a la
propiedad Handle, el icono anterior será liberado automáticamente. Lo
mismo ocurre si se libera el objeto TIcon.
BUSCADOR DE ARCHIVOS: Agregando iconos
======================================
Continuando el trabajo con la aplicación Buscador de Archivos que
utilizamos para mostrar algunos trucos de programación, esta vez le
agregaremos los iconos de los archivos en el control ListView.
Lo primero que deberemos hacer es colocar una ImageList en el formulario
(normalmente se encuentra en la paleta Win32) y luego la asignaremos a
la propiedad ListView1 de SmallImages.
Ahora es tiempo de agregar código en el método AddFileName de TThread1.
Necesitaremos cuatro variables más:
Icon: TIcon;
IconIndex: word;
Buffer: array[0..2048] of char;
IconHandle: HIcon;
Y luego agregamos el siguiente código (por ejemplo justo después de la
línea "ListItem.Caption := FileName;"):
StrCopy(@Buffer, PChar(Location + FileName));
IconIndex := 0;
IconHandle := ExtractAssociatedIcon(HInstance, Buffer, IconIndex);
if IconHandle <> 0 then begin
Icon := TIcon.Create;
Icon.Handle := IconHandle;
ListItem.ImageIndex := OwnerForm.ImageList1.AddIcon(Icon);
Icon.Free;
end;
Finalmente vaciamos la ImageList justo después de vaciar el ListView en
el método Initialize de TThread1, así no crece "indefinidamente":
OwnerForm.ImageList1.Clear;
Ahora puede probar el ejemplo para verlo funcionar. Como siempre, el
código fuente completo está disponible gratuitamente en nuestro sitio
web: http://www.latiumsoftware.com/es/file.php?id=p04
________________________________________________________________________
3. FE DE ERRATAS
En el número pasado mostramos como tomar coordenadas relativas a un
control y hacerlas relativas a la pantalla sumándole la posicion del
formulurio y la posición del control dentro del formulario. Esto no toma
en cuenta correctamente los bordes del formulario y la barra de título
del formulario, y si el control estuviera dentro de otro contenedor
tendríamos que sumarle también sus coordenadas...
La forma fácil es usar la propiedad ClientOrigin que poseen todos los
descendientes de TControl y así olvidarnos del asunto. Por ejemplo, en
nuestro procedimiento ListView1MouseDown, en vez de
PopupMenu1.Popup(
Left + ListView1.Left + X + 5,
Top + ListView1.Top + Y + 20);
deberíamos usar
PopupMenu1.Popup(
ListView1.ClientOrigin.X + X,
ListView1.ClientOrigin.Y + Y);
________________________________________________________________________
4. DETERMINANDO SI HAY UNA CONEXION A INTERNET
Es fácil saber si está conectado a la red. Básicamente todo lo que tiene
que hacer es chequear el primer byte de datos bajo el siguiente valor de
clave en el Registro de Windows:
+ HKEY_LOCAL_MACHINE
+ System
+ CurrentControlSet
+ Services
+ RemoteAccess
--> Remote Connection
Este elemento de datos consiste de cuatro bytes, así que usaremos
ReadBinaryData en vez del método ReadString que usáramos cuando dimos
una introducción al Registro de Windows en el segundo número del
antiguo Delphi Newsletter. Si el primero de estos bytes es igual a 1
está conectado a la red; de lo contrario no (debería ser 0).
La siguiente función devuelve True si está conectado a la red:
uses Registry, WinSock;
function InternetConnection: boolean;
var
Reg: TRegistry;
RemoteConnection: array [0..3] of byte;
Error: boolean;
HostName: array[0..63] of char;
WSData: TWSAData;
begin
Result := False;
Error := False;
Reg := nil;
try
Reg := TRegistry.Create(KEY_QUERY_VALUE);
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKeyReadOnly('\System\CurrentControlSet\Services\'
+ 'RemoteAccess') then begin
try
Reg.ReadBinaryData('Remote Connection', RemoteConnection,
SizeOf(RemoteConnection));
if RemoteConnection[0] = 1 then Result := True;
except
Error := True;
end;
Reg.CloseKey;
end;
except
Error := True;
end;
Reg.Free;
if Error then
// Prueba otra forma de averiguar si hay una conexión
if WSAStartup($200, WSData) = 0 then begin
GetHostName(HostName, SizeOf(HostName));
if GetHostByName(HostName) <> nil then Result := True;
WSACleanup;
end;
end;
Si ocurre un error al acceder al Registro, la función intenta una forma
alternativa de detectar una conexión a Internet usando las API WinSock.
WSAStartup inicia el servicio de Windows Sockets y en este caso solicita
hasta la versión 2.0 si es posible. WSData es un registro donde esta
función pondrá cierta información acerca de la DLL de Windows Sockets.
Si WSAStartup devuelve 0 (significando que ha tenido éxito) llamamos a
GetHostName para obtener el nombre de nuestra computadora, que usamos
como parámetro para llamar a GetHostByName que a su vez devuelve un
puntero a un registro con información acerca de la/s direcciones del
host, o Nil si no hay conexión, así que usamos este valor para
determinar si hay una conexión. Una vez que hemos terminado de usar los
Windows Sockets debemos cerrar la sesión llamando a WSACleanup.
________________________________________________________________________
5. TUTORIALES DE DELPHI
Una de las cosas sobre las que más nos preguntan es información acerca
de tutoriales acerca de programación en Delphi, así que aquí hay unos
pocos vínculos en español:
* Curso de creación de componentes en Delphi
publispain.com/supertutoriales/programacion/delphi/cursos/4/ccind.htm
Se puede bajar en formato ZIP
http://personal.redestb.es/revueltaroche/curso1-12.zip
* Aulaware: Tutoriales de programación y fuentes de programas
http://leo.worldonline.es/acanudas/
* Curso de Delphi 3 (8 Capítulos para bajar en formato ZIP)
lawebdelprogramador.com/cursos/enlace.php?idp=278&id=23&texto=Delphi
* Curso de Borland Delphi
http://www.arrakis.es/~ppriego/delphi/delphi.htm
* Cursillo de Delphi
http://www.jorgeturiel.arrakis.es/cursillo/contenido.htm
Descargas: http://www.jorgeturiel.arrakis.es/descarga.htm
* Un programa de dibujo
http://www.hormiga.org/tutoriales/programacion/delphi/cursos/3/dibujo.htm
* Guía Delphi en Español
http://members.xoom.com/Super_Zorro/index.htm
Y aquí tenemos otros en inglés:
* Astentech Delphi Tutorial List
http://www.astentech.com/tutorials/Delphi.html
* Delphi Tutorial
http://privat.schlund.de/b/bossung/delphi/tutorial_multipage.html
* The Software Developers Pages
http://www.beensoft.nl/sdp/
* Delphi and Pascal programming tutorials
http://ourworld.compuserve.com/homepages/TK_Boyd/Tut.htm
* DelphiLand: programming courses, tips, sources, utilities
http://www.festra.com/
* Frank's Delphi Lessons
http://www.svn.net/ffortino/
________________________________________________________________________
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=p04
________________________________________________________________________
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) 2000 por Ernesto De Spirito. Todos los derechos reservados
________________________________________________________________________
|