Boletín Pascal #4
Los ejemplos completos de código fuente de este número están disponibles para descargar.
![]() |
![]() |
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 eds2004 @ 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. 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/descarga/p0004.zip ________________________________________________________________________ 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 http://personal.redestb.es/revueltaroche/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) http://www.lawebdelprogramador.com/cursos/delphi.html * Curso de Borland Delphi http://www.arrakis.es/~ppriego/delphi/delphi.htm * Cursillo de Delphi http://www.arrakis.es/~eb1fts/delphi/delphi.htm * Un programa de dibujo http://www.arrakis.es/~eb1fts/delphi/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://home.planet.nl/~beenh012/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/descarga/p0004.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) 2000 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!






