jump to navigation

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
  • HWnd –> Di isi dengan handle window yang dituju
  • wParam –> Diisi dengan handle window pengirim . Nilai ini bisa digunakan oleh penerima pesan untuk mengidentifikasi siapa pengirim pesan tersebut.
  • lParam –> Diisi dengan pointer ke struktur COPY DATASTRUCT , yakni struktur yang berisi data yang akan dikirim. Struktur COPY DATASTRUCT sebagai berikut :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;
  • 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.

    Komentar»

    No comments yet — be the first.

    Tinggalkan Balasan

    Fill in your details below or click an icon to log in:

    WordPress.com Logo

    You are commenting using your WordPress.com account. Log Out / Ubah )

    Twitter picture

    You are commenting using your Twitter account. Log Out / Ubah )

    Facebook photo

    You are commenting using your Facebook account. Log Out / Ubah )

    Connecting to %s

    Ikuti

    Get every new post delivered to your Inbox.