Membuat Menu lewat TMainMenu Secara Pemrograman

Anda memang bisa menggunakan fasilitas drag-drop untuk membuat menu. Tak akan seribet seperti yang akan saya jelaskan berikut ini. Namun, dengan menguasai pembuatan obyek menu secara pemrograman, kita dapat lebih berkuasa terhadap menu. Bahkan Anda tidak membutuhkan komponen tambahan dari luar untuk mempercantik penampilan menu. Ada dua bagian yang akan saya bahas, pertama membuat menu, yang kedua bagaimana mempercantik penampilan menu


Membuat Menu

Saya akan meletakkan pemrogramannya di bagian event OnCreate milik Form. Anda dapat meletakkan dimana saja sesuatu kebutuhan Anda.

Pertama-tama, kita akan memakai TMainMenu. Class ini terdapat pada unit Menus. Tulis nama unit ini di bagian Unit.

uses
  .....Menus;

Buat instan obyek di OnCreate milik dan atur property Owner miliknya ke true. Pernyataan ini akan memberitahukan kepada Windows agar tidak usah turut campur terhadap kelakuan Menu tadi, cukup programer saja yang "mengapa-apa"-kan


procedure TForm1.FormCreate(Sender: TObject);
var
  mnMenu : TMainMenu;
begin
    mnMenu := TMainMenu.Create(self);
    mnMenu.OwnerDraw := true;
end;

Pondasi menu selesai dibuat. Sekarang kita akan mulai menambahkan menu-menunya. Dalam artikel ini, saya cuma memberikan dua judul menu: Arsip dan Tentang.

TMainMenu akan menyimpan menu-menu anggotanya dalam bentuk array sehingga kita perlu mendefinisikan array untuk menu bar terlebih dahulu. Karena menu bar yang akan saya contohkan cuma dua, maka untuk sementara saya mendefinisikan array dengan dua anggota saja. Definisi array saya letakkan di var bagian OnCreate milik menu. Kode program dalam var menjadi seperti ini:

procedure TForm1.FormCreate(Sender: TObject);
var
  mnMenu : TMainMenu;
  MenuItem : array[0..1] of TMenuItem;
.............................................................................


Sesudah itu definisikan anggota menu bar. Kode program selengkapnya dalam OnCreate menjadi:

procedure TForm1.FormCreate(Sender: TObject);
var
  mnMenu : TMainMenu;
  MenuItem : array[0..1] of TMenuItem;
begin
    mnMenu := TMainMenu.Create(self);
    mnMenu.OwnerDraw := true;

    MenuItem[0] := TMenuItem.Create(Self);
    MenuItem[0].Caption := 'Arsip';

    MenuItem[1] := TMenuItem.Create(Self);
    MenuItem[1].Caption := 'Tentang';

end;
 

Apabila Anda meng-kompile program diatas, Anda pasti terkejut karena menu-nya kok belum tampak? Ya, iyalah, kita masih belum menuliskan kode programnya. Nah, tambahkan baris kode program dibawah ini pada kode program diatas.

mnMenu.Items.Add(MenuItem[0]);
mnMenu.Items.Add(MenuItem[1]);



Silakan Anda kompile, Anda akan mendapatkan penampakan seperti dibawah ini


Marilah kita bikin anak-anak menu untuk Menu Arsip. Saya akan menambahkan menu Daftar Barang, Daftar Supplier, Keluar. Sedangkan Tentang saya biarkan tanpa apa-apa. Dengan demikian kita perlu menambah array sejumlah 5.

 MenuItem : array[0..4] of TMenuItem;

 Dan tambahkan deklarasikan menu-menu tadi seperti ini:

MenuItem[2] := TMenuItem.Create(Self);
MenuItem[2].Caption := 'Daftar Barang';

MenuItem[3] := TMenuItem.Create(Self);
MenuItem[3].Caption := 'Daftar Supplier';

MenuItem[2] := TMenuItem.Create(Self);
MenuItem[2].Caption := 'Keluar';

Sekali lagi, jika program diatas Anda kompile, Anda masih belum mendapatkan tambahan menu tadi, oleh karena itu ubah kode program diatas dengan menambahkan

mnMenu.Items[0].Add(MenuItem[2]);
mnMenu.Items[0].Add(MenuItem[3]);
mnMenu.Items[0].Add(MenuItem[4]);



Hasil kompile program Anda seharusnya sudah seperti dibawah ini:


Tapi sebentar. Lantas bagaimana mengisi OnClick di menu ini? Oke, baiklah, kita go-on. Kita akan mengisi menu keluar. Skenarionya, kalau keluar di-klik, maka program akan tertutup.

Kita harus membuat prosedur OnClick terlebih dahulu. Disini saya akan menamakan mnKeluarOnClick

