0% encontró este documento útil (0 votos)
213 vistas5 páginas

Trucos de Programacion Con Delphi

Cargado por

kikerick
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
213 vistas5 páginas

Trucos de Programacion Con Delphi

Cargado por

kikerick
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

Trucos de programacin en Delphi

Por Julio Mateos


Yo suelo comparar la programacin con las artes marciales. La programacin es tcnica, pero tambin tiene algo de arte. Aunque podamos escribir mil y un programas para realizar la misma tarea siempre podremos encontrar una rutina a la que definimos como ms elegante que las dems. Y como las artes marciales, por mucho que aprendamos, siempre queda algo, una bsqueda continua de nuevos mtodos, rutinas, tcnicas, etc. que nos hagan mejorar ms en nuestro trabajo y sentirnos satisfechos de nuestra programacin. Intentando que ese cdigo que escribimos, no sea la aplicacin ms o menos eficiente de un algoritmo, sino que tenga ese toque que relacionamos con el arte de la programacin. Cdigos de otras personas, que se pasean por CDs, Internet, etc. nos puede hacer aprender mucho. Tcnicas no documentadas de un compilador, rutinas que ni sabamos que existan, cosas que no estn en los manuales, etc. Siempre hay algo que nos puede interesar. Vamos a intentar en este artculo presentar algunos de estos pequeos (por extensin, no por cualidades) trucos y tcnicas que seguro nos interesarn a todos.

1. Cmo detectar una unidad de CD-ROM


Pretendemos con esta rutina verificar si una unidad de disco es un CD-ROM o no:

Function Var

IsCD(Disco : Char):BOOLEAN;

CDR : string; cnt : byte; Bx,cx : word; Procedure CDR_GET_DRIVE_COUNT (var COUNT, FIRST: word); assembler; asm mov xor int les mov les ax, 1500h bx, bx $2f di, COUNT es:[di], bx di, FIRST

{CDROM_Interrupt}

mov es:[di], cx end; begin IsCD := false; CDR := ''; CDR_GET_DRIVE_COUNT(bx,cx); if BX > 0 then for cnt := 0 to (bx-1) do CDR := CDR + char(Cx + Byte('A') + cnt); IsCD := (Pos(upcase(Disco),CDR) > 0); end;

1
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS

2. Cmo detectar un cambio de CD en la unidad


Podemos escribir una funcin que nos devuelva el nmero de serie de un disco CD introducido en la unidad. Si cambiamos el CD de la unidad, al volver a llamar a la funcin podemos comprobar si ha variado y saber as si se ha producido el cambio.

