Kaip įdėti žymimąjį langelį į „DBGrid“

Yra daugybė būdų ir priežasčių tinkinti a išvestį „DBGrid“ į Delfi. Vienas iš būdų - pridėti žymimuosius laukelius, kad rezultatas būtų vizualiai patrauklesnis.

Pagal numatytuosius nustatymus, jei duomenų rinkinyje turite loginį lauką, „DBGrid“ juos rodo kaip „tikra“ arba „klaidinga“, atsižvelgiant į duomenų lauko vertę. Tačiau atrodo daug geriau, jei pasirinksite naudoti „tikrąjį“ žymės langelio valdiklį, kad įgalintumėte laukų redagavimą.

Sukurkite programos pavyzdį

Pradėkite naują formą „Delphi“ ir įdėkite „TDBGrid“, „TADOTable“ ir „TADOConnection“, „TDataSource“.

Palikite visų komponentų pavadinimus tokius, kokie jie buvo, kai jie pirmą kartą buvo įmesti į formą (DBGrid1, ADOQuery1, AdoTable1 ir kt.). Naudokite „Object Inspector“, kad nustatytumėte komponento „ADOConnection1“ („TADOConnection“) „ConnectionString“ ypatybę, kad nukreiptumėte į „QuickiesContest.mdb MS Access“ duomenų bazės pavyzdį.

Prijunkite „DBGrid1“ prie „DataSource1“, „DataSource1“ prie „ADOTable1“ ir galiausiai „ADOTable1“ prie „ADOConnection1“. „ADOTable1 TableName“ savybė turėtų nurodyti straipsnių lentelę (kad „DBGrid“ pateiktų straipsnių lentelės įrašus).

instagram viewer

Jei tinkamai nustatėte visas ypatybes, paleisdami programą (turėdami omenyje, kad ADOTable1 komponento savybė Aktyvi yra Tiesa), pagal numatytuosius nustatymus turėtumėte pamatyti DBGrid, atsižvelgiant į duomenų vertę, loginio lauko reikšmę kaip „teisingą“ arba „klaidingą“. laukas.

„CheckBox“ „DBGrid“

Norėdami parodyti žymimąjį langelį „DBGrid“ langelyje, turėsime jį pateikti mums paleidimo metu.

Pasirinkite „Duomenų valdikliai“ puslapį Komponentų paletė ir išsirink a „TDBCheckbox“. Pameskite bet kurią formos formą - nesvarbu kur, nes dažniausiai ji bus nematoma arba plūduriuoja per tinklelį.

Patarimas: „TDBCheckBox“ yra duomenų valdiklis, leidžiantis vartotojui pasirinkti arba panaikinti pažymėjimą viena reikšme, kuri tinka loginiams laukams.

Tada nustatykite „Visible“ savybę „False“. Pakeiskite „DBCheckBox1“ savybę „Colour“ į tokią pačią spalvą kaip ir „DBGrid“ (taigi ji susimaišo su „DBGrid“) ir pašalinkite antraštę.

Svarbiausia, įsitikinkite, kad „DBCheckBox1“ yra prijungtas prie „DataSource1“ ir teisingo lauko.

Atminkite, kad visas aukščiau nurodytas „DBCheckBox1“ nuosavybės vertes galima nustatyti formos „OnCreate“ įvykyje taip:

procedūra TForm1.FormCreate (Siuntėjas: TObject);
prasideda
DBCheckBox1.DataSource: = DataSource1;
DBCheckBox1.DataField: = 'Nugalėtojas';
„DBCheckBox1.Visible“ = klaidinga;
„DBCheckBox1.Color“: = DBGrid1.Color;
„DBCheckBox1.Caption“: = '';
// paaiškinta vėliau straipsnyje
DBCheckBox1.ValueChecked: = 'Taip, nugalėtojas!';
DBCheckBox1.ValueUnChecked: = 'Ne šį kartą.';
galas;

Kas bus toliau, yra įdomiausia dalis. Redaguodami loginį lauką „DBGrid“, turime įsitikinti, kad „DBCheckBox1“ yra aukščiau („plūduriuojančio“) langelio „DBGrid“, kuriame rodomas loginis laukas.

Likusiems (nefokusuotiems) langeliams, turintiems loginius laukus (stulpelyje „Nugalėtojas“), turime pateikti grafinę loginės vertės (True / False) atvaizdą. Tai reiškia, kad jums reikia bent dviejų paveikslėlių piešimui: vienas patikrintai būsenai (tikroji vertė) ir kitas nepatikrintai būsenai (klaidinga reikšmė).

Lengviausias būdas tai padaryti yra naudoti „Windows API“ funkciją „DrawFrameControl“, norint piešti tiesiai ant „DBGrid“ drobės.

Štai DBGrid „OnDrawColumnCell“ įvykių apdorojimo priemonės kodas, kuris atsiranda, kai tinkleliui reikia dažyti langelį.

procedūra „TForm1.DBGrid1DrawColumnCell“ (
Siuntėjas: „TObject“; const Rect: TRect; „DataCol“:
Sveikasis skaičius; Stulpelis: TC stulpelis; Valstija: TGridDrawState);
const Patikrinta: masyvas[Loginis] apie Sveikasis skaičius =
(DFCS_BUTTONCHECK, DFCS_BUTTONCHECK arba DFCS_CHECKED);
var
„DrawState“: sveikasis skaičius;
DrawRect: TRect;
pradžia („gdFocused“) į Valstija) tadabeginifas (Kolona. Laukas. FieldName = DBCheckBox1.DataField) tada pradedama
„DBCheckBox1.Left“: = Rekt. Kairė + DBGrid1.Kairė + 2;
„DBCheckBox1.Top“: = Rekt. „Top + DBGrid1.top + 2“;
„DBCheckBox1.Width“: = Rekt. Dešinė - Rekt. Kairė;
„DBCheckBox1.Height“: = Rekt. Apačia - Rekt. Viršuje;
DBCheckBox1.Visible: = Tiesa;
endendelsebeginif (Kolona. Laukas. FieldName = DBCheckBox1.DataField) tada pradedama
DrawRect: = Rect;
„InflateRect“ („DrawRect“, -1, -1);
DrawState: = Patikrinta [stulpelis. Laukas. AsBoolean];
„DBGrid1.Canvas“. FillRect (Rect);
„DrawFrameControl“ („DBGrid1.Canvas“). Rankena, „DrawRect“,
DFC_BUTTON, „DrawState“);
galas;
galas;
galas;

Norėdami baigti šį veiksmą, turime įsitikinti, kad „DBCheckBox1“ nematomas, kai išeiname iš langelio:

procedūra „TForm1.DBGrid1ColExit“ (siuntėjas: „TObject“);
pradžia „DBGrid1.SelectedField“. FieldName = DBCheckBox1.DataField tada
„DBCheckBox1.Visible“ = klaidinga
galas;

Mums reikia dar dviejų įvykių.

Atminkite, kad redagavimo režimu visi klavišų paspaudimai eina į „DBGrid“ langelį, mes turime įsitikinti, ar jie yra nusiųsti į „CheckBox“. „CheckBox“ atveju mus pirmiausia domina mygtukai [Tab] ir [Space]. [Tab] turėtų perkelti įvesties židinį į kitą langelį, o [Space] turėtų perjungti žymės langelio būseną.

procedūra TForm1.DBGrid1KeyPress (Siuntėjas: TObject; var raktas: Char);
pradžia (raktas = Chr (9)) tada išeiti;
jei („DBGrid1.SelectedField“. FieldName = DBCheckBox1.DataField) tada pradedama
„DBCheckBox1.SetFocus“;
„SendMessage“ („DBCheckBox1.Handle“, „WM_Char“, „word“ (raktas), 0);
galas;
galas;

Gali būti tikslinga pakeisti žymimąjį laukelį Antraštė, kai vartotojas žymės langelį arba panaikina jo žymėjimą. Atminkite, kad „DBCheckBox“ turi dvi savybes („ValueChecked“ ir „ValueUnChecked“), naudojamas nurodyti lauko vertę, kurią nurodo žymimasis laukelis, kai jis yra pažymėtas arba nepažymėtas.

Ši „ValueChecked“ nuosavybė yra „Taip, nugalėtojas!“, O „ValueUnChecked“ prilygsta „Ne šį kartą“.

procedūra TForm1.DBCheckBox1Click (Siuntėjas: TObject);
pradžia „DBCheckBox1.Checked“ tada
„DBCheckBox1.Caption“: = DBCheckBox1.ValueChecked
Kitas
„DBCheckBox1.Caption“: = DBCheckBox1.ValueUnChecked;
galas;

Vykdykite projektą ir pamatysite žymės langelius visame Laimėtojo lauko stulpelyje.