Αποθηκεύστε μια συμβολοσειρά μαζί με μια συμβολοσειρά στον κατάλογο των Δελφών

Το TListBox και το TComboBox του Delphi εμφανίζουν μια λίστα στοιχείων - συμβολοσειρές σε μια λίστα "επιλέξιμων". Το TListBox εμφανίζει μια λίστα με κύλιση, το TComboBox εμφανίζει μια αναπτυσσόμενη λίστα.

Μια κοινή ιδιότητα όλων των παραπάνω ελέγχων είναι η Στοιχεία ιδιοκτησία. Τα στοιχεία ορίζουν μια λίστα των συμβολοσειρών που θα εμφανιστούν στον έλεγχο στον χρήστη. Κατά τη διάρκεια του σχεδιασμού, όταν κάνετε διπλό κλικ στην ιδιότητα Ιδιότητες, ο "επεξεργαστής λίστας στοιχειοσειρών" σας επιτρέπει να καθορίσετε στοιχεία στοιχειοσειράς. Η ιδιότητα Είδη είναι στην πραγματικότητα ένας απόγονος τύπου TStrings.

Δύο χορδές ανά στοιχείο σε λίστα;

Υπάρχουν περιπτώσεις που θέλετε να εμφανίσετε ένα λίστα συμβολοσειρών για τον χρήστη, για παράδειγμα στο πλαίσιο ελέγχου του καταλόγου λίστας, αλλά έχουν και έναν τρόπο να αποθηκεύστε μια ακόμη σειρά συμβόλων κατά μήκος αυτής που εμφανίζεται στον χρήστη.

Επιπλέον, μπορεί να θέλετε να αποθηκεύσετε / επισυνάψετε περισσότερα από μια απλή συμβολοσειρά στη συμβολοσειρά, ίσως να θέλετε επισυνάψτε ένα αντικείμενο στο στοιχείο (συμβολοσειρά).

instagram viewer

ListBox. Είδη - TStrings "Γνωρίζει" Αντικείμενα!

Δώστε στο αντικείμενο TStrings μια ακόμα ματιά στο σύστημα Βοήθειας. Υπάρχει το Αντικείμενα ιδιότητα που αντιπροσωπεύει ένα σύνολο αντικειμένων που σχετίζονται με κάθε μία από τις χορδές στην ιδιότητα Strings - όπου η ιδιότητα Strings αναφέρει τις πραγματικές συμβολοσειρές στη λίστα.

Αν θέλετε να εκχωρήσετε μια δεύτερη συμβολοσειρά (ή ένα αντικείμενο) σε κάθε συμβολοσειρά του πλαισίου λίστας, πρέπει να συμπληρώσετε την ιδιότητα Items κατά την εκτέλεση.

Ενώ μπορείτε να χρησιμοποιήσετε το ListBox. Στοιχεία. Προσθήκη για να προσθέσετε συμβολοσειρές στη λίστα, για να συσχετίσετε ένα αντικείμενο με κάθε συμβολοσειρά, θα χρειαστεί να χρησιμοποιήσετε μια άλλη προσέγγιση.

ο ListBox. Στοιχεία. AddObject η μέθοδος δέχεται δύο παραμέτρους. Η πρώτη παράμετρος, "Στοιχείο", είναι το κείμενο του στοιχείου. Η δεύτερη παράμετρος, "AObject" είναι το αντικείμενο που σχετίζεται με το αντικείμενο.

Σημειώστε ότι το πλαίσιο λίστας εμφανίζει το Πρόσθεσε είδος η οποία κάνει τα ίδια με τα στοιχεία. AddObject.

Δύο χορδές για μία συμβολοσειρά

Δεδομένου ότι και τα δύο στοιχεία. Το AddObject και το AddItem δέχονται μια μεταβλητή τύπου TObject για τη δεύτερη παράμετρο τους, μία γραμμή όπως:

/ / compile error!
ListBox1.Items. AddObject ('zarko', 'gajic'); 

θα έχει ως αποτέλεσμα ένα σφάλμα κατάτμησης: E2010 Μη συμβατοί τύποι: 'TObject' και 'string'.

Δεν μπορείτε απλά να προμηθεύσετε μια συμβολοσειρά για το αντικείμενο, αφού στους Δελφούς οι τιμές των συμβολοσειρών Win32 δεν είναι αντικείμενα.

Για να αντιστοιχίσετε μια δεύτερη συμβολοσειρά στο στοιχείο πλαισίου λίστας, πρέπει να "μετατρέψετε" μια μεταβλητή συμβολοσειράς σε ένα αντικείμενο - χρειάζεστε ένα προσαρμοσμένο αντικείμενο TString.

Ένα ακέραιο για μια συμβολοσειρά

Εάν η δεύτερη τιμή που πρέπει να αποθηκεύσετε μαζί με το στοιχείο συμβολοσειράς είναι μια ακέραια τιμή, στην πραγματικότητα δεν χρειάζεστε μια προσαρμοσμένη κλάση TInteger.

 ListBox1.AddItem («Zarko Gajic», TObject (1973)) · 

Η παραπάνω γραμμή αποθηκεύει τον ακέραιο αριθμό "1973" μαζί με την προστιθέμενη συμβολοσειρά "Zarko Gajic".

Μια άμεση μετάδοση τύπου από έναν ακέραιο σε ένα αντικείμενο γίνεται παραπάνω. Η παράμετρος "AObject" είναι στην πραγματικότητα ο δείκτης 4 byte (διεύθυνση) του αντικειμένου που προστέθηκε. Δεδομένου ότι στο Win32 ένας ακέραιος καταλαμβάνει 4 byte - ένα τέτοιο σκληρό cast είναι δυνατό.

