Arsip: Bikin ListBox Bisa NgeDrag And Drop Seperti WinAmp


by MrMixer in Form more 13 years ago 3800
Banyak program-program pemutar musik terkenal seperti iTunes atau WinAmp, bisa men-drag and drop file-file yang ada di Windows Explorer langsung ke dalam daftar Playlistnya. Fasilitas drag and drop ListBox yang canggih ini, ternyata bisa juga lho anda buat sendiri dengan program Delphi anda.
Tidak percaya ??!! Nah.. Biar kamu percaya, saya punya contoh gimana supaya ListBox anda bisa ngeDrag and drop seperti iTunes atau Winamp. Caranya gampang.. Anda tidak perlu koq, sampai bertapa di bawah pohon beringin segala.
Yang penting anda tahu rahasia bagaimana memanipulasi windows procedure untuk meresponds messages control yang dikirim. Dalam kasus ini adalah message WM_DROPFILES, sehingga anda bisa memanfaatkannya untuk kepentingan program anda.
Berikut adalah contoh bagaimana bikin ListBox bisa ngeDrag and Drop sekeren iTunes atau WinAmp. Mungkin supaya anda tambah gaul, tidak ada salahnya kalau anda coba kenalan lebih jauh dengan fungsi Windows API seperti "DragAcceptFiles',"DragQueryFile" dan "DragFinish"
Selamat mencoba..

PS:
Jangan lupa ya untuk menambahkan ShellApi.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellAPI;
type
pDaftarFile = ^TDaftarFile;
TDaftarFile = Record
Filename : String;
Path : String;
end;
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
DaftarFile : pDaftarFile;
procedure NgeDROPFiles(var Msg: TMessage);
procedure CustomWindowProc(var Message: TMessage);
procedure IsiList(sFileName: string);
end;
var
Form1: TForm1;
implementation
var
WindowProcAwal: TWndMethod;
{$R *.DFM}
procedure TForm1.IsiList(sFileName: string);
begin
New(DaftarFile);
DaftarFile^.Filename := ExtractFilename(sFilename);
DaftarFile^.Path := ExtractFilePath(sFilename);
ListBox1.Items.AddObject(DaftarFile^.Filename, TObject(DaftarFile));
end;
procedure TForm1.CustomWindowProc(var Message: TMessage);
begin
// Jika Message yang dikirim, user sedang mendrop file kedalam list box
  // maka jalankan prosudur buatan anda sendiri
  if Message.Msg = WM_DROPFILES then
NgeDROPFiles(Message);
// Pastikan Original WindowProc dari ListBox juga menerima message
  // biar tidak ngiri..
  WindowProcAwal(Message);
end;
//Proses manipulasi pesan dari Windows
procedure TForm1.NgeDROPFiles(var Msg: TMessage);
var
NamaFile: PChar;
i, SizeBuffer, JumlahFile: integer;
begin
// Inisialisasi Nama File
  NamaFile := '';
// Hitung Jumlah File Yang Akan Di Drop Pada ListBox
  JumlahFile := DragQueryFile(Msg.wParam, $FFFFFFFF, NamaFile, 255);
for i := 0 to JumlahFile - 1 do
begin
//Cari Nilai Buffer Dari File yang akan dimuat
  SizeBuffer := DragQueryFile(Msg.wParam, i, nil, 0) + 1;
//Alokasikan Buffer Dari File yang akan dimuat
  NamaFile := StrAlloc(SizeBuffer);
//Ambil nama file yang akan didrop
  DragQueryFile(Msg.wParam, i, NamaFile, SizeBuffer);
//Jika file tersebut ada maka masukkan kedalam ListBox
  if FileExists(NamaFile) then
IsiList(NamaFile);
//Alokasi kembali buffer yang digunakan sebelumnya
  StrDispose(NamaFile);
end;
//Bersihkan kembali Memory yang dialokasikan untuk mendrop file
  DragFinish(Msg.wParam);
//Letakkan Posisi Kursor ListBox ke file yang telah didrop
  Listbox1.ItemIndex := ListBox1.Items.Count-JumlahFile;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Simpan Original WindowProc ListBox
  WindowProcAwal := ListBox1.WindowProc;
// Ganti WindowProc ListBox dengan Fungsi milik anda sendiri
  ListBox1.WindowProc := CustomWindowProc;
// Pastikan Bahwa ListBox anda kini bisa menerima fungsi Drag File
  DragAcceptFiles(ListBox1.Handle, True);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Kembalikan WindowProc ListBox Ke Originalnya
  ListBox1.WindowProc := WindowProcAwal;
// Pastikan Bahwa ListBox anda kini tidak bisa menerima fungsi Drag File lagi
  DragAcceptFiles(ListBox1.Handle, False);
end;
end.
Syntax Highlighted with https://pascal-id.org/syntax
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com