Πώς να τοποθετήσετε ένα πλαίσιο ελέγχου σε ένα DBGrid

Υπάρχουν πολλοί τρόποι και λόγοι για να προσαρμόσετε την έξοδο ενός a DBGrid σε Δελφοί. Ένας τρόπος είναι να προσθέσετε πλαίσια ελέγχου έτσι ώστε το αποτέλεσμα να είναι πιο οπτικά ελκυστικό.

Από προεπιλογή, εάν έχετε ένα πεδίο boolean στο σύνολο δεδομένων σας, το DBGrid τα εμφανίζει ως "True" ή "False" ανάλογα με την τιμή του πεδίου δεδομένων. Ωστόσο, φαίνεται πολύ καλύτερα αν επιλέξετε να χρησιμοποιήσετε ένα "αληθινό" πλαίσιο ελέγχου για να ενεργοποιήσετε την επεξεργασία των πεδίων.

Δημιουργήστε μια Δειγματική Εφαρμογή

Ξεκινήστε μια νέα φόρμα στους Δελφούς και τοποθετήστε ένα TDBGrid, TADOTable και TADOConnection, TDataSource.

Αφήστε όλα τα ονόματα των συστατικών όπως είναι όταν τα πρώτα βυθίστηκαν στη φόρμα (DBGrid1, ADOQuery1, AdoTable1, κλπ.). Χρησιμοποιήστε τον επιθεωρητή αντικειμένων για να ορίσετε μια ιδιότητα ConnectionString του στοιχείου ADOConnection1 (TADOConnection), για να δείξετε στο δείγμα QuickiesContest.mdb βάση δεδομένων MS Access.

Συνδέστε το DBGrid1 με το DataSource1, το DataSource1 με το ADOTable1 και τέλος το ADOTable1 με το ADOConnection1. Η ιδιότητα ADOTable1 TableName θα πρέπει να δείχνει στον πίνακα των άρθρων (για να εμφανίσει το DBGrid τις εγγραφές του πίνακα των άρθρων).

instagram viewer

Εάν έχετε ορίσει σωστά όλες τις ιδιότητες, όταν εκτελείτε την εφαρμογή (δεδομένου ότι είναι η ενεργή ιδιότητα του στοιχείου ADOTable1 είναι True) θα πρέπει να δείτε, από προεπιλογή, το DBGrid εμφανίζει την τιμή του πεδίου boolean ως "True" ή "False", ανάλογα με την αξία των δεδομένων πεδίο.

CheckBox σε DBGrid

Για να εμφανιστεί ένα πλαίσιο ελέγχου μέσα σε ένα κελί ενός DBGrid, θα χρειαστεί να το διαθέσουμε για εμάς κατά το χρόνο εκτέλεσης.

Επιλέξτε τη σελίδα "Στοιχεία ελέγχου δεδομένων" στη σελίδα Παλέτα στοιχείων και επιλέξτε ένα TDBCheckbox. Βάλτε ένα οπουδήποτε στη φόρμα - δεν έχει σημασία πού, δεδομένου ότι τις περισσότερες φορές θα είναι αόρατο ή θα επιπλέει πάνω από το πλέγμα.

Υπόδειξη: Το TDBCheckBox είναι ένα στοιχείο ελέγχου δεδομένων που επιτρέπει στον χρήστη να επιλέξει ή να αποεπιλέξει μια μόνο τιμή, η οποία είναι κατάλληλη για τα πεδία boolean.

Στη συνέχεια, ορίστε την ιδιότητα Visible σε False. Αλλάξτε την ιδιότητα χρώματος του DBCheckBox1 στο ίδιο χρώμα με το DBGrid (έτσι συνδυάζεται με το DBGrid) και αφαιρέστε το λεζάντα.

Το πιο σημαντικό, βεβαιωθείτε ότι το DBCheckBox1 είναι συνδεδεμένο με το DataSource1 και το σωστό πεδίο.

Σημειώστε ότι όλες οι παραπάνω τιμές ιδιότητας του DBCheckBox1 μπορούν να οριστούν στο συμβάν OnCreate της φόρμας, όπως αυτή:

διαδικασία TForm1.FormCreate (αποστολέας: TObject);
ξεκινήσει
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Νικητής';
DBCheckBox1.Visible: = Λάθος;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';
// εξηγείται αργότερα στο άρθρο
DBCheckBox1.ValueChecked: = 'Ναι νικητής!';
DBCheckBox1.ValueUnChecked: = 'Όχι αυτή τη φορά.';
τέλος;

Αυτό που έρχεται στη συνέχεια είναι το πιο ενδιαφέρον κομμάτι. Κατά την επεξεργασία του πεδίου boolean στο DBGrid, πρέπει να βεβαιωθείτε ότι το DBCheckBox1 βρίσκεται πάνω από ("floating") το κελί στο DBGrid που εμφανίζει το πεδίο boolean.

