Το στοιχείο TTreeView Delphi (που βρίσκεται στην καρτέλα παλέτας συστατικών "Win32") αντιπροσωπεύει ένα παράθυρο που εμφανίζει ένα ιεραρχική λίστα στοιχείων, όπως οι επικεφαλίδες ενός εγγράφου, οι καταχωρήσεις σε ένα ευρετήριο ή τα αρχεία και οι κατάλογοι ένα δίσκο.
Κόμβος δέντρου με πλαίσιο ελέγχου ή κουμπί ραδιοφώνου;
Η εφαρμογή TTreeview των Delphi δεν υποστηρίζει εγγενώς πλαίσια ελέγχου, αλλά το βασικό στοιχείο ελέγχου WC_TREEVIEW. Μπορείτε να προσθέσετε πλαίσια ελέγχου στο treeview παρακάμπτοντας τη διαδικασία CreateParams της TTreeView, καθορίζοντας το στυλ TVS_CHECKBOXES για τον έλεγχο. Το αποτέλεσμα είναι ότι όλα κόμβους στην ανίχνευση δέντρου θα έχουν κουτιά ελέγχου που είναι προσαρτημένα σε αυτά. Επιπλέον, η ιδιότητα StateImages δεν μπορεί να χρησιμοποιηθεί πια επειδή το WC_TREEVIEW χρησιμοποιεί αυτό το φανταστικó εσωτερικώς για την υλοποίηση πλαισίων ελέγχου. Αν θέλετε να αλλάξετε τα πλαίσια ελέγχου, θα πρέπει να το χρησιμοποιήσετε Να στείλετε μήνυμα ή το TreeView_SetItem / TreeView_GetItem μακροεντολές
από CommCtrl.pas. Το WC_TREEVIEW υποστηρίζει μόνο πλαίσια ελέγχου και όχι κουμπιά επιλογής.Η προσέγγιση που θα ανακαλύψετε σε αυτό το άρθρο είναι πολύ πιο ευέλικτη: μπορείτε να έχετε checkboxes και κουμπιά ραδιοφώνου αναμειγνύονται με άλλους κόμβους όποιον τρόπο επιθυμείτε χωρίς να αλλάξετε το TTreeview ή να δημιουργήσετε ένα νέο τάξη από αυτό για να κάνει αυτό το έργο. Επίσης, αποφασίζετε τον εαυτό σας ποιες εικόνες πρέπει να χρησιμοποιηθούν για τα πλαίσια ελέγχου / ραδιοεκκαθαρίσματα απλά προσθέτοντας τις κατάλληλες εικόνες στο imagelist StateImages.
Προσθέστε ένα πλαίσιο ελέγχου ή ένα κουμπί ραδιοφώνου
Σε αντίθεση με όσα πιστεύετε, αυτό είναι πολύ απλό να επιτευχθεί Δελφοί. Εδώ είναι τα βήματα για να λειτουργήσει:
- Ρυθμίστε μια λίστα εικόνων (το στοιχείο TImageList στην καρτέλα παλέτας συστατικών "Win32") για την προβολή TTreeview. Ιδιότητα StateImages που περιέχει τις εικόνες για τις ελεγμένες και ανεξέλεγκτες καταστάσεις για πλαίσια ελέγχου και / ή κουμπιά επιλογής.
- Καλέστε τη διαδικασία ToggleTreeViewCheckBoxes (δείτε παρακάτω) στα συμβάντα OnClick και OnKeyDown της προβολής δέντρου. Η διαδικασία ToggleTreeViewCheckBoxes αλλάζει το StateIndex του επιλεγμένου κόμβου για να αντικατοπτρίζει την τρέχουσα κατάσταση που έχει ελεγχθεί / μη ελεγχθεί.
Για να κάνετε το δέντρο σας ακόμα πιο επαγγελματικό, θα πρέπει να ελέγξετε πού έχει γίνει κλικ σε έναν κόμβο πριν από την εναλλαγή των stateimages: με την εναλλαγή μόνο του κόμβου όταν κάνετε κλικ στην πραγματική εικόνα, οι χρήστες σας μπορούν να επιλέξουν τον κόμβο χωρίς να αλλάξουν κατάσταση.
Επιπλέον, εάν δεν θέλετε οι χρήστες σας να επεκτείνουν / συμπτύξουν την προβολή δέντρου, καλέστε τη διαδικασία FullExpand στο συμβάν OnShow Forms και ορίστε το AllowCollapse σε false στο συμβάν OnCollapsing του treeview.
Εδώ είναι η εφαρμογή της διαδικασίας ToggleTreeViewCheckBoxes:
διαδικασία ToggleTreeViewCheckBoxes (
Κόμβος: TTreeNode;
cUnChecked,
cCheck,
cRadioUnchecked,
cRadioChecked: ακέραιο);
var
tmp: TTreeNode;
αρχικά Ανατεθεί (κόμβος) τότε αρχικά Κόμβος. StateIndex = cUnChecked έπειτα
Κόμβος. StateIndex: = cChecked
αλλούαν Κόμβος. StateIndex = cChecked έπειτα
Κόμβος. StateIndex: = cUnChecked
αλλι αν Κόμβος. StateIndex = cRadioUnChecked τότε αρχίζει
tmp: = Κόμβος. Μητρική εταιρεία;
αν όχι Ανατεθεί (tmp) έπειτα
tmp: = TTreeView (κόμβος. TreeView) .Items.getFirstNode
αλλού
tmp: = tmp.getFirstChild;
ενώ Ανατεθεί (tmp) dobeginif (tmp. StateIndex σε
[cRadioUnChecked, cRadioChecked]) έπειτα
tmp. StateIndex: = cRadioUnChecked;
tmp: = tmp.getNextSibling;
τέλος;
Κόμβος. StateIndex: = cRadioChecked;
τέλος; // if StateIndex = cRadioUnCheckedτέλος; // if Assigned (Node)
τέλος; (* ToggleTreeViewCheckBoxes *)
Όπως μπορείτε να δείτε από τον παραπάνω κώδικα, η διαδικασία ξεκινά με την εύρεση οποιωνδήποτε κόμβων κιβωτίου ταχυτήτων και απλά την εναλλαγή τους on ή off. Στη συνέχεια, αν ο κόμβος είναι ένα μη επιλεγμένο κουμπί επιλογής, η διαδικασία μετακινείται στον πρώτο κόμβο στο τρέχον επίπεδο, ορίζει όλους τους κόμβους σε αυτό το επίπεδο στο cRadioUnchecked (αν είναι cRadioUnChecked ή cRadioChecked κόμβοι) και τελικά αλλάζει κόμβο σε cRadioChecked.
Παρατηρήστε πως αγνοούνται τα ήδη επιλεγμένα κουμπιά επιλογής. Προφανώς, αυτό οφείλεται στο γεγονός ότι ένα ήδη επιλεγμένο κουμπί επιλογής θα αλλάξει χωρίς έλεγχο, αφήνοντας τους κόμβους σε μια απροσδιόριστη κατάσταση. Σίγουρα αυτό που θα θέλατε τις περισσότερες φορές.
Εδώ είναι πώς να κάνετε τον κώδικα ακόμα πιο επαγγελματικό: στο συμβάν OnClick της Treeview, γράψτε τον ακόλουθο κώδικα για να αλλάξετε μόνο το, εάν το κλικ state (κάντε κλικ στο stateimage (οι σταθερές cFlatUnCheck, cFlatChecked κ.λπ. ορίζονται αλλού ως ευρετήρια στα StateImages λίστα εικόνων):
διαδικασία TForm1.TreeView1Click (αποστολέας: TObject);
var
P: TPoint;
ξεκινήσει
GetCursorPos (P);
P: = TreeView1.ScreenToClient (P);
αν (htOnStateIcon σε
TreeView1.GetHitTestInfoAt (P.X, P.Y)) έπειτα
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
τέλος; (* TreeView1Click *)
Ο κώδικας παίρνει την τρέχουσα θέση του ποντικιού, μετατρέπει σε συντεταγμένες δέντρου και ελέγχει αν έγινε κλικ στο StateIcon καλώντας τη λειτουργία GetHitTestInfoAt. Αν ήταν, ονομάζεται η διαδικασία εναλλαγής.
Κυρίως, θα περίμενε κανείς ότι το πλήκτρο διαστήματος θα αλλάξει κουτιά επιλογής ή κουμπιά επιλογής, οπότε εδώ θα γράψετε το συμβάν TreeView OnKeyDown χρησιμοποιώντας αυτό το πρότυπο:
διαδικασία TForm1.TreeView1KeyDown (
Αποστολέας: TObject;
λέξη var: λέξη;
Shift: TShiftState);
αρχικά (Κλειδί = VK_SPACE) και
Ανατεθεί (TreeView1.Selected) έπειτα
ToggleTreeViewCheckBoxes (
TreeView1.Selected,
cFlatUnCheck,
cFlatChecked,
cFlatRadioUnCheck,
cFlatRadioChecked);
τέλος; (* TreeView1KeyDown *)
Τελικά, μπορείτε να δείτε πώς τα γεγονότα OnShow της φόρμας και τα γεγονότα OnChanging του Treeview θα μπορούσαν να μοιάζουν αν θέλετε να αποφύγετε την κατάρρευση των κόμβων του δέντρου:
διαδικασία TForm1.FormCreate (αποστολέας: TObject);
ξεκινήσει
TreeView1.FullExpand;
τέλος; (* FormCreate *)
διαδικασία TForm1.TreeView1Κρατώντας (
Αποστολέας: TObject;
Κόμβος: TTreeNode;
var AllowCollapse: Boolean);
ξεκινήσει
AllowCollapse: = false;
τέλος; (* TreeView1Collapsing *)
Τέλος, για να ελέγξετε αν ένας κόμβος είναι επιλεγμένος κάνετε απλά την ακόλουθη σύγκριση (σε ένα πρόγραμμα χειρισμού συμβάντος OnClick του Button, για παράδειγμα):
διαδικασία TForm1.Button1Κλικ (αποστολέας: TObject);
var
BoolResult: boolean;
tn: TTreeNode;
αρχικά Ανατεθεί (TreeView1.Selected) τότε αρχίζει
tn: = TreeView1.Επιλογή;
BoolResult: = tn. StateIndex σε
[cFlatChecked, cFlatRadioChecked];
Memo1.Text: = tn. Κείμενο +
#13#10 +
'Επιλεγμένο:' +
BoolToStr (BoolResult, True);
τέλος;
τέλος; (* Button1Click *)
Αν και αυτός ο τύπος κωδικοποίησης δεν μπορεί να θεωρηθεί κρίσιμος για την αποστολή, μπορεί να δώσει στις εφαρμογές σας πιο επαγγελματική και ομαλότερη εμφάνιση. Επίσης, χρησιμοποιώντας τα πλαίσια ελέγχου και τα κουμπιά επιλογής, μπορείτε να κάνετε ευκολότερη τη χρήση της εφαρμογής σας. Σίγουρα θα φανεί καλό!
Αυτή η εικόνα παρακάτω λήφθηκε από μια εφαρμογή δοκιμής χρησιμοποιώντας τον κώδικα που περιγράφεται σε αυτό το άρθρο. Όπως βλέπετε, μπορείτε να αναμίξετε ελεύθερα τους κόμβους που έχουν πλαίσια ελέγχου ή κουμπιά ραδιοφώνου με αυτά που δεν έχουν κανένα, αν και δεν πρέπει να αναμειγνύετε "κενά" κόμβους με "πλαίσιο ελέγχου"κόμβων (δείτε τα κουμπιά ραδιοφώνου στην εικόνα), καθώς είναι πολύ δύσκολο να δείτε ποιοι κόμβοι σχετίζονται.