9.2 Langkah Umum untuk Mengembangkan Fungsi Seret dan Jatuhkan
Drag and Drop adalah fungsi yang memfasilitasi operasi objek yang disediakan oleh Windows, dan dapat dengan mudah dikembangkan di Delphi.
keluar. Menurut proses operasi drag-and-drop, langkah-langkah pengembangan dapat dibagi menjadi empat tahap, yaitu:
● Mulai Operasi Seret
● Menerima item seret
● Jatuhkan item seret
● Berhenti menyeret operasi
Selama proses Pendahuluan, kami akan menggabungkan contoh Tabset (Tagged Set) Drag dan Drop Operation. Desain antarmuka ditunjukkan pada gambar.
Saat pengguna menyeret tag ke posisi tag lain saat runtime, tag akan pindah ke lokasi itu dan menyebabkan
Penataan ulang set tag.
9.2.1 Mulai menyeret
Saat DragMode diatur ke Drautomatic, seret secara otomatis ketika pengguna menekan mouse pada kontrol sumber
Mulailah; saat diatur ke DMManual, tentukan apakah akan mulai menyeret dengan menangani acara mouse. Jika Anda ingin mulai menyeret
Gunakan metode begindrag.
Di Tabset Drag and Drop, kami menggunakan pemrosesan acara Mousedown di bawah ini untuk mulai menyeret tag.
Pertama, tentukan apakah tombol kiri yang ditekan adalah tombol kiri, dan kemudian tentukan apakah item tersebut legal.
Prosedur TFORM1.TABSET1MOUSEDOWN (Pengirim: TOBJEKS; Tombol: Tmousebutton;
Shift: tshiftate; x, y: integer);
var
Dragitem: Integer;
Mulai
jika tombol = mbleft lalu
Mulai
Dragitem: = tabset1.itematpos (titik (x, y));
if (dragitem> -1) dan (dragitem <tabset1.tabs.count)
Tabset1.begindrag (false);
akhir;
akhir;
9.2.2 Menerima item yang diseret
Apakah kontrol dapat menerima item seret ditentukan oleh peristiwa OnDragover dari kontrol. Di Tabset menyeret, hal utama adalah menggunakan posisi mouse untuk menilai.
Prosedur TFORM1.TABSET1DRAGOVER (Pengirim, Sumber: Tobject; x, y: integer;
Status: tdragState; var menerima: boolean);
var
Droppos: Integer;
Mulai
jika sumber = tabset1 maka
Mulai
Droppos: = tabset1.itematpos (titik (x, y));
Terima: = (droppos> -1) dan (droppos <> tabset1.tabIndex) dan
(Droppos <tabset1.tabs.count);
akhir;
kalau tidak
Terima: = false;
akhir;
9.2.3 Letakkan item seret
Ketika pengembalian pemrosesan acara OnDragover menerima benar dan item dijatuhkan, acara OnDragdrop
Proses menyeret dan menjatuhkan respons. Dalam instance Tabset Drag and Drop, itu untuk mengubah posisi tag.
Prosedur TFORM1.TABSET1DRAGDROP (Pengirim, Sumber: Tobject; X, Y: Integer);
var
Oldpos: Integer;
Newpos: Integer;
Mulai
jika sumber = tabset1 maka
Mulai
Oldpos: = tabset1.tabIndex;
NewPos: = tabset1.itematpos (point (x, y));
if (newpos> -1) dan (newPos <> oldpos)
Tabset1.tabs.move (oldpos, newpos);
akhir;
akhir;
9.2.4 Operasi Seret Akhir
Ada dua cara untuk mengakhiri operasi seret: baik pengguna melepaskan kunci mouse atau program menggunakan metode enddrag.
Forced Abort Drag. Ada dua konsekuensi dari mengakhiri operasi seret: drop diterima atau drop diabaikan.
Setelah operasi seret selesai, kontrol sumber akan menerima pesan untuk menanggapi acara Drag End Onenddrag.
9.3 Seret dan Jatuhkan Contoh Aplikasi: Seret dan Jatuhkan Dukungan untuk Manajer File
Meskipun Contoh Aplikasi Manajer File yang dikembangkan di Bab 6 telah mulai terbentuk dalam fungsi, itu beroperasi
Dibandingkan dengan Manajer File Windows, masih ada banyak kekurangan. Kelemahan terbesar adalah tidak mendukung pergerakan file seret dan lepas
dan seret dan jatuhkan salin. Di akhir bab ini, kita dapat menebus cacat ini.
File Drag and LO.
Ini akan secara otomatis pindah ke direktori ini;
Saat Anda memakainya dan menjatuhkannya, file akan secara otomatis disalin ke direktori drive saat ini. Kotak daftar file sebagai kontrol sumber dan
Pohon direktori dan label drive dari kontrol target dapat ditempatkan di subwindow yang berbeda. Direktori drive saat ini adalah sub
Hasil operasi terbaru dari jendela, terlepas dari apakah sub-jendela ini memiliki hubungan dengan sumber seret dan target seret.
Untuk mengimplementasikan fungsi di atas, ada dua masalah yang harus diselesaikan terlebih dahulu:
1. Bagaimana cara merekam direktori saat ini dari setiap drive?
Untuk ini kami mendefinisikan variabel global:
var currentdirlist: array [0 ... 25] dari string [70];
Dalam acara Onchange dari DirectoryOutline:
Prosedur tfmform.directoryoutlinechange (pengirim: tobject);
Mulai
CreateCaption;
Filelist.clear;
Filelist.directory: = directoryoutline.directory;
Filelist.update;
CurrentDirlist [drivetabset.tabIndex]: = directoryoutline.directory;
Filemanager.directorypanel.caption: = directoryoutline.directory;
akhir;
Karena Drivetabset menanggapi acara OnClick sebelum menanggapi acara OnDragdrop, dan diaktifkan oleh acara tersebut
Kirim acara Onchange dari DirectoryOutline, sehingga dapat dijamin akan digunakan dalam acara OnDragdrop kapan saja
Item Array CurrentDirlist menjadi string kosong.
2. Bagaimana memastikan tidak relevannya gerakan dan menyalin dengan sub-jendela?
Masalah utama di sini adalah bahwa ketika kami menilai kontrol sumber, kami menggunakan operator IS untuk melakukan pemeriksaan jenis:
Jika sumber adalah Distist maka…
Jika kami menggunakan pernyataan berikut:
Jika Sumber = Distist Kalau Lalu
...
Kemudian operasi dan operasi salin akan terbatas pada ruang lingkup sub-jendela ini.
Ketika kami memecahkan pertanyaan di atas, pekerjaan kami hanya mengikuti langkah -langkah pengembangan umum drag dan drop, dan kami menyelesaikannya langkah demi langkah.
1.Filelist mulai menyeret operasi
Prosedur tfmform.filelistmousedown (pengirim: tobject; tombol: tmousebutton;
Shift: tshiftate; x, y: integer);
Mulai
jika tombol = mbleft lalu
dengan pengirim seperti tfilelistbox
Mulai
Jika itematpos (titik (x, y), true)> = 0 lalu
Begindrag (false);
akhir;
akhir;
ItemAtpos digunakan untuk memeriksa apakah saat ini ada file. Metode Begindrag melewati parameter false, memungkinkan daftar file untuk menangani peristiwa mouse secara terpisah tanpa mulai menyeret. Bahkan, situasi ini ada dalam jumlah besar.
2. DirectoryOutline dan Drivetabset memutuskan apakah akan menerima menyeret dan meletakkannya di tempat.
Prosedur tfmform.directoryoutlinedragover (pengirim, sumber: tobject; x,
Y: Integer;
Mulai
Jika sumbernya adalah TfileListBox
Terima: = true;
akhir;
Prosedur TFMForm.DrivetAbsetDragover (pengirim, Sumber: TOBJEKS; x,
Y: Integer;
var
Proppos: Integer;
Mulai
Jika sumbernya adalah TfileListBox
dengan drivetabset do
Mulai
Proppos: = itematpos (titik (x, y));
Terima: = (proppos> -1) dan (proppos <tabs.count);
akhir;
akhir;
DirectoryOutline adalah penerimaan tanpa syarat, sementara Drivetabset perlu memeriksa apakah itu tag hukum.
3. Seret dan Jatuhkan Respons
DirectoryOutline Drag and Drop digunakan untuk mengimplementasikan fungsi gerakan file. Memanggil acara Confirmchange dalam program ini
Selama proses pemrosesan, jalur target diperoleh dengan directoryoutline.Items [getItem (x, y)]. Fullpath.
Prosedur tfmform.directoryoutlinedragdrop (pengirim, sumber: tobject; x,
Y: Integer);
Mulai
Jika sumbernya adalah TfileListBox
dengan DirectoryOutline lakukan
Mulai
ConfirmChange ('Move', FileList.FileName, item [getItem (x, y)]. Fullpath);
akhir;
akhir;
Drivetabset Drag and Drop digunakan untuk mengimplementasikan fungsi penyalinan file. Mengubah posisi saat ini menjadi driver yang sesuai dalam program
Surat aktuator, jalur target diperoleh oleh CurrentDirlist [drivetabset.tabindex].
Prosedur tFMForm.DrivetAbsetDragdrop (pengirim, Sumber: Tobject; x, y: integer);
var
Apoint: tpoint;
Mulai
Apoint.x: = x; Apoint.y: = y;
Drivetabset.tabIndex: = drivetabset.itematpos (Apoint);
Jika sumbernya adalah TfileListBox
dengan drivetabset do
Mulai
Jika CurrentDirlist [TabIndex] <> '' lalu
ConfirmChange ('Copy', TheFileName, CurrentDirlist [TabIndex]);
akhir;
akhir;
4. Tanggapan Distist untuk Menyeret ujung dan memperbarui daftar file
Prosedur tfmform.filelistendddrag (pengirim, target: tobject; x, y: integer);
Mulai
jika target <> nil maka filelist.update;
akhir;