membuat komponen delegasi mouse event

Ketika membuat aplikasi yang mengeksploitasi penanganan event mouse (mousedown, mousemove, mouseup) untuk berbagai keperluan (selection, draw, transform), solusi umum dalam paradigma prosedural adalah dengan menyimpan variabel global yang menyatakan modus kerja saat ini.

Dalam paradigma berorientasi objek, penggunaan variabel state (dan penggunaan analisa kasus jamak (case of/if-then)) bisa jauh dikurangi. Jadinya penasaran untuk membuat komponen kecil dalam delphi untuk menangani pendelegasian penanganan mouse event.

(* file : MouseEventHandler.pas 
    auth: Peb Ruswono Aryan
*)
unit MouseEventHandler;

interface

uses
  SysUtils, Classes, Controls;

type
  TMouseEventHandler = class(TComponent)
  protected
    { Protected declarations }
    FButtonDown : boolean;
    FOnMouseDown : TMouseEvent;
    FOnMouseUp : TMouseEvent;
    FOnMouseMove : TMouseMoveEvent;
  published
    { Published declarations }
    property BtnDown : boolean read FButtonDown write FButtonDown;
    property OnMouseMove : TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
    property OnMouseDown : TMouseEvent read FOnMouseDown write FOnMouseDown;
    property OnMouseUp : TMouseEvent read FOnMouseUp write FOnMouseUp;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMouseEventHandler]);
end;

end.

Alasan kelas ini dijadikan turunan komponen VCL (TComponent) adalah supaya inisialisasinya tidak perlu ditempatkan di penangan event onCreate tapi bisa disimpan di deskripsi form (.dfm).


object SelMouseHandler: TMouseEventHandler
    OnMouseMove = SelMouseMove
    OnMouseDown = SelMouseDown
    OnMouseUp = SelMouseUp
    Left = 296
    Top = 36
end

8 comments

  1. glubot · Juli 28, 2008

    saya lagi ingin tahu bagaimana windows menangani klik kanan pada teks yang di-select. Saya ingin menambahkan menu pilihan baru pada konteks menu yang muncul (undo;cut, copy, paste, delete;select all).
    ada ide??

    http://zer0toinfty.wordpress.com

  2. Andri · Agustus 26, 2008

    Bung peb, saya kok masih bingung ya, sebenarnya komponen yang Anda buat itu fungsinya apa? Apa supaya gampang mengganti2 tiga even tersebut waktu runtime? Kalo gitu kok gak ada properti Control yang mau di-handle?

    Sori, masih bingung… newbie sich๐Ÿ˜€

  3. pebbie · Agustus 26, 2008

    @Andri: komponen ini (kalo buat saya) sangat berguna bwt aplikasi grafik (menggambar 2D) atau GIS.๐Ÿ˜€

    jadi kalau ganti mode mouse (select, draw, zoom) tinggal assign objek aja.๐Ÿ˜€

  4. Andri · Agustus 27, 2008

    oic…

    trus cara penggunaannya kayak gimana? apa seperti ini :

    var
    evt : TMouseEventHandler


    Shape1.OnMouseMove := evt.OnMouseMove;
    Shape1.OnMouseDown := evt.OnMouseDown;
    Shape1.OnMouseUp := evt.OnMouseUp;
    evt.BtnDown := False;

    ………?

    Trus di dalam event handlernya, gimana kita bisa ngakses evt & Shape1 (selain di-hardcode) ?

  5. pebbie · Agustus 27, 2008


    interface
    type
    TForm1=class(TForm)
    published
    :
    :
    DrawMouseHandler: TMouseEventHandler;
    SelectMouseHandler: TMouseEventHandler;
    procedure DrawMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure DrawMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure DrawMouseMove(Sender: TObject; Shift: TShiftState;
    X, Y: Integer);
    procedure SelectMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure SelectMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure SelectMouseMove(Sender: TObject; Shift: TShiftState;
    X, Y: Integer);
    protected
    mode : TMouseEventHandler;
    public
    end;
    :
    :
    implementation
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    mode.BtnDown := true;
    if Assigned(mode.OnMouseDown) then
    mode.OnMouseDown(Sender, Button, Shift, X, Y);
    end;

    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
    X, Y: Integer);
    begin
    if Assigned(mode.OnMouseMove) then
    mode.OnMouseMove(Sender, Shift, X, Y);
    end;

    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    mode.BtnDown := false;
    if Assigned(mode.OnMouseUp) then
    mode.OnMouseUp(Sender, Button, Shift, X, Y);
    end;

    procedure TForm1.BtnDrawClick(Sender: TObject);
    begin
    mode := DrawMouseHandler;
    end;

    procedure TForm1.BtnSelectClick(Sender: TObject);
    begin
    mode := SelectMouseHandler;
    end;

    objek DrawMouseHandler dan SelectMouseHandler bisa diatur di file .dfm atau diatur di event FormCreate;

    DrawMouseHandler := TMouseEventHandler.Create;
    DrawMouseHandler.OnMouseDown := DrawOnMouseDown;
    DrawMouseHandler.OnMouseUp := DrawOnMouseUp;
    DrawMouseHandler.OnMouseMove := DrawOnMouseMove;
    { dst untuk SelectMouseHandler }

  6. Andri · Agustus 27, 2008

    O, gitu ya…
    Thx atas penjelasannya…, kayaknya bisa ditiru nih๐Ÿ˜€

  7. yan · Oktober 24, 2008

    salam kenal.
    saya minta tolong donk tunjukin komponen2 mouse,cos nie ge ad tugas nie…

  8. isa · September 30, 2009

    ass,,sy baru banget pake delphi..penasaran,,gmn cara nya mouse bisa select object grafis yang udah kita bkin? thx..

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s