Form Inheritance (02) – MDI Form

March 8, 2006 at 9:34 am | Posted in Code Samples, Tutorials | 5 Comments

by: Widi Harsojo

lanjutan dari artikle sebelumnya “Delphi – form Inheritance (01) – Base Form”, saya akan membahas form Inheritance yang dilakukan terhadap MDI Form atau yang biasanya disebut sebagai Form-Utama, mungkin akan kepikir oleh teman-teman di sini, ngapain di inherit? Orang form cuma satu dan kalo ada project lain toh, tinggal di copy aja project lama, dan ganti deh nama project tersebut dengan project yang baru. Memang, jawaban tersebut juga valid,…. tapi balik lagi ke taste / style dari saya atau Anda,…. enaknya nge-coding itu gimana???… saya merasa dengan meng-inherit ini form ini akan banyak membantu saya untuk:

  • mengurangi coding yang harus saya baca di masing-masing project, karena standard Form(Form-base atau Form-mdi-base) CODE untuk keseluruhan project adalah sama
  • mengurangi repetitif task, misalnya dengan merubah base-form(mdi), otomatis project saya yang lain akan berubah.
  • fun – for – refactoring, jika program sudah “bloated” pada saat “eh kayaknya nih function (or procedure or property) bisa di naekkin di base form turunan ke 1/2 ataupun ke dasar deh…”
  • etc.etc.etc…ntar di tambahin lagi, kalau sudah pop-up…πŸ™‚

Untuk Component yang umumnya ada di MDI terdiri dari (minimal)

  • TMenu (mnuLogin, mnuOperator, mnuAdmin) atau juga bisa di ganti menggunakan TActionBar dan TAction Manager atau juga bisa di ganti dengan DevExpress-ExpressBar, untuk di awal aplikasi berjalan, mnuLogin yang aktif
  • TImageList, untuk mengisis Image di Menu
  • TStatusBar (stbBar), berguna untuk mengisi info mengenai: user yang aktif, status keyboard, dan tanggal system
  • TTime (tmrLogin), berguna setelah “Form Show” timer di aktifkan untuk menampilkan Form-Login

Beberapa Procedure/Function yang harus ada adalah:

  • Function Pengecekkan form yang sudah aktive berdasarkan Form.name
  • Closing All form untuk menu “Log-out”
  • Event dari tmrLogin untuk mang-aktifkan Form-Login, mungkin anda bisa explore sedikit di sini apakah interdependensi antar Form-MDI dan Form-Login di bolehkan (dalam arti Form-login akan menjadi Standard Form / Library Form), tetapi akan menjadi tidak fleksible jika ada beberapa project anda menggunakan beda Database dan Form-Login meng-akses-dan-menggunakan spesifik tabel tersebut.
  • dan masih banyak lagi yang bisa di taruh di sini (tapi untuk sementara ya ini dulu ya…)

Berikut Contoh Codingnya:

unit wfbMDI;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
  Forms, Dialogs, Menus, ImgList, ExtCtrls, ComCtrls;

type
  TfbMDI = class(TForm)
    mnuLogin:    TMainMenu;
    mnuOperator: TMainMenu;
    mnuAdmin:    TMainMenu;
    stbBar:      TStatusBar;
    tmrLogin:    TTimer;
    imgList:     TImageList;
    procedure FormShow(Sender: TObject);
    procedure tmrLoginTimer(Sender: TObject);
  private
    { Private declarations }
  public
    procedure FileLogOff(Sender: TObject);
    function  IsFormLoaded(FName: String): Boolean;
    Procedure SendKey(receiver: HWND; Key: Integer);
    { Public declarations }
  end;

var
  fbMDI: TfbMDI;

implementation
//uses afsLogin; Form-Standard untuk Login
{$R *.dfm}
//------------------------------------------------------------------------------
procedure TfbMDI.FormShow(Sender: TObject);
begin
  //Defaultnya harus False
  tmrLogin.Enabled:= true;
end;
//------------------------------------------------------------------------------
procedure TfbMDI.tmrLoginTimer(Sender: TObject);
begin
  tmrLogin.Enabled:= false;
//fsLogin := TfsLogin.Create(self);
//fsLogin.ShowModal;
end;
//-------------------------------------------------------------------
procedure TfbMDI.FileLogOff(Sender: TObject);
begin
  for I := MDIChildCount-1 downto 0 do
      MDIChildren[I].Close;
  Menu:= mnuLogin;
end;
//-------------------------------------------------------------------
Function TfbMDI.IsFormLoaded(FName: String): Boolean;
Var
  I: Integer;
Begin
  Result := False;
  For I :=0 To Screen.FormCount -1 do Begin
      If Screen.Forms[I].Name = FName then begin
         Screen.Forms[I].BringToFront;
         Result := True;
      end;
  end;
End;
//------------------------------------------------------------------------------
Procedure TfbMDI.SendKey(receiver: HWND; Key: Integer);
begin
  SendMessage(receiver,WM_CHAR, Ord(Key), 0 );
end;
//------------------------------------------------------------------------------
end.

Anda lihat di procedure ter-akhir “SendKey”, procedure ini mirip dengan penggunaan VCLobject.Perform, yang gunanya untuk kirim karakter ke Object denga WHandle tertentu, perlu tidak….?, apakah seharusnya di taruh di Base-Form?…., atau di Global Unit Saja?…..

Dan ini adalah contoh dari hasil inherit MDI-Form ini, cukup mengurangi mata membaca….πŸ™‚

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, 
  Forms, Dialogs, wfbMDI, ImgList, ExtCtrls, Menus, ComCtrls;

type
  TfMain = class(TfbMDI)
    procedure LogOnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fMain: TfMain;

implementation

{$R *.dfm}
//------------------------------------------------------------------------------
procedure TfMain.LogOnClick(Sender: TObject);
begin
  if not IsFormLoaded('fsLogin') then begin
     fsLogin := TfsLogin.Create(self);
     fsLogin.ShowModal;
  end;
end;
//------------------------------------------------------------------------------
end.

Semoga membantu…

5 Comments »

RSS feed for comments on this post. TrackBack URI

  1. Try to look here and may be you find what do you want:,

  2. Do you want to see good pics?,

  3. Of course, but what do you think about that?,


Leave a Reply

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 / Change )

Twitter picture

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

Facebook photo

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

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: