คอมโพเนนต์ TTreeView Delphi (อยู่บนแท็บจานสีคอมโพเนนต์ “Win32”) แสดงถึงหน้าต่างที่แสดงรายการตามลำดับชั้น เช่น ส่วนหัวของเอกสาร รายการของดัชนี หรือไฟล์และไดเร็กทอรีบนดิสก์
โหนดต้นไม้พร้อมช่องทำเครื่องหมายหรือปุ่มตัวเลือก?
TTreeview ของ Delphi ไม่รองรับช่องทำเครื่องหมายแบบเนทีฟ แต่การควบคุม WC_TREEVIEW พื้นฐานรองรับ คุณสามารถเพิ่มช่องทำเครื่องหมายใน มุมมอง แบบต้นไม้ได้โดยการแทนที่ขั้นตอน CreateParams ของ TTreeView โดยระบุสไตล์ TVS_CHECKBOXES สำหรับตัวควบคุม ผลลัพธ์คือโหนด ทั้งหมด ในมุมมองแบบต้นไม้จะมีช่องทำเครื่องหมายติดอยู่ นอกจากนี้ ไม่สามารถใช้คุณสมบัติ StateImages ได้อีกต่อไป เนื่องจาก WC_TREEVIEW ใช้รายการรูปภาพนี้เป็นการภายในเพื่อใช้ช่องทำเครื่องหมาย หากคุณต้องการสลับช่องทำเครื่องหมาย คุณจะต้องทำโดยใช้SendMessageหรือมาโคร TreeView_SetItem / TreeView_GetItemจากCommCtrl.pas _ WC_TREEVIEW สนับสนุนเฉพาะช่องทำเครื่องหมาย ไม่ใช่ปุ่มตัวเลือก
วิธีการที่คุณจะค้นพบในบทความนี้มีความยืดหยุ่นมากกว่า คุณสามารถรวมช่องทำเครื่องหมายและปุ่มตัวเลือกเข้ากับโหนดอื่นๆ ได้ตามต้องการโดยไม่ต้องเปลี่ยน TTreeview หรือสร้างคลาสใหม่เพื่อให้ใช้งานได้ นอกจากนี้ คุณยังตัดสินใจได้เองว่าจะใช้รูปภาพใดสำหรับช่องทำเครื่องหมาย/ปุ่มตัวเลือก เพียงเพิ่มรูปภาพที่เหมาะสมลงในรายการรูปภาพของ StateImages
เพิ่มกล่องกาเครื่องหมายหรือปุ่มตัวเลือก
ตรงกันข้ามกับสิ่งที่คุณ อาจเชื่อ มันค่อนข้างง่ายที่จะประสบความสำเร็จในDelphi นี่คือขั้นตอนในการทำงาน:
- กำหนดค่ารายการรูปภาพ (คอมโพเนนต์ TImageList ในแท็บจานสีคอมโพเนนต์ “Win32”) สำหรับคุณสมบัติ TTreeview.StateImages ที่มีรูปภาพสำหรับสถานะที่ทำเครื่องหมายและไม่ได้ทำเครื่องหมายสำหรับช่องทำเครื่องหมายและ/หรือปุ่มตัวเลือก
- เรียกใช้ขั้นตอน ToggleTreeViewCheckBoxes (ดูด้านล่าง) บนเหตุการณ์ OnClick และ OnKeyDown ของมุมมองแบบต้นไม้ ขั้นตอน ToggleTreeViewCheckBoxes เปลี่ยนแปลง StateIndex ของโหนดที่เลือกเพื่อแสดงสถานะปัจจุบันที่ตรวจสอบ/ไม่ได้ตรวจสอบ
เพื่อให้มุมมองแบบต้นไม้ของคุณเป็นมืออาชีพยิ่งขึ้น คุณควรตรวจสอบตำแหน่งที่โหนดถูกคลิกก่อนที่จะสลับอิมเมจสถานะ – โดยการสลับโหนดเมื่ออิมเมจจริงถูกคลิกเท่านั้น ผู้ใช้ของคุณยังคงสามารถเลือกโหนดได้โดยไม่ต้องเปลี่ยนสถานะของคุณ
นอกจากนี้ ถ้าคุณไม่ต้องการให้ผู้ใช้ของคุณขยาย/ยุบมุมมองแบบต้นไม้ ให้เรียกขั้นตอน FullExpand ในเหตุการณ์ OnShow ของแบบฟอร์ม และตั้งค่า AllowCollapse เป็นเท็จในเหตุการณ์ OnCollapsing ของมุมมองแบบต้นไม้
นี่คือการดำเนินการตามขั้นตอน ToggleTreeViewCheckBoxes:
ขั้นตอน ToggleTreeViewCheckBoxes(
โหนด :TTreeNode;
cUnChecked,
cChecked,
cRadioUnchecked,
cRadioChecked :integer);
var
tmp:TTreeNode;
เริ่มต้นหากจัดสรร (โหนด) แล้วเริ่มต้นถ้า Node.StateIndex = cUnChecked แล้ว
Node.StateIndex := cChecked
อย่างอื่น ถ้า Node.StateIndex = cChecked แล้ว Node.StateIndex := cUnchecked อื่นถ้า Node.StateIndex = cRadioUnChecked แล้วเริ่มต้น tmp := Node.Parent; หากไม่ได้รับมอบหมาย (tmp) ให้ tmp := TTreeView(Node.TreeView).Items.getFirstNode อื่น
tmp := tmp.getFirstChild;
ในขณะที่ Assigned(tmp) dobeginif (tmp.StateIndex บน
[cRadioUnChecked,cRadioChecked]) จากนั้น
tmp.StateIndex := cRadioUnChecked;
tmp := tmp.getNextSibling;
สิ้นสุด ;
Node.StateIndex := cRadioChecked;
สิ้นสุด ; // ถ้า StateIndex = cRadioUnChecked สิ้นสุด ; // ถ้าจัดสรร (โหนด)
สิ้นสุด ; (*สลับช่องทำเครื่องหมายมุมมองแบบต้นไม้*)
ดังที่คุณเห็นในโค้ดด้านบน กระบวนการเริ่มต้นด้วยการค้นหาโหนดช่องทำเครื่องหมายและเพียงแค่เปิดหรือปิด ถัดไป หากโหนดเป็นปุ่มเรดิโอที่ไม่ได้ตรวจสอบ โพรซีเดอร์จะย้ายไปยังโหนดแรกที่ระดับปัจจุบัน ตั้งค่าโหนดทั้งหมดในระดับนั้นเป็น cRadioUnchecked (ไม่ว่าจะเป็นโหนด cRadioUnChecked หรือ cRadioChecked) และสุดท้ายเปลี่ยน Node เป็น cRadioChecked
สังเกตว่าปุ่มตัวเลือกที่ตรวจสอบแล้วจะถูกละเว้นอย่างไร นี่เป็นเพราะปุ่มเรดิโอที่ตรวจสอบแล้วจะถูกเปลี่ยนเป็นไม่เลือก ปล่อยให้โหนดอยู่ในสถานะที่ไม่ได้กำหนด แทบจะไม่ได้สิ่งที่คุณต้องการเป็นส่วนใหญ่
ต่อไปนี้เป็นวิธีทำให้โค้ดเป็นมืออาชีพยิ่งขึ้น: ในเหตุการณ์ OnClick ของ Treeview ให้เขียนโค้ดต่อไปนี้เพื่อสลับช่องทำเครื่องหมายเฉพาะเมื่อมีการคลิกอิมเมจสถานะ (ค่าคงที่ cFlatUnCheck, cFlatChecked ฯลฯ ถูกกำหนดไว้ที่อื่นเป็นดัชนีในรายการ StateImages ของ ภาพ) :
ขั้นตอน TForm1.TreeView1Click (ผู้ส่ง: TObject);
var
P:PointT;
เริ่ม
GetCursorPos(P);
P := TreeView1.ScreenToClient(P);
ถ้า (htOnStateIcon ใน
TreeView1.GetHitTestInfoAt(PX,PY)) แล้ว
ToggleTreeViewCheckBoxes(
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
สิ้นสุด ; (*TreeView1Click*)
รหัสรับตำแหน่งปัจจุบันของเมาส์ แปลงเป็นพิกัดมุมมองต้นไม้ และตรวจสอบว่า StateIcon ถูกคลิกหรือไม่โดยเรียกฟังก์ชัน GetHitTestInfoAt ถ้าเป็นเช่นนั้น จะเรียกขั้นตอนการสลับ
ส่วนใหญ่คุณคาดหวังให้สเปซบาร์สลับช่องทำเครื่องหมายหรือปุ่มเรดิโอ ดังนั้นนี่คือวิธีเขียนเหตุการณ์ TreeView OnKeyDown โดยใช้มาตรฐานนั้น:
ขั้นตอน TForm1.TreeView1KeyDown (
ผู้ส่ง: TObject;
var คีย์: Word;
Shift: TShiftState);
เริ่มต้น (คีย์ = VK_SPACE) และ
มอบหมาย (TreeView1.Selected) จากนั้น
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
สุดท้าย; (*TreeView1KeyDown*)
สุดท้าย นี่คือลักษณะของเหตุการณ์ OnShow ของแบบฟอร์มและเหตุการณ์ OnChanging ของ Treeview หากคุณต้องการป้องกันไม่ให้โหนด treeview ยุบ:
ขั้นตอน TForm1.FormCreate (ผู้ส่ง: TObject);
เริ่มต้น
TreeView1.FullExpand;
สิ้นสุด ; (*FormCreate*)
ขั้นตอน TForm1.TreeView1Collapsing(
ผู้ส่ง: TObject;
โหนด: TTreeNode;
var AllowCollapse: บูลีน);
เริ่มต้น
AllowCollapse := เท็จ;
สิ้นสุด ; (*TreeView1ยุบ*)
สุดท้าย หากต้องการตรวจสอบว่ามีการตรวจสอบโหนดหรือไม่ เพียงทำการเปรียบเทียบต่อไปนี้ (ในตัวจัดการเหตุการณ์ OnClick ของปุ่ม เป็นต้น):
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
var
BoolResult:บูลีน;
tn : TTreeNode;
เริ่มต้นหากได้รับมอบหมาย (TreeView1.Selected) จากนั้นเริ่มต้น
tn := TreeView1.Selected;
BoolResult := tn.StateIndex บน
[cFlatChecked,cFlatRadioChecked];
Memo1.Text := tn.Text +
#13#10 +
'Selected:' +
BoolToStr(BoolResult, True);
สิ้นสุด ;
สิ้นสุด ; (*ปุ่ม1คลิก*)
แม้ว่าการเขียนโค้ดประเภทนี้จะไม่ถือเป็นภารกิจสำคัญ แต่ก็ช่วยให้แอปพลิเคชันของคุณดูเป็นมืออาชีพและราบรื่นยิ่งขึ้น นอกจากนี้ การใช้ช่องทำเครื่องหมายและปุ่มตัวเลือกอย่างชาญฉลาด จะทำให้แอปของคุณใช้งานได้ง่ายขึ้น พวกเขาจะดูดีอย่างแน่นอน!
รูปภาพด้านล่างนี้นำมาจากแอปทดสอบโดยใช้รหัสที่อธิบายไว้ในบทความนี้ อย่างที่คุณเห็น คุณสามารถผสมโหนดที่มีช่องทำเครื่องหมายหรือปุ่มเรดิโอกับโหนดที่ไม่มีได้อย่างอิสระ แม้ว่าคุณไม่ควรผสมโหนด “ว่าง” กับโหนด “ช่องทำเครื่องหมาย” (ดูปุ่มเรดิโอในภาพ) แบบนี้จะทำให้ เป็นการยากที่จะดูว่าโหนดใดเกี่ยวข้องกัน