Delphi adalah alat pengembangan pemrograman WINDOWS baru yang disediakan oleh Borland. Karena menggunakan bahasa Pascal berorientasi objek (pascal berorientasi objek) yang fleksibel dan dapat digunakan kembali dan memiliki mesin database yang kuat (BDE), kode cepat Kompiler juga menyediakan banyak keunggulan. komponen. Ini disukai oleh sebagian besar programmer. Ini menonjol di antara banyak bahasa pemrograman (seperti VB, PowerBuilder, Powerpoint, dll.).
Salah satu kelebihan DELPHI dibandingkan bahasa pemrograman lain (seperti VB4.0) adalah pesan dapat dikustomisasi di DELPHI dan dapat diproses secara langsung. atau yang ingin mencegat dan memfilter pesan. Ini penting bagi pengguna. Karena komponen penulisan umumnya memerlukan pemrosesan pesan yang sesuai. Berikut ini adalah pengenalan mekanisme pemrosesan pesan di Delphi.
1. Pengiriman pesan di DELPHI VCL
Setiap komponen VCL (Visual Component Library) (seperti Tbutton, Tedit, dll.) di Delphi memiliki mekanisme pemrosesan pesan yang melekat. Intinya adalah kelas komponen menerima pesan tertentu dan mengirimkannya ke metode pemrosesan yang sesuai tidak ada metode pemrosesan khusus, pegangan pemrosesan pesan default dipanggil. Diantaranya, mainwndPROc adalah metode statis yang ditentukan di kelas Twincontrol dan tidak dapat dibebani (Override). Itu tidak memproses pesan secara langsung, tetapi menyerahkannya ke metode wndproc untuk diproses, dan menyediakan modul penanganan pengecualian untuk metode wndproc. Metode Mainwndproc dideklarasikan sebagai berikut:
procedure MainWndProc(var Pesan: TMessage);
Wndproc adalah metode virtual yang didefinisikan dalam kelas Tcontrol, yang memanggil metode pengiriman untuk mendistribusikan pesan. Metode wndproc dideklarasikan sebagai berikut:
prosedur WndProc(var Pesan: TMessage);
Metode pengiriman didefinisikan di kelas root Tobject dan dideklarasikan sebagai berikut:
procedure Tobject.dispatch(var Message); Parameter pesan yang diteruskan ke pengiriman harus berupa tipe rekaman, dan titik masuk pertama dalam rekaman ini harus berupa bidang tipe kardinal (bidang), yang berisi pesan dari pesan yang akan didistribusikan Nomor . Misalnya:
jenis
Pesan=catatan
Pesan: kardinal;
wparam:Kata;
lparam:panjang;
hasil:longint;
akhir;
Metode Dispatch akan memanggil metode handle dari kelas generasi terakhir dari komponen yang menangani pesan ini berdasarkan nomor pesan. Jika tidak ada handler yang sesuai dengan pesan ini di komponen ini dan kelas leluhurnya, metode Dispatch akan memanggil Defaulthandler. Metode Defaulthandler adalah Metode virtual yang didefinisikan dalam Tobject dideklarasikan sebagai berikut:
prosedur Defaulthandler(var Pesan);virtual;
Metode Defaulthandler di kelas Tobject hanya mengimplementasikan pengembalian sederhana tanpa pemrosesan pesan apa pun. Kita dapat mengimplementasikan pemrosesan default pesan di subkelas dengan membebani metode virtual ini. Untuk komponen di VCL, metode Defaulthandler-nya akan memulai windows Fungsi API Defwindowproc untuk memproses pesan.
2. Menangani pemrosesan pesan di DELPHI
Di DELPHI, pengguna dapat menyesuaikan pesan dan penanganan pemrosesan pesan. Definisi penanganan pemrosesan pesan memiliki prinsip berikut:
Metode penanganan pemrosesan pesan harus berupa prosedur, dan hanya dapat meneruskan satu parameter variabel tipe Tmessage.
Deklarasi metode harus diikuti dengan perintah pesan, diikuti dengan label pesan (konstanta bilangan bulat) antara 0 dan 32767.
Metode penangan pesan tidak perlu menggunakan perintah override untuk secara eksplisit menunjukkan penimpaan penangan pesan dari nenek moyang. Selain itu, metode ini umumnya dideklarasikan di area yang dilindungi atau pribadi dari komponen.
Dalam pegangan pemrosesan pesan, pengguna biasanya memproses pesan terlebih dahulu, dan akhirnya menggunakan perintah yang diwarisi untuk memanggil pegangan pemrosesan yang sesuai dengan pesan ini di kelas leluhur (dalam beberapa kasus, mungkin sebaliknya). pesan ini di kelas leluhur mungkin Nama dan tipe parameternya tidak jelas, dan memanggil perintah yang diwarisi dapat menghindari masalah ini Demikian pula, jika tidak ada penangan yang sesuai dengan pesan ini di kelas leluhur, warisan akan secara otomatis memanggil metode Defaulthandler. (Tentu saja, jika Anda ingin memblokir pesan ini, Tidak perlu menggunakan perintah yang diwarisi).
Metode penangan pesan dideklarasikan sebagai:
procedure Mymsgmethod(var pesan:Tmessage); pesan Msgtype;
Demikian pula, pengguna juga dapat menentukan pesan mereka sendiri. Pesan yang ditentukan pengguna harus dimulai dengan WM_USER.
Contoh pesan khusus dan pengendali pemrosesan pesan adalah sebagai berikut:
const my_paint=Wm_pengguna+1;
jenis
Tmypaint=catatan
msgstr:kardinal;
mukuran:kata;
mcolor:longint;
hasil pesan:longint;
akhir;
jenis
Tmycontrol=kelas(TCustomControl)
terlindung
perubahan prosedur(var pesan:Tmypaint); pesan my_paint;
.....
akhir;
...
procedure Tmycontrol.change(var pesan:Tmypaint);
mulai
size:=message.msize; {Setel atribut ukuran Tmybutton}
color:=message.mcolor; {Setel atribut warna Tmybutton}
{lakukan sesuatu yang lain}
diwariskan; { Diserahkan ke Tcustomcontrol}
akhir;
3. Filter pesan
Penyaringan pesan disebut juga perangkap pesan. Dalam keadaan tertentu, pengguna mungkin perlu memblokir pesan tertentu atau mencegat pesan tertentu untuk diproses. Dari pengenalan di atas, kita dapat melihat bahwa umumnya ada tiga cara untuk memfilter pesan: (1) Membebani metode virtual wndproc yang diwarisi oleh komponen. (2). Menulis menangani pemrosesan pesan untuk pesan tertentu. Membebani metode virtual Defhandler yang diwarisi oleh komponen, tempat pesan diproses. Metode yang paling umum digunakan adalah metode (2), yang telah diperkenalkan pada bagian sebelumnya. Metode (1) mirip dengan metode (3). Di sini kami hanya memperkenalkan secara singkat metode (1).
Proses umum membebani metode virtual wndproc adalah sebagai berikut:
prosedur Tmyobject.wndproc(var pesan:Tmessage);
mulai
{... Tentukan apakah pesan ini harus diproses..}
warisan wndproc(pesan);
{Pesan yang belum diproses ditangani oleh metode induk wndproc}
akhir;
Terlihat dari sini bahwa keuntungan memproses pesan dalam metode wndproc adalah dapat memfilter seluruh rentang pesan tanpa harus menentukan pegangan pemrosesan untuk setiap pesan. Faktanya, ini digunakan dalam komponen Tcontrol untuk memfilter dan memproses semua pesan mouse. (Dari WM_mousefirst hingga WM_mouselast, seperti yang ditunjukkan pada kode berikut).
procedure TControl.WndProc(var Pesan: TMessage);
mulai
jika (Pesan.Pesan>=WM_MOUSEFIRST) dan
(Pesan.Pesan <= WM_MOUSELAST)
Kemudian
jika Menyeret maka {Menangani peristiwa seret}
DragMouseMsg(TWMMouse(Pesan))
kalau tidak
... {menangani pesan mouse lainnya}
akhir;
Pengiriman (Pesan);
{Jika tidak, kirim pesan seperti biasa}
akhir;
Contoh berikut adalah contoh komponen kustom sederhana:
Kelas Tmyedit adalah kelas baru yang berasal dari kelas Tedit, ciri-cirinya adalah tidak dapat memperoleh fokus selama pengoperasian dan tidak dapat diinput oleh keyboard (agak mirip dengan komponen Tlabel). Kita dapat memfilter pesan WM_setfocus dan WM_mousemove di dalamnya metode wndproc dan melakukan Untuk mencapai persyaratan di atas, program sumbernya adalah sebagai berikut:
satuan edit saya;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik,
Kontrol, Formulir, Dialog,
StdCtrls;
jenis
Tmyedit = kelas(TEdit)
pribadi
{Deklarasi pribadi}
terlindung
{ Deklarasi yang dilindungi }
{ bidang dan metode lain}
prosedur wndproc(var pesan:Tmessage);override;
publik
{Pernyataan publik}
diterbitkan
{ Deklarasi yang dipublikasikan }
akhir;
prosedur Daftar;
pelaksanaan
prosedur Daftar;
mulai
RegisterComponents('Sampel', [Tmyedit]);
akhir;
prosedur Tmyedit.wndproc(var pesan:tmessage);
mulai
jika message.msg=wm_mousemove maka
mulai
kursor:=crarow;
{Atur kursor ke crarrow alih-alih kursor crBeam default}
KELUAR;
akhir;
jika message.msg=wm_SetFocus lalu keluar;
{Melindungi pesan WM_setfocus dan mencegah kontrol Tmyedit mendapatkan fokus input}
warisan wndproc(pesan);
{Pesan lain diserahkan ke wndproc induk untuk diproses}
akhir;
akhir.
Anda dapat menambahkan Tmyedit ke Palet Komponen untuk menguji kinerjanya.
Seperti terlihat dari pendahuluan di atas, hanya dengan memahami mekanisme pemrosesan pesan di Delphi VCL, menguasai metode dan waktu pemrosesan berbagai pesan (menggunakan berbagai alat jika diperlukan, seperti winsight32, spy, dll), dan menggabungkan karakteristik dari bahasa OOP, kita dapat mengkompilasi komponen berkualitas tinggi. Hal ini tentu saja menuntut pembaca untuk terus mengeksplorasi dan mengumpulkan pengalaman dalam praktik.