Saturday, 21 February 2009

Tentang Drag And Drop Di Dalam Kontrol


Kontrol adalah komponen visual dimana user dapat saling berinteraksi pada waktu runtime.


Drag-and-drop adalah suatu cara yang menyenangkan bagi user untuk memanipulasi objek-objek. Anda dapat mengizinkan user men-drag seluruh kontrol, atau mengizinkannya men-drag item-item dari satu kontrol (misalnya list box atau tree view) ke dalam kontrol lainnya.


Bagaimana memulai operasi drag?


Setiap kontrol mempunyai properti DragMode yang menentukan bagaimana operasi-operasi drag diawali atau diaktifkan. Jika DragMode adalah dmAutomatic, maka operasi drag dimulai secara otomatis ketika user menekan tombol mouse saat cursor berada di atas kontrol. Karena dmAutomatic dapat mengganggu aktifitas mouse, maka Anda boleh menetapkan DragMode ke nilai dmManual (default) dan memulai operasi drag dengan menangani event-event mouse-down.


Untuk memulai operasi drag pada suatu kontrol secara manual, Anda dapat menggunakan metode BeginDrag kontrol. Metode BeginDrag menggunakan parameter Immediate, dan parameter integer optional Threshold. Jika Anda mengirim nilai True ke Immediate, maka operasi drag dimulai dengan segera. Jika Anda mengirim False ke Immediate, maka operasi drag tidak akan dimulai hingga user memindahkan mouse sejumlah pixel yang ditentukan oleh Threshold.


Pemanggilan metode :


BeginDrag (False);

membolehkan kontrol menerima mouse-clicks tanpa memulai operasi drag.

Anda dapat menempatkan kondisi-kondisi lain untuk memulai operasi drag (misalnya pemeriksaan tombol mouse mana yang ditekan oleh user) dengan pengujian parameter-parameter event mouse-down sebelum memanggil BeginDrag. Kode berikut ini menangani event mouse-down dalam suatu file list box dengan mengawali operasi drag hanya jika tombol mouse kiri ditekan.


procedure TFMForm.FileListBox1MouseDown(

Sender: TObject;

Button: TMouseButton;

Shift: TShiftState;

X, Y: Integer);

begin

if Button = mbLeft then { drag only if left button pressed }

with Sender as TFileListBox do { treat Sender as TFileListBox }

begin

if ItemAtPos(Point(X, Y), True) >= 0 then { is there an item here? }

BeginDrag(False); { if so, drag it }

end;

end;



Bagaimana menerima dragged item?


Ketika user men-drag sesuatu di atas sebuah kontrol, maka kontrol tersebut menerima event OnDragOver, dimana pada saat itu kontrol harus mengindikasikan apakah kontrol dapat menerima item ini jika user men-drop-nya di sana. Perubahan drag-cursor mengindikasikan apakah kontrol dapat menerima dragged-item. Untuk menerima dragged-item di atas sebuah kontrol, maka sertakan event handler pada event OnDragOver kontrol.


Drag-over event mempunyai parameter Accept dimana event handler ini dapat ditetapkan ke nilai True jika event akan menerima item. Jika Accept adalah True, maka aplikasi mengirim event drag-and-drop kepada kontrol.


Drag-over event mempunyai parameter-parameter lainnya (termasuk sumber dragging dan lokasi cursor mouse yang aktif) dimana event handler dapat gunakan untuk menentukan apakah akan menerima operasi drop. Di dalam contoh berikut ini, direktori tree-view menerima dragged item hanya jika dragged item berasal dari file list box.


procedure TFMForm.DirectoryOutline1DragOver(

Sender, Source: TObject;

X,Y: Integer;

State: TDragState;

var Accept: Boolean);

begin

if Source is TFileListBox then

Accept := True

else

Accept := False;

end;


Bagaimana men-drop item?


Jika suatu kontrol mengindikasikan bahwa kontrol dapat menerima dragged item, maka kontrol perlu menangani item yang akan di-drop. Untuk menangani dropped items, maka sertakan event handler pada event OnDragDrop kontrol yang akan menerima operasi drop. Seperti halnya dengan drag-over event, event drag-and-drop mengindikasikan sumber dragged item dan koordinat-koordinat cursor mouse pada kontrol yang akan menerima. Parameter terakhir membolehkan Anda memonitor path suatu item yang digunakan saat sedang di-drag. Anda barangkali ingin menggunakan informasi ini untuk mengubah warna komponen ketika cursor dilewatkan di atasnya.


Dalam contoh berikut ini, direktori tree-view (menerima item-item yang di-drag dari file list-box) akan merespon dengan memindahkan file ke direktori dimana file akan di-drop.


procedure TFMForm.DirectoryOutline1DragDrop(

Sender, Source: TObject;

X,Y: Integer);

begin

if Source is TFileListBox then

with DirectoryOutline1 do

ConfirmChange('Move', FileListBox1.FileName, Items[GetItem(X, Y)].FullPath);

end;


Bagaimana mengakhiri operasi drag?


Operasi drag berakhir ketika item berhasil di-drop ataupun di-release di atas sebuah kontrol yang tidak dapat menerimanya. Dalam posisi ini end-drag event dikirim kepada kontrol darimana item di-drag. Untuk memungkinkan sebuah kontrol merespon ketika item-item di-drag, maka sertakan event handler pada event OnEndDrag kontrol.


Parameter paling penting di dalam event OnEndDrag adalah Target, yang mengindikasikan kontrol mana (jika ada) yang akan menerima operasi drop. Jika Target adalah nil, maka ini berarti bahwa tidak ada kontrol yang menerima dragged item. Event OnEndDrag juga menyertakan koordinat-koordinat pada kontrol yang akan menerima.


Dalam contoh berikut, file list box menangani end-drag event dengan me-refresh daftar file-nya.


procedure TFMForm.FileListBox1EndDrag(Sender, Target: TObject; X, Y: Integer);

begin

if Target <> nil then FileListBox1.Update;

end;


Bagaimana mengubah drag mouse pointer?


Anda dapat meng-customize tampilan pointer mouse selama operasi drag dengan cara menetapkan properti DragCursor komponen sumber (hanya untuk VCL).

1 comment:

  1. Gan,, bisa kasih contoh prgramnya ga? saya ga bisa praktekin di mana directoryoutline1 dragdrop.
    mksh

    ReplyDelete

Silahkan tinggalkan pesan