procedure TForm1.mnKeluarOnClick(Sender: TObject);
begin
   Application.terminate;
end;

Kemudian berikan nama mnKeluarOnClick pada property OnClick milik menu keluar (MenuItem[4]) seperti berikut:

MenuItem[4].OnClick := mnKeluarOnClick;


Sekarang bagaimana untuk sub menu? Gampang, bro. Saya akan perluas menu Daftar Supplier dengan menambahkan menu Contact Person dan Detil Supplier. Pertama-tama ubah jumlah array terlebih dahulu.

procedure TForm1.FormCreate(Sender: TObject);
var
  mnMenu : TMainMenu;
  MenuItem : array[0..6] of TMenuItem;


Kemudian tambahkan kode program dibawah ini:

MenuItem[5] := TMenuItem.Create(Self);
MenuItem[5].Caption := 'Contact Person';
 

MenuItem[6] := TMenuItem.Create(Self);
MenuItem[6].Caption := 'Detil Supplier';



Lantas tempelkan menuitem[5] dan [6] diatas ke menuitem[3] milik menu Daftar Supplier seperti dibawah ini:

MenuItem[3].Add(menuitem[5]);
MenuItem[3].Add(menuitem[6]);



Selesai. Kalau Anda kompile source code diatas, Anda akan menjumpai sub menu pada menu Daftar Supplier.



Mempercantik Menu

Langkah kedua dari project kita adalah mempercantik Menu. Langkah ini kita tempuh dengan mengganti font serta mengubah warna menu dan sorot menu.

Mengubah Font dapat dilakukan dengan mendefinisikan terlebih dahulu

Screen.MenuFont.Name := 'Comic Sans MS';
Screen.MenuFont.Size := 9;


Lihat font menu, sudah berubah, kan?




Sekarang saatnya memberi warna pada menu. Kita akan membuat "bagaimana cara menggambar dan men-cat menu" lewat kode program berikut:

procedure TForm1.DrawItemText(X: integer;ACanvas: TCanvas;ARect: TRect;Text: string);
begin
   ARect.Left := X;
   DrawText(ACanvas.Handle, PChar(Text), -1, ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_NOCLIP);
end;



Keterangan:
ARect.Leftadalah jarak tulisan menu dari kiri
ACanvas.HandleHandle menu yang akan digambar
PChar(Text)tulisan menu yang akan ditulis ulang sesudah bagian belakang tulisan dicat
ARectcanvas menu



Buat prosedur:

procedure TForm1.mnDrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
var
  mnu: TMenuitem;
begin
  aCanvas.font.name := 'Tahoma';
  aCanvas.font.size := 9;

  If selected then begin
    aCanvas.font.color := clWhite;
    aCanvas.brush.color := clBlack ;
    ACanvas.Font.Style := [fsBold];
  end
  else begin
    aCanvas.font.color := clWhite;
    aCanvas.brush.color := clRed;
    ACanvas.Font.Style := [fsBold];
  end;

    ACanvas.FillRect(ARect);
    DrawItemText(5,ACanvas,ARect, TMenuItem(sender).Caption);
end;


Pada kode diatas, saya memberi font warna putih (clwhite) , latar belakang berwarna merah (clRed) dan fold saat belum dipilih oleh pengguna. Begitu pengguna menyorot suatu menu, maka menu tersebut saya rubah menjadi latar belakang menjadi hitam.

Pada saat selesai men-cat menu, maka menu tersebut harus digambar kembali agar segala tulisan muncul. Prosedur penggambaran ditangani oleh DrawItemText.

Tetapi tunggu dulu. Pekerjaan kita masih belum selesai. Anda masih belum dapat melihat perubahan menu. Sekarang pasangkan prosedur mnDrawItem pada tiap-tiap menu seperti cuplikan berikut ini:

MenuItem[2] := TMenuItem.Create(Self);
MenuItem[2].Caption := 'Daftar Barang';
MenuItem[2].OnDrawItem := mnDrawItem;

MenuItem[3] := TMenuItem.Create(Self);
MenuItem[3].Caption := 'Daftar Supplier';
MenuItem[3].OnDrawItem := mnDrawItem;

MenuItem[4] := TMenuItem.Create(Self);
MenuItem[4].Caption := 'Keluar';
MenuItem[4].OnClick := mnKeluarOnClick;
MenuItem[4].OnDrawItem := mnDrawItem;


Kompile program diatas, Anda sudah pasti mendapatkan penampilan sebagai berikut:


Contoh kode program:

Membuat Menu lewat TMainMenu Secara Pemrograman Rating: 4.5 Diposkan Oleh: Good Dreamer

0 comments:

Posting Komentar

Diberdayakan oleh Blogger.