All About Delphi
Saat anda melakukan pemrograman yang komplek , kadang Delphi tidak menyediakan fungsi yang anda perlukan . sebagai contoh untuk membuat sebuah file anda dapat mengunakan fungsi dari Delphi yaitu FileCreate() . yang merupakan enskapulasi dari fungsi window API CreateFile() . Apa bedanya ?
Jika dipperhatikan FileCreate() hanya memiliki satu parameter bertipe string, yang menyatakan nama file yang ingin dibuat. Sedangkan fungsi CreateFile() memiliki 7 buah parameter (wow…) . Fungsi CreateFile () lebih sulit penggunaannya namun memiliki keuntungan , yakni anda dapat membuat file dengan lebih spesifik, misalnya dengan memperhatikan mode akses , mode sharing , atribut dan sebagainya.
Contoh program sederhana dengan Window API
Pada bagian ini saya akan membuat aplikasi sederhana dengan menggunakan Window API . Interfacenya hanya sebuah form dan akan menampilkan message jika user menekan tombol kiri pada mouse didaerah klien.Untuk selengkapnya lihat kode dibawah ini :
program API;
uses
Windows, Messages;
const
ClassName = ‘MyWindowClass’; // Definisi nama kelas Window
var
WndClass : TWndClassEx; // Struktur kelas window
WindowHandle : HWND; // Handle window
Msg : TMsg; // Struktur message
IconHandle : HICON; // Handle ikon
{$R *.RES}
// Fungsi yg dipangil saat message dikirim ke aplikasi
function WndProc(Window: HWND; uMsg: UINT; wParam: wParam;
lParam: lParam): LRESULT; stdcall; export;
begin
Result := 0;
case uMsg of
WM_LBUTTONDOWN: // Message ‘klik kiri mouse’
MessageBox(WinDowHandle,
‘Anda baru saja melakukan klik-kiri pada Form’,
‘Informasi’, MB_OK or MB_ICONINFORMATION);
WM_DESTROY:
begin
PostQuitMessage(0); // Request utk mengakhiri program
end;
else
// Menangani message yang tidak diproses oleh
// prosedur WndProc
Result := DefWindowProc(Window, uMsg, wParam, lParam);
end;
end;
// Fungsi Utama
begin
// Mengambil handle icon yg akan digunakan
IconHandle := LoadIcon(hInstance, ‘MAINICON’);
// Mendefinisikan struktur kelas
with WndClass do
begin
// Ukuran struktur kelas
cbSize := sizeof(WndClassEx);
// Style Window yg digunakan
style := 0;
// Pointer ke fungsi callback window yg digunakan
lpfnWndProc := @WndProc;
// Ukuran memori yg dialokasikan utk menyimpan
// informasi tambahan kelas
cbClsExtra := 0;
// Ukuran memori yg dialokasikan utk menyimpan
// informasi tambahan window
cbWndExtra := 0;
// Handle instance aplikasi
hInstance := hInstance;
// Handle ikon yg akan ditampilkan saat user menekan
// tombol Alt-Tab
hIcon := IconHandle;
// Handle kursor saat mouse berada di atas daerah client
hCursor := LoadCursor(0, IDC_ARROW);
// Brush yg digunakan untuk mengatur warna window
hbrBackground := GetSysColorBrush(COLOR_BTNFACE);
// Nama resource menu yg digunakan.
// Diset ‘nil’ karena window tidak memiliki menu utama
lpszMenuName := nil;
// Nama identitas kelas
lpszClassName := ClassName;
// Handle ikon yg ditampilkan pada taskbar dan
// pojok kiri atas window
hIconSm := IconHandle;
end;
// Mendaftarkan kelas
if RegisterClassEx(WndClass) = 0 then
begin
MessageBox(0, ‘Registrasi Window Gagal’, ‘Kesalahan’,
MB_ICONSTOP or MB_OK);
Exit;
end;
// Membuat jendela utama
WindowHandle :=
CreateWindowEx(
WS_EX_STATICEDGE, // Style window tambahan
ClassName, // Nama kelas yg digunakan
‘Form1′, // Teks yg ditampilkan pd title bar
WS_OVERLAPPEDWINDOW, // Style window yg diciptakan
50, // Posisi horizontal window
50, // Posisi vertikal window
400, // Lebar window
300, // Tinggi window
0, // Handle parent window
0, // Handle menu
hInstance, // Handle instance aplikasi
nil); // Pointer ke nilai yg dilewatkan
// ke window melalui struktur
// CREATESTRUCT
// Jika gagal membuat window utama
if WindowHandle = 0 then
begin
MessageBox(0, ‘Gagal Membuat Window’, ‘Kesalahan’,
MB_ICONSTOP or MB_OK);
exit;
end;
// Menampilkan window
ShowWindow(WindowHandle, CmdShow);
// Menggambar ulang window dg mengirim pesan WM_PAINT
UpdateWindow(WindowHandle);
// Memproses pesan dari antrian
while (GetMessage(Msg, 0, 0, 0)) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Halt(Msg.wParam);
end.
Pada sistem Operasi windows , elemen-elemen yang membangun sistem aplikasi memiliki nomor pengenal disebut Handle . Apliksi memilki handle , tombol memiliki handle device content memiliki handle dan sebagainya.
Konsep Handele dapat di analogikan sebagai nomor pengenal mahasiswa atau pegawai . Misalnya anda dalah seoreang mahasiswa tentu anda memiliki NIM, meskipun dalam Unuversitas terdapat banyak mahasiswa, nim tiap mahasiswa berbeda.
Misalkan dalam sebuah form terdapat lima buah tombol , maka tiap tombol memiliki handle yang nilainya berbeda. dalam implementasinya handle dinyatakan dengan bilangan bulat positif 32 bit . Pada pemrograman window API dikenal bnyak sekali tipe data yang mempresentasikan handle , misalnya HWND (handle window) ,HMENU (handle menu) , HICON ( handle icon) , HBITMAP( handle bitmap) dan sebaginya. Meskipun namanya berbeda beda namun tipe dasarnya sama, yaituLongWord (bilangan bulat positif 32 bit).
Program berikut menunjukkan penggunaan handle dalam pemrograman. Pada program digunakan fungsi sendMessage () nuntuk mengirim pesan kesebuah kontrol window . Parameter pertama sendmessage menunjukkan handle window kontrol yang dituju. Parameter kedua menunjukkan pesan yang dikirim, sedangkan parameter yang ketiga dan keempat menunjukkn parameter pesan.
Bagian lain program ini menunjukan bagaimana anda bisa mengisi sebuah Timagedengan ikon aplikasi , yang dilakukan dengan cara mengambil handle ikon aplikasi kemudian mengunakannya sebagai handle ikon Timage .
untuk memperoleh hasil yang sama sebenarnya anda hanya dapat menggunakan funsi fungsi yang lebih mudah yqang telah disediakan oleh Delphi. Sebagai contoh untuk mengatur kecondisi dropdown anda dapat mengganti funsi senmessage(Combobox1. handle,cb_showdropdown,1,0) dengan perintah combobox1.dropdown:= true. Untuk listing selengkapnya sebagai berikut :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Bevel1: TBevel;
ButtonTombol: TButton;
Button1: TButton;
ButtonListBox: TButton;
ButtonCombo: TButton;
ButtonIkon: TButton;
ButtonForm: TButton;
Image1: TImage;
ComboBox1: TComboBox;
ListBox1: TListBox;
procedure ButtonTombolClick(Sender: TObject);
procedure ButtonFormClick(Sender: TObject);
procedure ButtonIkonClick(Sender: TObject);
procedure ButtonComboClick(Sender: TObject);
procedure ButtonListBoxClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ButtonTombolClick(Sender: TObject);
begin
SendMessage(Button1.Handle, BM_SETSTATE, 1, 0);
end;
procedure TForm1.ButtonFormClick(Sender: TObject);
begin
FlashWindow(Self.Handle, true);
end;
procedure TForm1.ButtonIkonClick(Sender: TObject);
begin
// Mengisi Image1 dengan ikon aplikasi
Image1.Picture.Icon.Handle := Application.Icon.Handle;
{ Dapat juga menggunakan
Image1.Picture.Icon.Assign(Application.Icon) }
end;
procedure TForm1.ButtonComboClick(Sender: TObject);
begin
SendMessage(ComboBox1.Handle, cb_ShowDropDown, 1, 0);
{ Sebenarnya dapat menggunakan :
ComboBox1.DroppedDown := true; }
end;
procedure TForm1.ButtonListBoxClick(Sender: TObject);
begin
// Memilih item terakhir
SendMessage(ListBox1.Handle, LB_SETCURSEL,
ListBox1.Items.Count-1, 0);
{Hasil yg sama dapat diperoleh dengan :
ListBox1.ItemIndex := ListBox1.Items.Count – 1; }
end;
end.
Pada sistem operasi windows , pada suatu waktu ter dapat banyak sekali proses yang berjalan secra pararel. Windows telah menyediakan suatu mekanisme yang memungkinkan proses-proses tersebut dapat saling berkomunikasi . Mekanisme ini disebut dengan Interprocess Comunication (IPC). Ada beberapa mekanisme yang didukung oleh windo API antara lain adalah : Clipboard, COM (Componen Object Model) , DDE ( Dynamic Data Exchange), RPC ( Remote Procedure Call ), Pipe dan sebagainya.
Window API telah menyediakan metode yang memungkinkan terjadinya komunikasi dan pertukaran data antar beberapa aplikasi . Salah satunya dengan menggunakan message WM_COPYDATA . data yang dikirim dapat berupa struktur COPYDATASTRUCT dengan menggunakan fungsi sendmessage (hwnd,WM_COPYDATA, wparam,loaram). Isi parameternya dijelaskan sebagi berikut :
| TIP |
|
Sebagai contoh buat dua aplikasi , satu sebagai pengririm dan satu sebagi penerima pesan. TEntukan form pengirm dengan caption pengrim dan penerima pesan. Untuk mengetahui handle aplikasi yang dituju atau aplikasi pengirim , gunakan fungsiFindWindow() untuk kode selengkapnya sebagi berikut :
listing program pengirim pesan
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ExtDlgs;
type
TForm1 = class(TForm)
GroupBox3: TGroupBox;
EditString: TEdit;
ButtonKirimString: TButton;
GroupBox4: TGroupBox;
ButtonKirimBmp: TButton;
Image1: TImage;
Button1: TButton;
OpenPictureDialog1: TOpenPictureDialog;
procedure ButtonKirimStringClick(Sender: TObject);
procedure ButtonKirimBmpClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
HTargetWnd : HWND; // Handle window tujuan
function IsReceiverActive: boolean;
procedure ShowErrMsg;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Fungsi untuk menentukan apakah aplikasi penerima pesan
// telah dijalankan, dan sekaligus mencari handle aplikasi
// yg dituju.
function TForm1.IsReceiverActive: boolean;
begin
Result := false;
// Mencari handle window yg memiliki caption ‘Penerima Pesan’.
HTargetWnd := FindWindow(nil, ‘Penerima Pesan’);
if HTargetWnd <> 0 then
Result := true;
end;
// Prosedur menampilkan pesan kesalahan
procedure TForm1.ShowErrMsg;
begin
Application.MessageBox
(’Jalankan dulu program penerima pesan’,
‘Kesalahan’, MB_ICONERROR);
end;
procedure TForm1.ButtonKirimStringClick(Sender: TObject);
var
MyCopyDataStruct : TCopyDataStruct;
begin
// Inisialisasi struktur data yg akan dikirim
with MyCopyDataStruct do
begin
dwData := 1; // Kode mengirim string.
// Anda bisa menggunakan bilangan lain,
// hanya saja harus dikonfirmasikan
// dengan penerima pesan.
cbData := StrLen(PChar(EditString.Text)) + 1;
// Ditambah satu utk karakter #0
lpData := PChar(EditString.Text);
// Data string yg dikirim
end;
// Kirim pesan
if not IsReceiverActive then ShowErrMsg
else SendMessage(HTargetWnd, WM_COPYDATA, LongInt(Handle),
LongInt(@MyCopyDataStruct));
end;
procedure TForm1.ButtonKirimBmpClick(Sender: TObject);
var
MemStream: TMemoryStream;
MyCopyDataStruct: TCopyDataStruct;
begin
MemStream := TMemoryStream.Create;
try
image1.Picture.Bitmap.SaveToStream(MemStream);
// Inisialisasi struktur data yg akan dikirim
with MyCopyDataStruct do
begin
dwData := 2; // Kode utk mengirim bitmap
cbData := MemStream.Size;
lpData := MemStream.Memory;
end;
// Kirim pesan
if not IsReceiverActive then ShowErrMsg
else SendMessage(HTargetWnd, WM_COPYDATA, LongInt(Handle),
LongInt(@MyCopyDataStruct));
finally
MemStream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.Bitmap.
LoadFromFile(OpenPictureDialog1.FileName);
end;
end.
Listing penerima Pesan
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
GroupBox2: TGroupBox;
Label4: TLabel;
Label5: TLabel;
EditString: TEdit;
Image1: TImage;
Bevel1: TBevel;
private
{ Private declarations }
procedure WMCopyData(var Msg: TWMCopyData);
message WM_COPYDATA;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Mencari handle pengirim pesan.
// Karena pesan WM_COPYDATA bisa berasal dari berbagai
// aplikasi, maka handle aplikasi pengirim sebaiknya diketahui
function HSenderWnd : HWND;
begin
// Mencari handle window yg memiliki caption ‘Pengirim Pesan’
Result := FindWindow(nil, ‘Pengirim Pesan’);
end;
// Menentukan apa yg akan dilakukan jika pesan WM_COPYDATA
// diterima
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
StrBuff : array[0..255] of Char;
MemStream : TMemoryStream;
begin
if Msg.From = HSenderWnd // Memastikan bahwa pengirim
// adalah aplikasi yg diharapkan
then begin
case Msg.CopyDataStruct.dwData of
1 : // Menerima teks
begin
StrLCopy(StrBuff, Msg.CopyDataStruct.lpData,
Msg.CopyDataStruct.cbData);
EditString.Text := StrBuff;
end;
2 : // Menerima bitmap
begin
MemStream := TMemoryStream.Create;
try
with Msg.CopyDataStruct^ do
MemStream.Write(lpdata^, cbdata);
MemStream.Position := 0;
image1.Picture.Bitmap.LoadFromStream(MemStream);
finally
MemStream.Free;
end;
end;
end;
end;
end;
end
Saat anda membuat aplikasi dengan Delphi , anda akan mendapatkan form baru bernama Form1. Secara tidak anda sadari , ternyata Delphi membuat form baru lain yang tersembunyi.
Adanya window tersembunyi ini kadang menimbulka maslah saat anda in gin menangakp message (pesan) yang ditujukan kesuatu aplikasi. Sebagi bukti keberadan window tersembunyi ini , buatlah aplikasi baru dan jalankan tanpa mengubah nama proyek dan caption form . Perhatikan bahwa judul form adalah form1 , sedangkan ikon pada title pada taskbar memliki title project1. Perbedaan ini karena ikon pda taskbar mempresentasikan window aplikasi yang tersembunyi, bukan form1.
Sebagai bukti lain , klik ikon sistem form1 (ikon yang terdapat pada pojok kiri form ) untuk menampilkan menu sistem . Bandingkan dengan menu yang ditampilkan saat anda melakukan klik kanan pada ikon aplikasi taskbar. Jika anda perhatikan , ternyata menu yang ditampilkan berbeda . Mengapa ?
Jika masih tidak percaya dengan keberadaan window tersembunyi tersebut tambahkan listing sebangai berikut :
procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowPos(Application.Handle, HWND_BOTTOM, Left-30,
Top-30, Width, Height, SWP_NOZORDER);
end;
Mulai versi ketiga Delphi menyediakan fungsi Win32check(retval : BOOL) : BOOL, yang dapat digunakan untuk mengecek keberhasilan suatu fungsi Window API yangmemounyai nilai balik bertipe Boolean . Jika terjadi kesalahan maka akan menghsilkan nilai bailk bernilai false ( terjadi kegagalan), Delphi memanggil fungsi RaiseLastWin32Error() untuk membangkitkan eksepsi. listingnya sebagai berikut :
procedure TForm1.Button1Click(Sender: TObject);
begin
if Win32Check(CreateDir(’c:\coba’)) then
ShowMessage(’Berhasil membuat direktori “c:\coba”‘ + #13 +
‘Tekan tombol sekali lagi’);
end;
Untuk memperoleh pesan kesalahan terakhir , gunakan fungsi GetLastError () . Nilai yang diperoleh didasarkan pada tip tread. untuk program multi tread, nilai last error tidak bertumpukan satu dengan yang lain.
GetLasterror() akan memberikan nilai bulat positif yang menunjukkan kode kesalahan. Kode “0″ menunjukkan bahwaoperasi sukses. Untuk mengetahui arti kode last error, gunakan fungsi SysErrorMessage( ErrorCode: Integer). Untuk listingnya sebagai berikut:
procedure TForm1.Button1Click(Sender: TObject);
var errorkode : cardinal;
begin
CreateDirectory(’c:\coba’,nil) ;
errorkode := Getlasterror;
ShowMessage(’Kode Kesalahan : ‘ +Inttostr(errokode)+#13
+ ‘Pesan Kesalahani: ‘ + SysErroMessage(errorkode)’);
end;
end.
Untuk membuat dan menulis ke INI, anda biasa memanfaatkan kelas khusus yang telah disediakan Delphi yakni kelas TIniFiles.
- Menulis string ke File INI –> untuk menulis string ke dalam file INI, gunakan funsi WriteString(Const Section, Key, Value: string)
- Membaca nilai dari file INI –> pembacaan nilai dari file INI dilakukan dengan fungsi ReadStrung(cost Section, Key,Default : String ) parameter default menyatakan nilai yang akan dikembalikan jika section, key, atau nilai value yang dimaksud tidak ditemukan.
- Mencatat nilai posisi form pada File INI –> contoh program berikut ini dimaksudkan untuk menyimpan setting posisi form pada file INI ” Setting .ini”. Nilai default diset 0 sehingga jika pembacaan nilai posisi form mengalami kegagalan nilai balik fungsi yang diperoleh adalah 0. Listing selngkapnya sebagi berikut :procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := ‘Tekan tombol berikut dan pada direktori’
+ #13 + ‘”‘ + GetCurrentDir + ‘”‘+ #13 +
‘buka file “Seting.ini” yang terbentuk.’
end;procedure TForm1.Button1Click(Sender: TObject);
var MyIniFile : TIniFile;
begin
//Membuat file INI bernama “seting.ini”
MyIniFile := TIniFile.Create(GetCurrentDir + ‘\Seting.ini’);//Mencatat posisi Form1.Top
MyIniFile.WriteInteger(’Posisi’, ‘Top’, Top);
//Mencatat posisi Form1.Left
MyIniFile.WriteInteger(’Posisi’, ‘Left’, Left);MyIniFile.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
var INIFileName : TFileName;
OpenedINIFile : TIniFile;
begin
//Menentukan path dan nama file INI yang dibuka
INIFileName := ExtractFilePath(Application.ExeName) +
‘Seting.ini’;// Membuka file INI
OpenedINIFile := TIniFile.Create(INIFileName);// Menentukan posisi Form1.Top sesuai dg data pada file INI
Top := OpenedINIFile.ReadInteger(’Posisi’, ‘Top’, 0);
// Menentukan posisi Form1.Left sesuai dg data pada file INI
Left := OpenedINIFile.ReadInteger(’Posisi’, ‘Left’, 0);OpenedINIFile.Free;
end;end.






Komentar»
No comments yet — be the first.