Kamis, 10 Desember 2015

Membuat Multiform Tab


Pada kesempatan kali ini, saya akan memberikan tutorial untuk membuat form Multitab dengan menggunakan komponen PageControl pada Delphi XE

Apa itu Multitab? Multitab merupakan tampilan form yang ada pada form yang sudah aktif, sehingga form utama masih aktif meskipun form lain aktif dan akan memberikan tampilan yang lebih menarik seperti pada contoh gambar di bawah ini


Buat tampilan dengan komponen 1 Panel (Align : alLeft), 1 PageControl (Align : alRight), 1 PopupMenu, 1 ImageList, 4 button, dan 4 Form yang akan ditampilkan.

Beri Caption Button masing-masing serta isi gambar Imagelist dengan cara doubleclick komponen tersebut kemudian Add gambar untuk digunakan sebagai gambar sebelah kiri pada tampilan tiap TabForm.

PopupMenu digunakan dengan cara doubleclick komponen, Ketik (Close Tab) untuk menutup form yang tampil dengan menggunakan klik kanan pada PageControl tersebut.


Script coding yang harus dibuat adalah sebagai berikut.

  1. Taruh script berikut dibawah "uses"
  2. type
      TMyFormClass=Class of TForm;
      TMyTabSheet=Class(TTabSheet)
        Private
          TabForm:TForm;
          fFormClass:TMyFormClass;
        Protected
           Constructor Create(Aowner:TComponent); Reintroduce;
        Public
           Constructor New(Aowner:TComponent; YourFormClass:TMyFormClass);
           Property FormClass:TMyFormClass Read fFormClass;
      end;
  3. Buat Private Declaration dengan script berikut
  4. private
        { Private declarations }
    
        //membuat tab baru pada page control
        function BuatTab(FormClass:TMyFormClass): TMyTabSheet;
    
        //menampilkan form yang page page control
        procedure TampilForm(NewFormClass: TMyFormClass; ImgIndex: Integer);
    
        //cek apakah form sudah ditampilkan pada page control
        function CekFormSudahAda(FormClass:TMyFormClass): TMyTabSheet;
  5. Buat Constructor Create & New di bawah implementation
  6. Constructor TMyTabSheet.Create(Aowner: TComponent);
    begin
      Inherited Create(Aowner);
    end;
    
    Constructor TMyTabSheet.New(Aowner: TComponent; YourFormClass: TMyFormClass);
    begin
      Inherited Create(Aowner);
      fFormClass:=YourFormClass;
    end;
  7. Buat Function CekFormSudahAda, BuatTab, dan Procedure TampilForm
  8. function Tfrm_main.CekFormSudahAda(FormClass: TMyFormClass): TMyTabSheet;
    var i: Integer;
        H:TMyTabSheet;
    begin
      {nilai awal result adalah nil. Jika tab yang mengandung form 
       ditemukan, maka fungsi ini akan mengembalikan referensi dari 
       tab tersebut. jika tidak ada maka fungsi mengembalikan nilai
       nil. Penting untuk memberikan nilai awal nil, karena jika
       tidak, fungsi Assigned(CekFormSudahAda) akan selalu 
       mengembalikan nilai True, baik form tersebut sudah ada 
       atau tidak.}
      Result:= nil;
      if PGC1.PageCount<1 then Exit;
    
    
      {cek berdasar caption tab}
      H:=Nil;
      for i := 0 to pgc1.PageCount-1 do
        if TMyTabSheet(PGC1.Pages[i]).FormClass=FormClass then begin
           H:=TMyTabSheet(PGC1.Pages[i]);
           Break;
        end;
      Result:=H;
    end;

    function Tfrm_main.BuatTab(FormClass:TMyFormClass): TMyTabSheet;
    Var H:TMyTabSheet;
    begin
      {fungsi digunakan untuk membuat tabsheet baru, kemudian tab tersebut 'ditancapkan'
       pada page control yang diinginkan, dan otomatis menjadikannya sebagai tab yang aktif
       saat itu}
      Result:=Nil;
      if Assigned(CekFormSudahAda(FormClass)) then Exit;
      H:=TMyTabSheet.New(Self,FormClass);
      H.PageControl:=PGC1;
      H.TabForm:=H.FormClass.Create(Application);
      H.TabForm.BorderStyle:=bsNone;
      H.Caption:=H.TabForm.Caption;
      H.TabForm.Parent:=H;
      H.TabForm.Align:=AlClient;
      PGC1.ActivePageIndex:=PGC1.PageCount - 1;
      H.TabForm.Show;
      Result:=H;
    end;

    procedure Tfrm_main.TampilForm(NewFormClass: TMyFormClass; ImgIndex: Integer);
    var tab: TTabSheet;
    begin
      {jika form sudah ada / ditampilkan dalam tab, maka tab tersebut diaktifkan
      (dijadikan tab aktif. Jika Form belum ada, maka tab baru dibuat, dan form yang
      dimaksudkan diletakkan di tab tersebut}
      if Assigned(CekFormSudahAda(NewFormClass)) then
        pgc1.ActivePageIndex:=CekFormSudahAda(NewFormClass).TabIndex
      else begin
        Tab:=BuatTab(NewFormClass);
        if Assigned(Tab) then
           Tab.ImageIndex:=ImgIndex;
      end;
    end;
  9. Double click pada tiap Button yang ada untuk menampilkan Form di dalam Tab Page Control dan isikan script berikut di setiap Buttonnya:
  10. procedure Tfrm_main.btn1Click(Sender: TObject);
    begin
      //TampilForm(frm_pegawai, 0);
      TampilForm(Tfrm_pegawai,0);
    end;
    
    procedure Tfrm_main.btn2Click(Sender: TObject);
    begin
     // TampilForm(frm_penjualan, 1);
     TampilForm(Tfrm_Penjualan,1);
    end;
    
    procedure Tfrm_main.btn3Click(Sender: TObject);
    begin
      TampilForm(TFrm_User,2);
     // TampilForm(frm_user, 2);
    end;
    
    procedure Tfrm_main.btn4Click(Sender: TObject);
    begin
      TampilForm(TFrm_Pembelian,3);
     // TampilForm(frm_pembelian, 3);
    end;
  11. Untuk close button kita menggunakan PopupMenu dengan script coding :
  12. procedure Tfrm_main.CloseTab1Click(Sender: TObject);
    begin
      //menghapus tab.
     // pgc1.ActivePage.Free;
      TMyTabSheet(PGC1.ActivePage).TabForm.Free;
      PGC1.ActivePage.Free;
    end;
  13. Program Multi Tab sudah dapat dijalankan :) Selamat Mencoba !

3 komentar:

  1. Mohon petunjuk, ketika di run masih Masih ada error pada bagian
    1. constructor TMyTabSheet.New(...)
    Peringatanya : 'New' berbeda dengan deklarasi sebelum nya.

    2.fFormClass:=YourFormClass, pada construktor TMyTabSheet.New itu todak teridentifokasi

    Dan masih ada beberapa yang masih error lagi.
    Mohon petunjuk nya.
    Terima kasih.

    BalasHapus
  2. Bagus Jalan tanpa error, cuma gimana caranya mengambil data dari form lain di luar dari tabsheet pagecontrolnya. sudah saya coba tapi tidak bisa. gimana ya caranya?
    terima kasih.

    BalasHapus
  3. Bagus, bisa jalan dengan baik, trimakasih...

    BalasHapus