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 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:”, “status kyb”,”datetime”
- 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…



3 Comments
Mantap Pak..
trik saya kalo ada form login ke program utama, saya kasih panel di form utama, terus pas form create semua komponen kecuali yang buat login saya visible=false, baru setelah login nya benar saya visible = true dan yang buat login visible = false.
gimana ada saran yang lebih baik ? terus di delphi itu ada komponen md5 buat encript password tidak ?
bisa kasih linknya ?
terima kasih atas balasan ke email saya.
Problem Kombinasi DDE dan Sendkeys
Saya sedang mencoba untuk membuat sendkeys yang dikombinasikan dengan DDE melalui program VB 6 (sudah di coba juga di C#) dimana pada saat eksekusi DDE, ada pop up yang harus di kirimkan value nya. Programnya :
sDDECmd = “LoadCallGroup(0,0,”"tes”",”"”") ”
WShell.AppActivate (“Call Logging”), True
WShell.SendKeys “”, 1000
Me.txtDDE.LinkExecute sDDECmd
WShell.SendKeys “00000181″, 500
WShell.SendKeys “~”
namun yang terisi value nya bukan pada saat DDE dieksekusi pada pop up, melainkan pada form yang lainnya. Aplikasi ini digunakan untuk aplikasi Heat (detail bisa diliat di http://www.frontrange.com)
Mohon jika yang pernah punya pengalaman mengenai proses ini bisa di share dengan saya, atau email japri ke indra.dewaji@gmail.com
Terimakasih.
Regards,
Indra Dewaji