תצוגת TreeView עם תיבות סימון וכפתורי רדיו

click fraud protection

רכיב TTreeView Delphi (ממוקם בכרטיסיית לוח הרכיבים "Win32") מייצג חלון המציג רשימה היררכית של פריטים, כגון הכותרות במסמך, הערכים באינדקס או הקבצים והספריות ב דיסק.

צומת עץ עם תיבת סימון או כפתור רדיו?

תצוגת TTreeview של דלפי אינה תומכת באופן טבעי בתיבות סימון, אך הפיקוח הבסיסי של WC_TREEVIEW כן. אתה יכול להוסיף תיבות סימון ל- נוף על ידי עקיפה של נוהל CreateParams של TTreeView, וציין את סגנון TVS_CHECKBOXES עבור הפקד. התוצאה היא שהכל צמתים בתצוגה הצפונית צמודות אליהם תיבות סימון. בנוסף, לא ניתן להשתמש עוד במאפיין StateImages מכיוון שה- WC_TREEVIEW משתמש בפנימי הדמיון הזה כדי ליישם תיבות סימון. אם אתה רוצה להחליף את תיבות הסימון, עליך לעשות זאת באמצעות לשלוח הודעה או ה פקודות מאקרו של TreeView_SetItem / TreeView_GetItem מ CommCtrl.pas. WC_TREEVIEW תומך רק בתיבות סימון, לא בכפתורי רדיו.

הגישה שאתה צריך לגלות במאמר זה היא הרבה יותר גמישה: אתה יכול לקבל תיבות ו לחצני רדיו מעורבבים עם צמתים אחרים בכל דרך שתרצו בלי לשנות את תצוגת TTre או ליצור חדש מעמד מזה כדי להפוך את העבודה הזו. כמו כן, אתה מחליט בעצמך באילו תמונות להשתמש לתיבות הסימון / כפתורי הרדיו פשוט על ידי הוספת התמונות הנכונות לדמיון StateImages.

instagram viewer

הוסף תיבת סימון או לחצן רדיו

בניגוד למה שאתה יכול להאמין, זה די פשוט להשגה דלפי. להלן הצעדים בכדי לגרום לזה לעבוד:

  1. הגדר רשימת תמונות (רכיב TImageList בלשונית לוח הרכיבים "Win32") עבור TTreeview. מאפיין StateImages המכיל את התמונות עבור המצב (ים) המסומנים והלא מסומנים עבור תיבות סימון ו / או לחצני רדיו.
  2. התקשר להליך ToggleTreeViewCheckBoxes (ראה בהמשך) באירועי OnClick ו- OnKeyDown של התצוגה הצפונית. נוהל ToggleTreeViewCheckBoxes משנה את ה- StateIndex של הצומת שנבחר כדי לשקף את המצב הנוכחי שנבדק / לא מסומן.

כדי להפוך את תצוגת הראייה למקצועית עוד יותר, עליך לבדוק לאן לוחצים על צומת לפני שמעבירים לתמונות המצב: על ידי החלפת הצומת רק כאשר לוחצים על התמונה בפועל, המשתמשים שלך עדיין יכולים לבחור את הצומת מבלי לשנות את זה מדינה.

בנוסף, אם אינך רוצה שהמשתמשים שלך ירחיבו / יקרסו את התצוגה הצפית, התקשר להליך FullExpand בטפסים OnShow והגדר את AllowCollapse לשקר באירוע OnCollapsing של treeview.

להלן יישום נוהל ToggleTreeViewCheckBoxes:

תהליך ToggleTreeViewCheckBoxes (
צומת: TTreeNode;
לא מסומן,
בדוק,
cradio לא מסומן,
cRadioChecked: מספר שלם);
var
tmp: TTreeNode;
התחלה הוקצה (צומת) אז בגיניף צומת. StateIndex = cUnecked לאחר מכן
צומת. StateIndex: = c מסומן
אחראם צומת. StateIndex = c מסומן לאחר מכן
צומת. StateIndex: = c לא מסומן
אחרת אם צומת. StateIndex = cRadioUnChecked אז התחיל
tmp: = צומת. הורה;
אם לא הוקצה (tmp) לאחר מכן
tmp: = TTreeView (צומת. TreeView) .Items.getFirstNode
אחר
tmp: = tmp.getFirstChild;
בזמן הוקצה (tmp) dobeginif (tmp. StateIndex בתוך
[cRadioUnChecked, cRadio Checked]) לאחר מכן
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
סוף;
צומת. StateIndex: = cRadioChecked;
סוף; // אם StateIndex = cRadioUnCheckedסוף; // אם מוקצה (צומת)
סוף; (* ToggleTreeViewCheckBoxes *)

