Delphi adalah alat pengembangan perangkat lunak visual berorientasi objek dari Borland Company. Delphi menggabungkan keunggulan Visual C++ dan Visual Basic: mudah digunakan, kuat, dan memiliki keunggulan unik terutama dalam desain antarmuka, pemrograman database, dan pemrograman jaringan.
Pesan di Delphi
Pesan adalah pemberitahuan yang dikirim oleh Windows yang memberitahukan aplikasi bahwa suatu peristiwa telah terjadi. Di Delphi, dalam banyak kasus, pesan Windows dienkapsulasi dalam event VCL. Kita hanya perlu menangani event VCL yang sesuai. Namun, jika kita perlu menulis kontrol kita sendiri, mencegat atau memfilter pesan, kita harus mempelajari mekanisme pemrosesan pesan Win32.
Di Delphi, pesan didefinisikan dalam bentuk catatan TMessage. Buka file Message.pas, kita dapat melihat bahwa Tmessage didefinisikan seperti ini:
jenis
TMessage = catatan yang dikemas
Pesan: Kardinal;
kasus Integer dari
0: (WParam: Longint;
LPam: Longint;
Hasil: Longint);
1: (WParamLo: Kata;
WParamHai: Kata;
LPamLo: Kata;
LParamHai: Kata;
HasilLo: Kata;
HasilHai: Kata);
akhir;
Diantaranya, Msg merupakan nilai konstanta yang berbeda dengan pesan lainnya. Nilai konstanta tersebut dapat berupa konstanta yang telah ditentukan sebelumnya dalam unit Windows atau konstanta yang ditentukan pengguna. Wparam biasanya merupakan nilai konstan yang terkait dengan pesan, atau dapat berupa pegangan ke jendela atau kontrol. LParam biasanya merupakan penunjuk ke data di memori.
Hasilnya adalah nilai kembalian dari pemrosesan pesan. Wparam, Lparam dan Result semuanya 32-bit. Jika Anda ingin mengakses 16 bit bawah atau 16 bit atas, Anda dapat menggunakan WparamLo, WparamHi, LParamLo, LparamHi, ResultLo dan ResultHi.
Selain Tmessage umum, catatan pesan khusus ditentukan untuk setiap Windows di Delphi. Kita dapat menelusuri file Message.pas, dan berikut adalah catatan pesan keyboard:
TWMKey = catatan yang dikemas
Pesan: Kardinal;
Kode Char: Kata;
Tidak Digunakan: Kata;
Data Kunci: Longint;
Hasil: Longint;
Pesan terkait keyboard seperti: catatan WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, dan WM_SYSCHAR juga didefinisikan sebagai TWMkey. Ada pernyataan berikut di file Message.pas:
TWMChar=Kunci TWM;
Kunci TWM;
-KeyDown=Kunci TWM;
Kunci TWM;TWMSysChar=Kunci TWM;
pengiriman pesan
Pemrosesan pesan adalah untuk menentukan bagaimana aplikasi merespons pesan Windows. Di Delphi, setiap pesan memiliki proses pemrosesannya sendiri. Itu harus berupa metode dalam suatu objek, dan hanya dapat meneruskan satu Tmessage atau rekaman pesan khusus lainnya. Harus ada perintah pesan setelah deklarasi metode, diikuti dengan pesan yang berkisar dari 0 ke Konstan antara 32767.
Pesan yang kami sebutkan sebelumnya adalah pesan standar Windows (WM_X). Selain itu, ada pesan internal VCL, pesan notifikasi, dan pesan yang ditentukan pengguna.
Pesan internal VCL biasanya dimulai dengan "CM_" dan digunakan untuk mengelola berbagai hal di dalam VCL. Jika Anda mengubah nilai properti atau beberapa karakteristik lain dari suatu komponen, Anda perlu memberi tahu komponen lain tentang perubahan tersebut melalui pesan internal. Misalnya, pesan aktifkan fokus input dikirim ke komponen yang diaktifkan atau dinonaktifkan untuk menerima atau melepaskan fokus input.
Ada juga pesan notifikasi. Sesuatu terjadi pada kontrol anak di jendela dan jendela induk perlu diberitahukan melalui pesan notifikasi. Ini hanya berfungsi dengan kontrol jendela standar, seperti tombol, kotak daftar, kotak edit, dll. Buka file Message.pas. Setelah Windows standar adalah deklarasi pesan pemberitahuan:
konstanta
{$EXTERNALSYM BN_CLICKED}
BN_KLIK = 0;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
Di atas adalah pesan notifikasi dari tombol tersebut, yang masing-masing menunjukkan bahwa pengguna mengklik tombol tersebut, bahwa tombol tersebut harus digambar ulang, dan bahwa pengguna menyorot tombol tersebut.
Pengguna juga dapat menentukan pesan mereka sendiri, mengirim pesan ke diri mereka sendiri dan menulis prosedur pemrosesan pesan. Nilai konstan pesan adalah WM_USER+100 hingga $7FFF. Rentang ini dicadangkan oleh Windows untuk pesan yang ditentukan pengguna.
Ada tiga metode untuk mengirim pesan Delphi:
1. Lakukan metode objek kelas Tcontrol. Anda dapat mengirim pesan ke formulir atau kontrol apa pun, Anda hanya perlu mengetahui contoh formulir atau kontrol. Pernyataannya adalah sebagai berikut:
fungsi Tcontrol.Perform(Pesan:Kardinal;Wparam,Lparam:Longint):Longint
2. Fungsi Windows API SendMessage() dan Postmessage(). Pernyataannya adalah sebagai berikut:
fungsi SendMessage(hWnd: HWND; Pesan: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
fungsi SendMessage(hWnd: HWND; Pesan: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
Fungsi PostMessage menambahkan pesan ke antrian pesan aplikasi. Loop pesan aplikasi akan mengekstrak pesan terdaftar dari antrian pesan dan kemudian mengirimkannya ke jendela yang sesuai.
Fungsi SendMessage dapat mengirim pesan langsung ke prosedur jendela di antrian pesan. Jadi SendMessage digunakan saat Windows perlu segera mengembalikan nilai, dan PostMessage digunakan saat aplikasi berbeda perlu memproses pesan secara berurutan. Perform pada dasarnya mirip dengan SendMessage, mereka dikirim langsung ke prosedur jendela. Fungsi SendMessage dan Postmessage hanya perlu mengetahui handle window untuk mengirim pesan, sehingga dapat mengirimkan pesan ke form non-Delphi, namun Perform harus mengetahui instance dari form atau kontrol tersebut.
Mekanisme pemrosesan pesan VCL
Terdapat pernyataan application.Run pada kode sumber aplikasi Delphi, fungsinya untuk memulai loop pesan dan kemudian memanggil Application.PRocessMessage. Ketika pesan diambil dari antrian pesan, peristiwa Application.OnMessage dipicu. Dengan cara ini, sebelum Windows sendiri memproses pesan tersebut, ia akan merespons pemrosesan peristiwa OnMessage. Ini lebih unggul dari pemrosesan pesan apa pun dan hanya menerima pesan terdaftar, yaitu pesan yang dikirim melalui PostMessage seperti yang disebutkan di atas. Proses pemrosesan yang merespons kejadian Application.OnMessage harus bertipe TmessageEvent, yang dideklarasikan sebagai berikut:
ketik TMessageEvent = prosedur (var Pesan: TMsg; var Ditangani: Boolean) objek;
Jika TMsg adalah rekaman pesan yang ditentukan di Windows, kita dapat mendeklarasikannya seperti ini:
Prosedur OnMyMessage(var Msg:TMsg;var Handled:Boolean);
Kemudian tetapkan metode ini ke acara Application.OnMessage:
Aplikasi.OnMessage :=OnMyMessage;
Peristiwa OnMessage akan menangkap semua pesan yang dikirim ke aplikasi, yang merupakan peristiwa yang sangat sibuk, sehingga tidak bijaksana untuk menetapkan titik henti sementara selama pemrosesan peristiwa OnMessage untuk pemrosesan pesan.
Metode yang digunakan oleh objek VCL untuk menerima pesan disebut MainWndProc. Ini adalah metode statis yang ditentukan di kelas Twincontrol dan tidak dapat dibebani secara berlebihan. Itu tidak memproses pesan secara langsung. Ketika pesan meninggalkan MainWndProc, pesan diteruskan ke metode WndProc objek. Metode WndProc adalah metode virtual yang ditentukan dalam kelas Tcontrol, yang memanggil metode Dispatch. Dispatch mencari metode pemrosesan yang sesuai berdasarkan Pesan yang masuk. Jika pada akhirnya tidak dapat menemukannya, ia akan terus mencari metode pemrosesan pesan di kelas induk hingga ditemukan. Metode Defaulthandler melakukan pemrosesan akhir pada pesan dan kemudian meneruskan pesan ke fungsi Windows DefWindowProc atau prosedur jendela default lainnya.