Sunday, February 28, 2010

Form Inheritance (01) – Base Form

Dalam pembuatan program di Delphi, banyak cara dan style orang mengcoding dan me-manage “project”, salah satunya saya. Dan saya juga punya style sendiri untuk coding dan me-manage “project” dari aplikasi yang saya buat ini. Salah satu style yang pasti saya bikin di dalam pembuatan aplikasi adalah pembuatan Form Dasar (Base Form) untuk di inheritance, inheritance ini di perlukan karena ada behavior standard dari form yang memang saya pasti perlukan, diantaranya adalah sbb:
 

* punya variable Last Key (inget jaman bahoela di clipper)
* punya standard Navigasi keys untuk perpindahan tombol menggunakan tombol [enter], [key-up], [key-down]. Standard Navigasi keys ini-pun harus ber-behave benar terhadap control {ComboBox}, {ListBox}, {DateEdit}, dan {DBGrid}.
    * [ESC] adalah tombol standard untuk keluar dari Forms.
    * dan so-pasti jika Forms di CLOSE, otomatis harus langsung di FREE, heh.. biar ndak coding lagi “action := caFree”…., bosen.

penamaan untuk form saya buat dengan style saya yaitu:
* Base Form ex: Nama File “wfBase”, Nama Object “TfBase” Var “fBase”

* Apps Form ex: Nama File “afCust”, Nama Object “TfCust” Var “fCust”

      di bawah ini adalah minimal code yang saya butuhkan, tapi bila ada penambahan Control selain dari bawaan Delphi, ya… harus di cari padanan “Base Class” ex: ComboBox-nya dari Developer Express atau Raize atau LMD agar behaviornya bisa berjalan dengan semestinya (ex: jika combo sudah drop down harus fasilitas panah atas dan bawah mati).

      demikian semoga membantu….

      nb. untuk form inheritance harap melihat ke help Delphi ya…. :-)
    unit wfBase;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, StdCtrls, ExtCtrls, DBCtrls,
      Grids;

    type
    TfBase = class(TForm)
      procedure FormClose( Sender: TObject;
        var Action: TCloseAction);
      procedure FBKeyDown( Sender: TObject;
        var Key: Word; Shift: TShiftState);
      procedure FBKeyPress(Sender: TObject; var Key: Char);
      protected
      procedure WndProc(var Message: TMessage);    override;
      procedure DoClose(var Action: TCloseAction); override;
      { Private declarations }
    public
      LastKey:  Integer;
      KeyMsg:   TMessage;
      { Public declarations }
    end;

    var
      fBase: TfBase;

    implementation

    {$R *.dfm}
    //——————————————————————————
    procedure TfBase.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      Action:= caFree;
    end;
    //——————————————————————————
    procedure TfBase.FBKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    Var
      sClass: string;
    begin
      if not (Shift = []) then exit;
      if Screen.ActiveControl = Nil then Exit;
        sClass := Screen.ActiveControl.ClassName;
      if Screen.ActiveControl is TCustomCombo then begin
        if TCustomCombo(Screen.ActiveControl).DroppedDown
          then Exit;
      end;
      if Screen.ActiveControl is TDBLookupComboBox then begin
        if TDBLookupComboBox(Screen.ActiveControl).ListVisible
          then Exit;
      end;
      if Screen.ActiveControl is TCustomGrid
        then exit; //Base Class for Delphi.Grid
      Case Key of
        VK_DOWN: begin
          SelectNext(Screen.ActiveControl, True, True );
          Key := 0;
        end;
        VK_UP: begin
          SelectNext(Screen.ActiveControl, False, True );
          Key := 0;
        end;
      End;
    end;
    //——————————————————————————
    procedure TfBase.FBKeyPress(Sender: TObject; var Key: Char);
    begin
      if Key=#27 then close;
      if Key<>#13 then exit;
      if Screen.ActiveControl = Nil then exit;
      if Screen.ActiveControl is TCustomCombo then begin
        if TCustomCombo(Screen.ActiveControl).DroppedDown
          then Exit;
      end;
      if Screen.ActiveControl is TCustomGrid
        then exit; //Base Class for Delphi.Grid

      SelectNext(Screen.ActiveControl, True, True );
      Key:= #0;
    end;
    //——————————————————————————
    procedure Tfbase.WndProc(var Message: TMessage);
    begin
      if Message.Msg=45102 then begin
        LastKey:= Message.WParam;
        KeyMsg := Message;
      end;
      inherited;
    end;
    //——————————————————————————
    procedure TfBase.DoClose(var Action: TCloseAction);
    begin
      Action:= caFree;
    end;
    //——————————————————————————
    end.

0 comments: