Jak umieścić pole wyboru w DBGrid

Istnieje wiele sposobów i powodów, aby dostosować wyniki DBGrid w Delfy. Jednym ze sposobów jest dodanie pól wyboru, aby wynik był bardziej atrakcyjny wizualnie.

Domyślnie, jeśli masz w polu danych pole boolean, DBGrid wyświetla je jako „Prawda” lub „Fałsz” w zależności od wartości pola danych. Wygląda jednak znacznie lepiej, jeśli wybierzesz opcję „true”, aby umożliwić edycję pól.

Utwórz przykładową aplikację

Uruchom nowy formularz w Delphi i umieść TDBGrid, TADOTable i TADOConnection, TDataSource.

Pozostaw wszystkie nazwy komponentów takimi, jakie są, kiedy zostały po raz pierwszy upuszczone w formularzu (DBGrid1, ADOQuery1, AdoTable1 itp.). Użyj Inspektora obiektów, aby ustawić właściwość ConnectionString składnika ADOConnection1 (TADOConnection), aby wskazać przykładową bazę danych QuickiesContest.mdb MS Access.

Podłącz DBGrid1 do DataSource1, DataSource1 do ADOTable1, a na końcu ADOTable1 do ADOConnection1. Właściwość ADOTable1 TableName powinna wskazywać na tabelę artykułów (aby DBGrid wyświetlał rekordy tabeli artykułów).

instagram viewer

Jeśli poprawnie ustawiłeś wszystkie właściwości, po uruchomieniu aplikacji (biorąc pod uwagę, że właściwość Active składnika ADOTable1 to Prawda), domyślnie powinieneś zobaczyć, że DBGrid wyświetla wartość pola logicznego jako „Prawda” lub „Fałsz” w zależności od wartości danych pole.

CheckBox w DBGrid

Aby pokazać pole wyboru w komórce DBGrid, musimy udostępnić je w czasie wykonywania.

Wybierz stronę „Kontrola danych” w Paleta komponentów i wybierz TDBCheckbox. Upuść jedną w dowolnym miejscu na formularzu - nieważne gdzie, ponieważ przez większość czasu będzie niewidoczna lub unosi się nad siatką.

Wskazówka: TDBCheckBox to kontrolka uwzględniająca dane, która pozwala użytkownikowi wybrać lub odznaczyć jedną wartość, która jest odpowiednia dla pól boolowskich.

Następnie ustaw właściwość Visible na False. Zmień właściwość Color DBCheckBox1 na ten sam kolor co DBGrid (aby wtapiał się w DBGrid) i usuń podpis.

Co najważniejsze, upewnij się, że DBCheckBox1 jest podłączony do DataSource1 i do właściwego pola.

Należy zauważyć, że wszystkie powyższe wartości właściwości DBCheckBox1 można ustawić w zdarzeniu OnCreate formularza w następujący sposób:

procedura TForm1.FormCreate (Sender: TObject);
zaczynać
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Winner';
DBCheckBox1.Visible: = False;
DBCheckBox1.Color: = DBGrid1.Color;
DBCheckBox1.Caption: = '';
// wyjaśniono w dalszej części artykułu
DBCheckBox1.ValueChecked: = 'Tak, zwycięzca!';
DBCheckBox1.ValueUnChecked: = 'Nie tym razem.';
koniec;

To, co nastąpi później, to najciekawsza część. Podczas edycji pola boolowskiego w DBGrid, musimy upewnić się, że DBCheckBox1 znajduje się nad („pływającą”) komórką w DBGrid wyświetlającym pole boolowskie.

Dla pozostałych (nieostrych) komórek zawierających pola logiczne (w kolumnie „Zwycięzca”) musimy przedstawić graficzną reprezentację wartości logicznej (True / False). Oznacza to, że potrzebujesz co najmniej dwóch obrazów do rysowania: jednego dla stanu zaznaczonego (wartość True) i jednego dla stanu niezaznaczonego (wartość False).

