Delphi เป็นเครื่องมือพัฒนาซอฟต์แวร์เชิงภาพเชิงวัตถุจาก Borland Company Delphi ผสมผสานข้อดีของทั้ง Visual C++ และ Visual Basic: ใช้งานง่าย ทรงพลัง และมีข้อได้เปรียบที่เป็นเอกลักษณ์ โดยเฉพาะอย่างยิ่งในการออกแบบอินเทอร์เฟซ การเขียนโปรแกรมฐานข้อมูล และการเขียนโปรแกรมเครือข่าย
ข้อความใน Delphi
ข้อความคือการแจ้งเตือนที่ส่งโดย Windows เพื่อแจ้งให้แอปพลิเคชันทราบว่ามีเหตุการณ์เกิดขึ้น ใน Delphi ในกรณีส่วนใหญ่ข้อความ Windows จะถูกห่อหุ้มไว้ในเหตุการณ์ VCL เราจำเป็นต้องจัดการเหตุการณ์ VCL ที่เกี่ยวข้องเท่านั้น อย่างไรก็ตาม หากเราจำเป็นต้องเขียนการควบคุม สกัดกั้น หรือกรองข้อความของเราเอง เราจะต้องเจาะลึกกลไกการประมวลผลข้อความ
ใน Delphi ข้อความจะถูกกำหนดในรูปแบบของบันทึก TMessage เปิดไฟล์ Message.pas เราจะเห็นว่า Tmessage ถูกกำหนดไว้ดังนี้:
พิมพ์
TMessage = บันทึกที่อัดแน่น
ข่าวสารเกี่ยวกับ: พระคาร์ดินัล;
กรณี จำนวนเต็มของ
0: (พารามิเตอร์: Longint;
พารามิเตอร์: Longint;
ผลลัพธ์: ลองจินต์);
1: (พารามิเตอร์ Lo: Word;
WParamHi: Word;
พารามิเตอร์ Lo: Word;
Lพารามิเตอร์สวัสดี: Word;
ผลลัพธ์ต่ำ: Word;
ผลลัพธ์สวัสดี: Word);
จบ;
ในหมู่พวกเขา Msg เป็นค่าคงที่ที่แตกต่างจากข้อความอื่น ๆ ค่าคงที่เหล่านี้สามารถกำหนดไว้ล่วงหน้าในหน่วย Windows หรือค่าคงที่ที่ผู้ใช้กำหนด Wparam มักจะเป็นค่าคงที่ที่เกี่ยวข้องกับข้อความ หรืออาจเป็นตัวจัดการหน้าต่างหรือส่วนควบคุมก็ได้ LParam มักจะเป็นตัวชี้ไปยังข้อมูลในหน่วยความจำ
ผลลัพธ์คือค่าส่งคืนของการประมวลผลข้อความ Wparam, Lparam และ Result เป็นแบบ 32 บิตทั้งหมด หากคุณต้องการเข้าถึง 16 บิตล่างหรือ 16 บิตบน คุณสามารถใช้ WparamLo, WparamHi, LParamLo, LparamHi, ResultLo และ ResultHi ตามลำดับ
นอกเหนือจาก Tmessage ทั่วไปแล้ว ยังมีการกำหนดบันทึกข้อความพิเศษให้กับ Windows แต่ละเครื่องใน Delphi เราสามารถเรียกดูไฟล์ Message.pas ได้ และนี่คือบันทึกข้อความบนแป้นพิมพ์:
TWMKey = บันทึกที่อัดแน่น
ข่าวสารเกี่ยวกับ: พระคาร์ดินัล;
ถ่านโค้ด: Word;
ไม่ได้ใช้: คำ;
คีย์ข้อมูล: Longint;
ผลลัพธ์: ลองจินต์;
ข้อความที่เกี่ยวข้องกับแป้นพิมพ์ เช่น: ระเบียน WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP และ WM_SYSCHAR ก็ถูกกำหนดเป็น TWMkey เช่นกัน มีคำสั่งต่อไปนี้ในไฟล์ Message.pas:
TWMChar=TWMkey; TWMKeyDown=
TWMkey; TWMKeyUp=TWMkey;
-KeyDown=TWMkey; TWMSysKeyUp=
TWMkey;TWMSysChar=TWMkey;
การส่งข้อความ
การประมวลผลข้อความคือการกำหนดวิธีที่แอปพลิเคชันตอบสนองต่อข้อความ Windows ใน Delphi แต่ละข้อความมีกระบวนการประมวลผลของตัวเอง จะต้องเป็นวิธีในวัตถุและสามารถส่งผ่าน Tmessage หรือบันทึกข้อความพิเศษอื่น ๆ ได้เพียงรายการเดียวเท่านั้น จะต้องมีคำสั่งข้อความหลังการประกาศวิธีการ ตามด้วยข้อความที่มีค่าตั้งแต่ 0 เป็นค่าคงที่ระหว่าง 32767
ข้อความที่เรากล่าวถึงก่อนหน้านี้เป็นข้อความ Windows มาตรฐานทั้งหมด (WM_X) นอกจากนี้ยังมีข้อความภายใน VCL ข้อความแจ้งเตือน และข้อความที่ผู้ใช้กำหนด
ข้อความภายใน VCL มักจะขึ้นต้นด้วย "CM_" และใช้เพื่อจัดการสิ่งต่างๆ ภายใน VCL หากคุณเปลี่ยนค่าคุณสมบัติหรือคุณลักษณะอื่นๆ ของส่วนประกอบ คุณจะต้องแจ้งส่วนประกอบอื่นๆ ของการเปลี่ยนแปลงผ่านข้อความภายใน ตัวอย่างเช่น ข้อความเปิดใช้งานโฟกัสอินพุตจะถูกส่งไปยังส่วนประกอบที่เปิดใช้งานหรือปิดใช้งานเพื่อยอมรับหรือละทิ้งโฟกัสอินพุต
นอกจากนี้ยังมีข้อความแจ้งเตือน มีบางอย่างเกิดขึ้นกับตัวควบคุมลูกในหน้าต่างและหน้าต่างหลักจำเป็นต้องได้รับแจ้งผ่านข้อความแจ้งเตือน ใช้งานได้กับตัวควบคุมหน้าต่างมาตรฐานเท่านั้น เช่น ปุ่ม กล่องรายการ กล่องแก้ไข ฯลฯ เปิดไฟล์ Message.pas หลังจาก Windows มาตรฐานมีการประกาศข้อความแจ้งเตือน:
ค่าคงที่
{$EXTERNALSYM BN_CLICKED}
BN_คลิก = 0;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
ด้านบนคือข้อความแจ้งเตือนของปุ่ม ซึ่งตามลำดับระบุว่าผู้ใช้คลิกปุ่ม ควรวาดปุ่มใหม่ และผู้ใช้ไฮไลต์ปุ่มตามลำดับ
ผู้ใช้ยังสามารถกำหนดข้อความของตนเอง ส่งข้อความถึงตนเอง และเขียนขั้นตอนการประมวลผลข้อความได้ ค่าคงที่ของข้อความคือ WM_USER+100 ถึง $7FFF ช่วงนี้ถูกสงวนไว้โดย Windows สำหรับข้อความที่ผู้ใช้กำหนด
มีสามวิธีในการส่งข้อความ Delphi:
1. ดำเนินการวิธีการวัตถุของคลาส Tcontrol คุณสามารถส่งข้อความไปยังฟอร์มหรือตัวควบคุมใดก็ได้ คุณเพียงแค่ต้องทราบอินสแตนซ์ของฟอร์มหรือตัวควบคุมเท่านั้น คำแถลงมีดังนี้:
ฟังก์ชัน Tcontrol.Perform (ข่าวสารเกี่ยวกับ: พระคาร์ดินัล; Wparam, Lparam: Longint): Longint
2. ฟังก์ชัน Windows API SendMessage() และ Postmessage() คำแถลงมีดังนี้:
ฟังก์ชั่น SendMessage (hWnd: HWND; ข่าวสารเกี่ยวกับ: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
ฟังก์ชัน SendMessage (hWnd: HWND; ข่าวสารเกี่ยวกับ: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
ฟังก์ชัน PostMessage จะเพิ่มข้อความลงในคิวข้อความของแอปพลิเคชัน ลูปข้อความของแอปพลิเคชันจะแยกข้อความที่ลงทะเบียนไว้ออกจากคิวข้อความแล้วส่งไปยังหน้าต่างที่เกี่ยวข้อง
ฟังก์ชัน SendMessage สามารถส่งข้อความโดยตรงไปยังขั้นตอนหน้าต่างข้ามคิวข้อความ ดังนั้น SendMessage จึงถูกใช้เมื่อ Windows ต้องการส่งคืนค่าทันที และใช้ PostMessage เมื่อแอปพลิเคชันต่างๆ จำเป็นต้องประมวลผลข้อความตามลำดับ การดำเนินการนั้นคล้ายกับ SendMessage โดยพื้นฐานแล้วจะถูกส่งโดยตรงไปยังขั้นตอนของหน้าต่าง ฟังก์ชัน SendMessage และ Postmessage จำเป็นต้องทราบจุดจับของหน้าต่างเพื่อส่งข้อความเท่านั้น เพื่อให้สามารถส่งข้อความไปยังแบบฟอร์มที่ไม่ใช่ Delphi ได้ แต่ Perform ต้องทราบอินสแตนซ์ของแบบฟอร์มหรือตัวควบคุม
กลไกการประมวลผลข้อความ VCL
มีคำสั่ง application.Run ในซอร์สโค้ดของแอปพลิเคชัน Delphi หน้าที่ของมันคือการเริ่มต้นการวนซ้ำข้อความแล้วเรียก Application.PRocessMessage ฟังก์ชันนี้จะค้นหาข้อความในคิวข้อความของแอปพลิเคชัน เมื่อดึงข้อความจากคิวข้อความ เหตุการณ์ Application.OnMessage จะถูกทริกเกอร์ ด้วยวิธีนี้ ก่อนที่ Windows จะประมวลผลข้อความเอง ระบบจะตอบสนองต่อการประมวลผลเหตุการณ์ OnMessage จะดีกว่าการประมวลผลข้อความใดๆ และรับเฉพาะข้อความที่ลงทะเบียนไว้เท่านั้น นั่นคือข้อความที่ส่งโดย PostMessage ตามที่กล่าวไว้ข้างต้น กระบวนการประมวลผลที่ตอบสนองต่อเหตุการณ์ Application.OnMessage ต้องเป็นประเภท TmessageEvent ซึ่งมีการประกาศดังนี้:
พิมพ์ TMessageEvent = ขั้นตอน (var Msg: TMsg; var Handled: Boolean) ของวัตถุ;
โดยที่ TMsg เป็นบันทึกข้อความที่กำหนดไว้ใน Windows เราสามารถประกาศได้ดังนี้:
ขั้นตอน OnMyMessage(var Msg:TMsg;var Handled:Boolean);
จากนั้นกำหนดวิธีการนี้ให้กับเหตุการณ์ Application.OnMessage:
แอปพลิเคชัน OnMessage :=OnMyMessage;
เหตุการณ์ OnMessage จะบันทึกข้อความทั้งหมดที่ส่งไปยังแอปพลิเคชัน ซึ่งเป็นเหตุการณ์ที่ยุ่งมาก ดังนั้นจึงไม่ควรตั้งค่าเบรกพอยต์ระหว่างการประมวลผลเหตุการณ์ OnMessage สำหรับการประมวลผลข้อความ
วิธีการที่ใช้โดยวัตถุ VCL เพื่อรับข้อความเรียกว่า MainWndProc มันเป็นวิธีการคงที่ที่กำหนดไว้ในคลาส Twincontrol และไม่สามารถโอเวอร์โหลดได้ ไม่ประมวลผลข้อความโดยตรง เมื่อข้อความออกจาก MainWndProc ข้อความจะถูกส่งผ่านไปยังวิธี WndProc ของวัตถุ วิธีการ WndProc เป็นวิธีเสมือนที่กำหนดไว้ในคลาส Tcontrol ซึ่งเรียกวิธีการจัดส่ง Dispatch ค้นหาวิธีการประมวลผลที่เกี่ยวข้องตามข้อความที่เข้ามา หากไม่พบ ระบบจะค้นหาวิธีประมวลผลข้อความในคลาสหลักต่อไปจนกว่าจะพบ หากไม่พบ ระบบจะเรียก Defaulthandler วิธี Defaulthandler ทำการประมวลผลขั้นสุดท้ายกับข้อความ และจากนั้น ส่งข้อความไปยังฟังก์ชัน Windows DefWindowProc หรือขั้นตอนหน้าต่างเริ่มต้นอื่น ๆ