Berikut cara mengaktifkan kontrol menyeret dan mengubah ukuran (pada formulir Delphi) dengan mouse, saat aplikasi sedang berjalan.
Form Editor pada Run-Time
Setelah Anda menempatkan kontrol (komponen visual) pada formulir, Anda dapat menyesuaikan posisi, ukuran, dan properti waktu desain lainnya. Namun, ada beberapa situasi ketika Anda harus mengizinkan pengguna aplikasi Anda untuk memposisikan ulang formulir kontrol dan mengubah ukurannya, pada saat run-time.
Untuk mengaktifkan gerakan pengguna runtime dan mengubah ukuran kontrol pada formulir dengan mouse, tiga acara terkait mouse perlu penanganan khusus: OnMouseDown, OnMouseMove, dan OnMouseUp.
Secara teori, katakanlah Anda ingin mengaktifkan pengguna untuk memindahkan (dan mengubah ukuran) kontrol tombol, dengan mouse, pada saat run-time. Pertama, Anda menangani acara OnMouseDown untuk memungkinkan pengguna "meraih" tombol. Selanjutnya, acara OnMouseMove harus memposisikan ulang (bergerak, seret) tombol. Akhirnya, OnMouseUp harus menyelesaikan operasi pemindahan.
Menyeret dan Mengubah Ukuran Kontrol Formulir dalam Praktek
Pertama, lepaskan beberapa kontrol pada formulir. Miliki Kotak Centang untuk mengaktifkan atau menonaktifkan kontrol pemindahan dan pengubahan ukuran saat berjalan.
Selanjutnya, tentukan tiga prosedur (dalam antarmuka bagian dari pernyataan formulir) yang akan menangani acara mouse seperti dijelaskan di atas:
Tipe TForm1 = kelas(TForm)... prosedur ControlMouseDown (Pengirim: TObject; Tombol: TMouseButton; Shift: TShiftState; X, Y: Integer); prosedur ControlMouseMove (Pengirim: TObject; Shift: TShiftState; X, Y: Integer); prosedur ControlMouseUp (Pengirim: TObject; Tombol: TMouseButton; Shift: TShiftState; X, Y: Integer); pribadi inReposisi: boolean; oldPos: TPoint;
Catatan: Dua variabel level bentuk diperlukan untuk menandai jika gerakan kontrol sedang berlangsung (inReposisi) dan untuk menyimpan kontrol posisi lama (oldPos).
Di acara OnLoad formulir, tetapkan prosedur penanganan acara mouse untuk acara yang sesuai (untuk kontrol yang Anda ingin dapat draggable / resizable):
prosedur TForm1.FormCreate (Pengirim: TObject); mulai Button1.OnMouseDown: = ControlMouseDown; Button1.OnMouseMove: = ControlMouseMove; Button1.OnMouseUp: = ControlMouseUp; Edit1.OnMouseDown: = ControlMouseDown; Edit1.OnMouseMove: = ControlMouseMove; Edit1.OnMouseUp: = ControlMouseUp; Panel1.OnMouseDown: = ControlMouseDown; Panel1.OnMouseMove: = ControlMouseMove; Panel1.OnMouseUp: = ControlMouseUp; Button2.OnMouseDown: = ControlMouseDown; Button2.OnMouseMove: = ControlMouseMove; Button2.OnMouseUp: = ControlMouseUp; akhir; (* FormCreate *)
Catatan: kode di atas memungkinkan reposisi run-time dari Button1, Edit1, Panel1, dan Button2.
Akhirnya, inilah kode ajaibnya:
prosedurTForm1.ControlMouseDown ( Pengirim: TObject; Tombol: TMouseButton; Shift: TShiftState; X, Y: Integer);mulaijika (chkPositionRunTime. Diperiksa) DAN (Pengirim adalah TWinControl) kemudianmulai inReposition: = Benar; SetCapture (TWinControl (Sender) .Handle); GetCursorPos (oldPos); akhir; akhir; (* ControlMouseDown *)
ControlMouseDown singkatnya: sekali pengguna menekan tombol mouse di atas kontrol, jika reposisi run-time diaktifkan (kotak centang chkPositionRunTime Diperiksa) dan kontrol yang menerima tetikus turun diturunkan dari TWinControl, tandai reposisi kontrol sedang berlangsung (inReposition: = True) dan pastikan semua pemrosesan mouse ditangkap untuk kontrol - untuk mencegah kejadian "klik" default diproses.
prosedurTForm1.ControlMouseMove ( Pengirim: TObject; Shift: TShiftState; X, Y: Integer);const minWidth = 20; minHeight = 20; var newPos: TPoint; frmPoint: TPoint; mulaijika inReposisi kemudianmulaidengan TWinControl (Pengirim) melakukanmulai GetCursorPos (newPos); jika ssShift di Bergeser kemudianmulai//resize Layar. Kursor: = crSizeNWSE; frmPoint: = ScreenToClient (Mouse. CursorPos); jika frmPoint. X> minWidth kemudian Lebar: = frmPoint. X; jika frmPoint. Y> minHeight kemudian Tinggi: = frmPoint. Y; akhirlain//movemulai Layar. Kursor: = crSize; Kiri: = Kiri - oldPos. X + newPos. X; Atas: = Atas - oldPos. Y + newPos. Y; oldPos: = newPos; akhir; akhir; akhir; akhir; (* ControlMouseMove *)
ControlMouseMove singkatnya: ubah Kursor Layar untuk mencerminkan operasi: jika tombol Shift ditekan, memungkinkan pengubahan ukuran kontrol, atau cukup gerakkan kontrol ke posisi baru (ke mana mouse bergerak). catatan: minWidth dan minHeight konstanta memberikan semacam batasan ukuran (lebar dan tinggi kontrol minimum).
Saat tombol mouse dilepaskan, menyeret atau mengubah ukuran selesai:
prosedurTForm1.ControlMouseUp ( Pengirim: TObject; Tombol: TMouseButton; Shift: TShiftState; X, Y: Integer);mulaijika inReposisi kemudianmulai Layar. Kursor: = crDefault; ReleaseCapture; inReposisi: = Salah; akhir; akhir; (* ControlMouseUp *)
ControlMouseUp singkatnya: ketika pengguna telah selesai bergerak (atau mengubah ukuran kontrol) lepaskan tangkapan mouse (untuk mengaktifkan pemrosesan klik default) dan tandai reposisi selesai.
Dan itu berhasil! Unduh aplikasi sampel dan coba sendiri.
Catatan: Cara lain untuk memindahkan kontrol saat run-time adalah dengan menggunakan Delphi seret dan lepas properti dan metode terkait (DragMode, OnDragDrop, DragOver, BeginDrag, dll.). Menyeret dan menjatuhkan dapat digunakan untuk memungkinkan pengguna menyeret item dari satu kontrol - seperti kotak daftar atau tampilan hierarki - ke yang lain.
Bagaimana Mengenang Posisi dan Ukuran?
Jika Anda mengizinkan pengguna untuk memindahkan dan mengubah ukuran kontrol formulir, Anda harus memastikan bahwa penempatan kontrol entah bagaimana disimpan ketika form ditutup dan posisi masing-masing kontrol dikembalikan ketika form dibuat / dimuat. Berikut cara menyimpan properti Kiri, Atas, Lebar, dan Tinggi, untuk setiap kontrol pada formulir, dalam INI mengajukan.
Bagaimana dengan 8 Ukuran Menangani?
Ketika Anda mengizinkan pengguna untuk memindahkan dan mengubah ukuran kontrol pada formulir Delphi, pada saat run-time menggunakan mouse, untuk sepenuhnya meniru lingkungan desain-waktu, Anda harus menambahkan delapan pegangan ukuran ke makhluk kontrol diubah ukurannya.