Για να επαναφέρετε τον ακέραιο αριθμό που σχετίζεται με τη συμβολοσειρά, πρέπει να μετακινήσετε το "αντικείμενο" πίσω στην τιμή ακέραιου αριθμού:

// έτος == 1973
έτος: = Ακέραιος (ListBox1.Items. Αντικείμενα [ListBox1.Items. IndexOf («Zarko Gajic»)]) · 

Ένας έλεγχος των Delphi για μια συμβολοσειρά

Γιατί να σταματήσετε εδώ; Η αντιστοίχιση των συμβολοσειρών και των ακεραίων σε μια συμβολοσειρά σε ένα πλαίσιο λίστας είναι, όπως μόλις βιώσατε, ένα κομμάτι κέικ.

Δεδομένου ότι τα στοιχεία ελέγχου Delphi είναι πραγματικά αντικείμενα, μπορείτε να επισυνάψετε ένα στοιχείο ελέγχου σε κάθε συμβολοσειρά που εμφανίζεται στο πλαίσιο λίστας.

Ο ακόλουθος κώδικας προσθέτει στα γραμματοσειρά ListBox1 (λίστα λίστας) όλων των στοιχείων ελέγχου TButton σε μια φόρμα (τοποθετήστε το στο πρόγραμμα επεξεργασίας συμβάντων OnCreate της φόρμας) μαζί με την αναφορά σε κάθε κουμπί.

var idx: ακέραιο; ξεκινήσειΓια idx: = 0 προς το -1 + ComponentCount κάνωξεκινήσειαν Στοιχεία [idx] είναι TButton έπειτα ListBox1.AddObject (TButton (Εξαρτήματα [idx]). Λεζάντα, Εξαρτήματα [idx]); τέλος; τέλος; 

Για να "κάντε κλικ" στο "δεύτερο" κουμπί, μπορείτε να χρησιμοποιήσετε την επόμενη πρόταση:

 TButton (ListBox1.Items. Αντικείμενα [1]). 

Θέλω να εκχωρήσω τα προσαρμοσμένα αντικείμενα μου στο στοιχείο στοιχειοσειράς

Σε μια πιο γενική κατάσταση, θα προσθέσετε περιπτώσεις (αντικείμενα) των δικών σας προσαρμοσμένων κλάσεων:

τύπος TStudent = τάξηιδιωτικός fName: string; fYear: ακέραιο; δημόσιοιδιοκτησία Ονομα: string read fName; ιδιοκτησία Έτος: ακέραιος ανάγνωση fYear; κατασκευαστής Δημιουργώ(const όνομα: σειρά; const έτος: ακέραιο). τέλος;... κατασκευαστής TStudent. Δημιουργώ(const όνομα: σειρά; const έτος: ακέραιο). ξεκινήσει fName: = όνομα; fYear: = έτος; τέλος; ξεκινήσει// προσθέστε δύο συμβολοσειρές / αντικείμενα -> μαθητές στη λίστα ListBox1.AddItem ('John', TStudent. Δημιουργία («John», 1970)). ListBox1.AddItem ('Jack', TStudent. Δημιουργία («Jack», 1982)). // αρπάξτε τον πρώτο μαθητή - Τζον μαθητής: = ListBox1.Items. Αντικείμενα [0] όπως και TStudent; // εμφανίζει το έτος του Ιωάννη ShowMessage (IntToStr (φοιτητής. Ετος)); τέλος; 

Αυτό που δημιουργείτε πρέπει να είναι ελεύθερο

Ακολουθεί το τι πρέπει να πει η Βοήθεια για τα αντικείμενα στους απογόνους του TStrings: Το αντικείμενο TStrings δεν κατέχει τα αντικείμενα που προσθέτετε με αυτόν τον τρόπο. Τα αντικείμενα που προστίθενται στο αντικείμενο TStrings εξακολουθούν να υπάρχουν ακόμη και αν καταστραφεί η περίπτωση TStrings. Πρέπει να είναι καταστραφεί ρητά από την αίτηση.

Όταν προσθέτετε αντικείμενα σε χορδές - αντικείμενα που δημιουργείτε - πρέπει να βεβαιωθείτε ότι έχετε απελευθερώσει τη μνήμη που καταλαμβάνεται ή ότι θα έχετε ένα έλλειψη μνήμης

Μια γενική προσαρμοσμένη διαδικασία FreeObjects δέχεται μια μεταβλητή τύπου TStrings ως τη μοναδική της παράμετρο. Το FreeObjects θα απελευθερώσει οποιαδήποτε αντικείμενα που σχετίζονται με ένα στοιχείο στη λίστα συμβολοσειρών Στο παραπάνω παράδειγμα, οι μαθητές (τάξη TStudent) είναι συνδεδεμένοι με μια συμβολοσειρά σε ένα πλαίσιο λίστας, όταν η εφαρμογή πρόκειται να κλείσει (για παράδειγμα, το κύριο γεγονός OnDestroy), πρέπει να απελευθερώσετε τη μνήμη κατειλημμένος:

 FreeObjects (ListBox1.Items); 

Σημείωση: Ονομάζετε αυτή τη διαδικασία μόνο όταν έχετε δημιουργήσει αντικείμενα που έχουν αντιστοιχιστεί σε στοιχεία συμβολοσειράς.