כפי שאתה יכול לראות מהקוד שלמעלה, ההליך מתחיל במציאת צמתים של תיבות סימון ופשוט הפעלת או כיבוי של אותם. בשלב הבא, אם הצומת הוא כפתור רדיו שלא סומן, ההליך עובר לצומת הראשון ברמה הנוכחית, מגדיר את כל הצמתים ברמה זו ל- cRadio Unchecked (אם הם cRadioUnChecked או cRadioChecked) ולבסוף מחליף את הצומת ל cRadioChecked.

שימו לב כיצד מתעלמים מכפתורי הרדיו שכבר נבדקו. ברור שהסיבה לכך היא שלחצן הבחירה שכבר נבדק יעבור לבדיקה ולא ישאיר את הצמתים במצב לא מוגדר. בקושי מה שהיית רוצה הכי הרבה זמן.

כך תוכלו להפוך את הקוד למקצועי עוד יותר: באירוע OnClick של ה- Treeview, כתוב את הקוד הבא כדי להחליף רק את תיבות סימון אם לחצו על תמונת המצב (קבצי cFlatUnCheck, cFlatChecked וכו 'מוגדרים במקום אחר כאינדקסים ל- StateImages רשימת תמונות):

תהליך TForm1.TreeView1 לחץ (שולח: נושא);
var
P: TPoint;
התחל
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
אם (htOnStateIcon בתוך
TreeView1.GetHitTestInfoAt (P.X, P.Y)) לאחר מכן
ToggleTreeViewCheckBoxes (
TreeView1. נבחרה,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadio נבדק);
סוף; (* TreeView1 לחץ *)

הקוד מקבל את מיקום העכבר הנוכחי, ממיר לקואורדינטות של תצוגת תצוגה ובודק אם לחצו על StateIcon על ידי קריאה לפונקציה GetHitTestInfoAt. אם זה היה, נקרא נוהל ההחלפה.

לרוב, הייתם מצפים כי סרגל החלל יחליף את תיבות הסימון או כפתורי הרדיו, כך תוכלו לכתוב את האירוע TreeView OnKeyDown באמצעות תקן זה:

תהליך TForm1.TreeView1KeyDown (
שולח: נושא;
var מפתח: Word;
Shift: TShiftState);
התחלה (מפתח = VK_SPACE) ו
הוקצה (TreeView1.Selected) לאחר מכן
ToggleTreeViewCheckBoxes (
TreeView1. נבחרה,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadio נבדק);
סוף; (* TreeView1KeyDown *)

לסיום, להיראות כך OnShow של הטופס ואירועי ה- OnChanging של Treeview יכולים להיראות אם אתה רוצה למנוע קריסת צמתי הצפייה ב treeview:

תהליך TForm1.FormCreate (שולח: TObject);
התחל
TreeView1.FullExpand;
סוף; (* FormCreate *)
תהליך TForm1.TreeView1 מכלול (
שולח: נושא;
צומת: TTreeNode;
var AllowCollapse: בוליאני);
התחל
AllowCollapse: = שקר;
סוף; (* TreeView1 התחלפות *)

לבסוף, כדי לבדוק אם צומתים צומת, פשוט בצעו את ההשוואה הבאה (למשל, במבצע האירועים של כפתור OnClick של כפתור):

תהליך TForm1.Button1Click (שולח: TObject);
var
BoolResult: בוליאני;
tn: TTreeNode;
התחלה הוקצה (TreeView1.Selected) אז התחיל
tn: = TreeView1. נבחרה;
BoolResult: = tn. StateIndex בתוך
[cFlatChecked, cFlatRadio Checked];
תזכיר1.טקסט: = tn. טקסט +
#13#10 +
'נבחר:' +
BoolToStr (BoolResult, נכון);
סוף;
סוף; (* לחצן 1 לחץ *)

אף על פי שלא ניתן לראות קידוד מסוג זה כחיוני למשימה, הוא יכול להעניק ליישומים שלך מראה מקצועי וחלק יותר. כמו כן, על ידי שימוש בתיבות הסימון וכפתורי הרדיו בשיקול דעת, הם יכולים להקל על היישום שלך לשימוש. הם בטוח ייראו טוב!

תמונה זו למטה צולמה מאפליקציית מבחן באמצעות הקוד המתואר במאמר זה. כפי שאתה יכול לראות, אתה יכול בחופשיות לערבב צמתים עם תיבות סימון או לחצני אפשרויות עם אלה שאין להם כאלה, אם כי אסור לך לערבב צמתים "ריקים" עם "תיבת סימון"צמתים (עיין בכפתורי הרדיו שבתמונה) מכיוון שהדבר מקשה מאוד לראות אילו צמתים קשורים.

instagram story viewer