Για τα υπόλοιπα (μη εστιασμένα) κελιά που φέρουν τα boolean πεδία (στη στήλη "Winner"), πρέπει να παρέχουμε κάποια γραφική αναπαράσταση της τιμής boolean (True / False). Αυτό σημαίνει ότι χρειάζεστε τουλάχιστον δύο εικόνες για σχεδίαση: μία για την ελεγμένη κατάσταση (True value) και μία για την μη ελεγμένη κατάσταση (False value).

Ο ευκολότερος τρόπος για να επιτευχθεί αυτό είναι να χρησιμοποιήσετε τη λειτουργία API Windows DrawFrameControl για να σχεδιάσετε απευθείας στον καμβά του DBGrid.

Εδώ είναι ο κώδικας στο χειριστή συμβάντος OnDrawColumnCell του DBGrid που συμβαίνει όταν το δίκτυο χρειάζεται να ζωγραφίσει ένα κελί.

διαδικασία TForm1.DBGrid1DrawColumnCell (
Αποστολέας: TObject; const Rect: TRect; DataCol:
Ακέραιος αριθμός; Στήλη: Τοπίο; Κράτος: TGridDrawState);
const IsChecked: πίνακας[Boolean] του Integer =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK ή DFCS_CHECKED).
var
DrawState: Ακεραίο.
DrawRect: TRect;
αρχικά (gdFocused σε Κατάσταση) τότε αρχικά (Στήλη. Πεδίο. FieldName = DBCheckBox1.DataField) τότε αρχίζει
DBCheckBox1.Left: = Rect. Αριστερά + DBGrid1.Left + 2?
DBCheckBox1.Top: = Rect. Κορυφή + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Δεξιά - Rect. Αριστερά;
DBCheckBox1.Height: = Rect. Κάτω - Rect. Μπλουζα;
DBCheckBox1.Visible: = True;
endendelsebeginif (Στήλη. Πεδίο. FieldName = DBCheckBox1.DataField) τότε αρχίζει
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1).
DrawState: = ISChecked [Στήλη. Πεδίο. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Handle, DrawRect,
DFC_BUTTON, DrawState).
τέλος;
τέλος;
τέλος;

Για να ολοκληρώσετε αυτό το βήμα, πρέπει να βεβαιωθείτε ότι το DBCheckBox1 είναι αόρατο όταν βγούμε από το κελί:

διαδικασία TForm1.DBGrid1ColExit (αποστολέας: TObject);
αρχικά DBGrid1.SelectedField. FieldName = DBCheckBox1.DataField έπειτα
DBCheckBox1.Visible: = Λάθος
τέλος;

Χρειαζόμαστε μόνο δύο ακόμη γεγονότα για να τα χειριστούμε.

Σημειώστε ότι όταν βρίσκεστε σε λειτουργία επεξεργασίας, όλες οι πληκτρολογήσεις πηγαίνουν στο κελί του DBGrid, πρέπει να βεβαιωθούμε ότι αποστέλλονται στο CheckBox. Στην περίπτωση ενός CheckBox ενδιαφέρουμε κυρίως τα πλήκτρα [Tab] και [Space]. [Tab] θα πρέπει να μετακινήσει την εστίαση εισόδου στο επόμενο κελί και το [Space] θα πρέπει να αλλάξει την κατάσταση του CheckBox.

διαδικασία TForm1.DBGrid1KeyPress (αποστολέας: TObject; var Key: Char).
αρχικά (κλειδί = Chr (9)) στη συνέχεια, Έξοδος;
αν (DBGrid1.SelectedField. FieldName = DBCheckBox1.DataField) τότε αρχίζει
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, λέξη (κλειδί), 0);
τέλος;
τέλος;

Θα ήταν ενδεδειγμένο να αλλάξει ο λεζάντας του πλαισίου ελέγχου, καθώς ο χρήστης ελέγχει ή καταργεί την επιλογή του πλαισίου. Σημειώστε ότι το DBCheckBox έχει δύο ιδιότητες (ValueChecked και ValueUnChecked) που χρησιμοποιούνται για να καθορίσετε την τιμή πεδίου που αντιπροσωπεύεται από το πλαίσιο ελέγχου όταν είναι επιλεγμένο ή μη ελεγμένο.

Αυτή η ιδιότητα ValueChecked περιέχει "Ναι, ένας νικητής!" Και το ValueUnChecked ισούται με "Όχι αυτή τη φορά".

διαδικασία TForm1.DBCheckBox1Click (αποστολέας: TObject);
αρχικά DBCheckBox1.Checked έπειτα
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
αλλού
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
τέλος;

Εκτελέστε το έργο και θα δείτε τα πλαίσια ελέγχου στη στήλη του πεδίου Winner.