function GetDiskVolSerialID(cDriveName : char ) : DWord; var dwTemp1, dwTemp2 : DWord; begin GetVolumeInformation(PChar( cDriveName + ':\' ),Nil,0,@Result,dwTemp2, dwTemp2,Nil,0); end;

3. Obtener ms memoria para la ejecucin de programas


Cuando realizamos una aplicacin en Delphi, por pequea que sea siempre ocupa al menos 1 Mb de memoria RAM en el soporte de OLE. Si no vamos a utilizar esta caracterstica en nuestro programa podemos usar:
FreeLibrary(GetModuleHandle('OleAut32'));

Esto liberar de la memoria OLEAUT32.DLL y OLE32.DLL, lo que nos proporcionar 1 Mb de memoria ms para nosotros.

4. Manejo de regiones HotSpot


Unos artculos atrs estuvimos viendo la realizacin de aplicaciones multimedia bajo Visual Basic y comentamos el tratamiento de zonas sensibles en pantalla conocidas como HotSpot. Lo expuesto en ese artculo es completamente aplicable a Delphi. Sin embargo, aqu tenemos una nueva tcnica que se presenta mejor. Para ello usaremos el API de Windows. Comenzaremos definiendo una variable del tipo HRgn. La llamaremos MiHS:

unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs;

type TForm1 = class(TForm) private public end;

2
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS

var Form1: TForm1; MiHS: HRgn; implementation {$R *.DFM}

Ahora en el evento FormCreate crearemos la regin como sigue:

procedure TForm1.FormCreate(Sender: TObject); Var Points : Array[0..4] of TPoint; {Se necesita para llamar al API} begin Points[0].X Points[1].X Points[2].X Points[3].X Points[4].X := := := := := 10; 50; 70; 60; 90; Points[0].Y Points[1].Y Points[2].Y Points[3].Y Points[4].Y := := := := := 10; 10; 100; 150; 110;

MiHS := CreatePolygonRgn(Points,5,Winding); end;

No slo podemos crear regiones con CreatePolygonRgn, podemos usar tambin:

CreateEllipticRgn CreatePolygonRgn CreateRectRgn CreateRoundRectRgn

CreateEllipticRgnIndirect CreatePolyPolygonRgn CreateRectRgnIndirect

Puede ser que deseemos mostrar esta regin en pantalla. Podemos hacerlo con:

TForm1.FormPaint(Sender: TObject); Var B : Boolean; begin Canvas.Brush.Color := clRed; B := PaintRgn(Canvas.Handle, MiHS); end;

La funcin PaintRgn pinta la regin con el color de brocha actual, en este caso rojo. Pero la misin de una regin HotSpot no es pintarse, sino poder determinar si el cursor se encuentra sobre la misma o no, lo que podemos hacer mediante la funcin PtInRegion.

3
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin If PtInRegion(MiHS,X,Y) then InvertRgn(Canvas.Handle,MiHS); end;

La funcin comprueba si las coordenadas X e Y del ratn se encuentran sobre la regin, en este caso hemos decidido hacer que se invierta el color de la regin para mostrarla por pantalla. Por ltimo:

procedure TForm1.FormDestroy(Sender: TObject); begin DeleteObject(MiHS); end;

No hay que olvidar liberar el espacio usado por el HotSpot. Sino Windows no lo liberar hasta que reiniciemos el sistema.

5. Modificar el aviso de error crtico en una aplicacin


A veces puede ser necesario que nuestra aplicacin no muestre la ocurrencia de un error crtico del sistema. Como, por ejemplo, al verificar si existe un disco introducido en la unidad A:, esto podemos hacerlo como sigue:

var wOldErrorMode : Word; begin {Mediante SetErrorMode decimos a Windows que los errores crticos } wOldErrorMode :=SetErrorMode (SEM_FAILCRITICALERRORS ); try { aqu va el cdigo que podra generar un error crtico } finally { volver al estado previo de error } SetErrorMode( wOldErrorMode ); end; end; ignore

4
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS

6. Nmero de colores establecidos en nuestro sistema


En un momento determinado puede ser necesario conocer si nuestra aplicacin podr manejar 16, 256, 32768, 16777216 colores. La siguiente funcin nos devuelve la cantidad establecida en el sistema.

function GetColorsCount : integer; var h : hDC; begin Result := 0; try h:= GetDC( 0 ); Result :=1 shl ( GetDeviceCaps( h, PLANES ) * GetDeviceCaps( h, BITSPIXEL ) ); finally ReleaseDC( 0, h ); end; end;

7. Aadir cursores animados a nuestros programas


Desde la aparicin de Windows 95 y Windows NT el uso de cursores animados se ha vuelto habitual en muchos programas. Supongamos que tenemos el cursor C:\WINDOWS\CURSORS\MANO.ANI, para usarlo slo tendremos que hacer:

const { Definimos unas constantes para el uso del cursor, si tenemos ms seguiremos con ID2, ID3, etc. } cnCursorID1 = 1; begin { Procedemos a cargarlo } Screen.Cursors[ cnCursorID1]:=LoadCursorFromFile('c:\windows\cursors\mano.ani'); {Para usarlo} Cursor := cnCursorID1; end;

Cmo nota MUY IMPORTANTE debemos recordar que el acceso a disco de Windows debe estar establecido en modo de 32 bits. Esto es as por la forma especial que tiene Windows de tratar los cursores animados. En caso contrario veremos el cursor por pantalla pero sin animacin. Y como los presentados existen multitud de pequeos trucos y tcnicas que hoy en da donde mejor buscarlos es en Internet, en diferentes Webs y grupos de noticias. Espero que le sean de utilidad.

5
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS

También podría gustarte