Bildiğiniz gibi Delphi’de API fonksiyonlarını kullanmak son derece kolaydır. Çünkü Delphi ile gelen Windows ve ShellApi gibi bir kaç Unit sayesinde Api fonksiyonlarını Delphi fonksiyonuymuş gibi kullanmak mümkün olmaktadır.
Bu makelede Delphi’nin API fonksiyonlarının kullanımını kolaylaştıran Unit’lerinden yararlanmadan nasıl kullanılabileceğini GlobalMemoryStatus() fonksiyonu üzerinde anlatmayı deneyeceğim. Delphi projelerinde Windows’un GlobalMemoryStatus() fonksiyonundan yararlanıp kullanılan bilgisayarın belleği hakkında bilgi edinebilirsiniz.
Tahmin edebileceğiniz gibi Windows’un API fonksiyonları C dili ile yazılmıştır. Bu nedenle bu fonksiyonları Turbo Delphi projesi dahilinde kullanabilmek için Delphi’ye uyarlamak gerekmektedir. Borland programcıların API fonksiyonlarını kolay kullanabilmesini sağlamak birkaç Unit hazırlamıştır. Windows adlı Unit bunlardan birisidir. Windows.pas adlı kod dosyasında yüzlerce API fonksiyonu hakkında bilgi bulabilirsiniz. Aşağıda verdiğim satırı Windows.pas dosyasından aldım.
[color=blue]procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); stdcall;[/color]
Verilen satırdan tespit edebileceğiniz gibi Windows’un GlobalMemoryStatus fonksiyonu TMemoryStatus tipinde bir parametreye sahiptir. TMemoryStatus adı verilen bu yapının orijinal halini aşağıda görebilirsiniz.
typedef struct _MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORD dwTotalPhys;
DWORD dwAvailPhys;
DWORD dwTotalPageFile;
DWORD dwAvailPageFile;
DWORD dwTotalVirtual;
DWORD dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
Delphi projelerinde Windows’un GlobalMemoryStatus fonksiyonunu kullanabilmek için bu yapının Delphi’ye dönüştürülmesi gerekir. Başka bir deyişle C’de Struct olarak yapılan tanımlananın Delphi’de Record olarak yapılması gerekmektedir. Bu hazırlık Delphi ile gelen Windows.pas adlı Unit’te yapılmış olduğu için sizler GlobalMemoryStatus fonksiyonun gerek duyduğu tipi hazırlamak zorunda değilsiniz.
type
PMemoryStatus = ^TMemoryStatus;
_MEMORYSTATUS = record
dwLength: DWORD;
dwMemoryLoad: DWORD;
dwTotalPhys: DWORD;
dwAvailPhys: DWORD;
dwTotalPageFile: DWORD;
dwAvailPageFile: DWORD;
dwTotalVirtual: DWORD;
dwAvailVirtual: DWORD;
end; procedure TForm1.Bellek_durumuClick(Sender: TObject);
Var
Bellek : TMEMORYSTATUS;
begin
GlobalMemoryStatus(Bellek);
Edit1.Text := IntToStr(Bellek.dwTotalPhys div 1024 div 1024) +' MB';
Edit2.Text := '%' + IntToStr(Bellek.dwMemoryLoad);
Edit3.Text := IntToStr(Bellek.dwAvailPhys Div 1024 Div 1024) +' MB';
end;unit Unit1;
interface
uses
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Menus;
Type
TBELLEK_DURUMU = record
dwLength: LONGINT;
dwMemoryLoad: LONGINT;
dwTotalPhys: LONGINT;
dwAvailPhys: LONGINT;
dwTotalPageFile: LONGINT;
dwAvailPageFile: LONGINT;
dwTotalVirtual: LONGINT;
dwAvailVirtual: LONGINT;
end;
type
TForm1 = class(TForm)
procedure FormClick(Sender: TObject);
private
public
end;
var
Form1: TForm1; implementation
Function GlobalMemoryStatus(Var Bellek : TBELLEK_DURUMU): Integer;
StdCall; External 'Kernel32.dll';
{$R *.dfm} procedure TForm1.Bellek_durumuClick(Sender: TObject);
Var
Bellek : TBELLEK_DURUMU;
begin
GlobalMemoryStatus(Bellek);
Edit1.Text := IntToStr(Bellek.dwTotalPhys div 1024 div 1024) + ' MB';
Edit2.Text := '%' + IntToStr(Bellek.dwMemoryLoad);
Edit3.Text := IntToStr(Bellek.dwAvailPhys Div 1024 Div 1024) + ' MB';
end;implementation
Function Bellek_bilgisi(var Bellek :TBELLEK_DURUMU): Integer;
StdCall; external 'kernel32.dll' Name 'GlobalMemoryStatus';
{$R *.dfm}
procedure TForm1.Bellek_durumuClick(Sender: TObject);
Var
Bellek : TBELLEK_DURUMU;
begin
Bellek_bilgisi(Bellek);
Edit1.Text := IntToStr(Bellek.dwTotalPhys div 1024 div 1024) + ' MB';
Edit2.Text := '%' + IntToStr(Bellek.dwMemoryLoad);
Edit3.Text := IntToStr(Bellek.dwAvailPhys Div 1024 Div 1024) + ' MB';
end;