Trucos de Programacion Con Delphi
Trucos de Programacion Con Delphi
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
function GetDiskVolSerialID(cDriveName : char ) : DWord; var dwTemp1, dwTemp2 : DWord; begin GetVolumeInformation(PChar( cDriveName + ':\' ),Nil,0,@Result,dwTemp2, dwTemp2,Nil,0); end;
Esto liberar de la memoria OLEAUT32.DLL y OLE32.DLL, lo que nos proporcionar 1 Mb de memoria ms para nosotros.
unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs;
2
Algoritmo. La revista para el programador de sistemas de bases de datos. http://www.eidos.es - Grupo EIDOS
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;
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:
No hay que olvidar liberar el espacio usado por el HotSpot. Sino Windows no lo liberar hasta que reiniciemos el sistema.
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
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;
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