Najłatwiejszym sposobem na osiągnięcie tego jest użycie funkcji DrawFrameControl interfejsu API systemu Windows do rysowania bezpośrednio na kanwie DBGrid.

Oto kod w module obsługi zdarzeń OnDrawColumnCell DBGrid, który występuje, gdy siatka musi pomalować komórkę.

procedura TForm1.DBGrid1DrawColumnCell (
Nadawca: TObject; const Rect: TRect; DataCol:
Liczba całkowita; Kolumna: TColumn; State: TGridDrawState);
const Sprawdzone: szyk[Logiczny] z Liczba całkowita =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK lub DFCS_CHECKED);
var
DrawState: Integer;
DrawRect: TRect;
beginif (gdFocused w Stan) thenbeginif (Kolumna. Pole. FieldName = DBCheckBox1.DataField) wtedy zacznij
DBCheckBox1.Left: = Rect. Lewy + DBGrid1. Lewy + 2;
DBCheckBox1.Top: = Rect. Top + DBGrid1.top + 2;
DBCheckBox1.Width: = Rect. Z prawej - Rect. Lewo;
DBCheckBox1.Height: = Rect. Dół - Prostownik Top;
DBCheckBox1.Visible: = True;
endendelsebeginif (Kolumna. Pole. FieldName = DBCheckBox1.DataField) wtedy zacznij
DrawRect: = Rect;
InflateRect (DrawRect, -1, -1);
DrawState: = ISChecked [Kolumna. Pole. AsBoolean];
DBGrid1.Canvas. FillRect (Rect);
DrawFrameControl (DBGrid1.Canvas. Uchwyt, DrawRect,
DFC_BUTTON, DrawState);
koniec;
koniec;
koniec;

Aby zakończyć ten krok, musimy upewnić się, że DBCheckBox1 jest niewidoczny po opuszczeniu komórki:

procedura TForm1.DBGrid1ColExit (Sender: TObject);
beginif DBGrid1.SelectedField. FieldName = DBCheckBox1.DataField następnie
DBCheckBox1.Visible: = False
koniec;

Potrzebujemy jeszcze tylko dwóch wydarzeń.

Zauważ, że w trybie edycji wszystkie naciśnięcia klawiszy idą do komórki DBGrid, musimy upewnić się, że są one wysyłane do CheckBox. W przypadku CheckBox interesuje nas przede wszystkim klawisz [Tab] i klawisz [Spacja]. [Tab] powinien przenieść fokus wejściowy do następnej komórki, a [Spacja] powinien przełączać stan CheckBox.

procedura TForm1.DBGrid1KeyPress (Sender: TObject; var Key: Char);
beginif (klucz = Chr (9)) następnie Wyjdź;
gdyby (DBGrid1.SelectedField. FieldName = DBCheckBox1.DataField) wtedy zacznij
DBCheckBox1.SetFocus;
SendMessage (DBCheckBox1.Handle, WM_Char, word (Key), 0);
koniec;
koniec;

Może być właściwe, aby podpis pola wyboru zmieniał się, gdy użytkownik zaznacza lub odznacza to pole. Zauważ, że DBCheckBox ma dwie właściwości (ValueChecked i ValueUnChecked) używane do określenia wartości pola reprezentowanej przez pole wyboru, gdy jest zaznaczone lub niezaznaczone.

Ta właściwość ValueChecked zawiera „Tak, zwycięzca!”, A ValueUnChecked oznacza „Nie tym razem”.

procedura TForm1.DBCheckBox1Click (Sender: TObject);
beginif DBCheckBox1.Checked następnie
DBCheckBox1.Caption: = DBCheckBox1.ValueChecked
jeszcze
DBCheckBox1.Caption: = DBCheckBox1.ValueUnChecked;
koniec;

Uruchom projekt, a zobaczysz pola wyboru w całej kolumnie pola Zwycięzca.

instagram story viewer