D4: Making TCheckbox data Aware med TDBEdit

enkle middel for å gjøre noen komponenter data-aware. Alternative data-aware boksene (og radioknapper) som kan ordnes mer fleksibelt.
Selv om nyere versjoner av Delphi kan tilby bedre måter å vise data-aware samlinger av avmerkingsboksene og radioknapper, jeg fortsatt bruker D4. Jeg har ofte ønsket en data-aware komponent som (a) inkluderer ikke det skråskårne eske D4 radioknappen gruppen, (b) kan gjøres for å ligne noen papirskjemaer nærmere, (c) tillater mer fleksibel ordning av elementene i gruppen, og (d) tillater uvanlige mønstre av knappene for å være "på" og "off" samtidig.
Kort sagt, mer fleksibilitet.
Jeg tror denne oppskriften gjør dette, og det illustrerer også enkle midler for gjøre noen kontroller som ikke er data-aware erverve denne muligheten ved å samarbeide med de som er.
De øvre og nedre rader av boksene er representert i Delphi koden nedenfor ved klassene TCheckboxCollection og TPersonalityCBCollection hhv. Hver av disse klassene er en beholder for avmerkingsboksen beskrivelsene og deres metoder, Click, GetValue og SetValue, etablere atferden til kontroller kollektivt, og sørge for å knytte sin kollektive verdi med tilhørende data-aware kontroll og dermed med datalageret.
øvre sett boksene oppfører seg omtrent som en runde knappene. I kontrast, kan mer enn én av settet av lavere boksene kontrolleres på en gang, og " RESET " avkrysnings kan brukes til å fjerne sjekker fra alle samtidig
Dine kommentarer Velkommen enhet
Unit1;.! grensesnitt
bruker
Windows, Meldinger, SysUtils, Klasser, Grafikk, Kontroller, skjemaer, dialoger, Db, StdCtrls, Mask, DBCtrls, DBTables, ExtCtrls; skriv
TCheckboxDescriptor = klasse
//skjule standardvirkemåten av i boksen i respons //til et klikk, og forenkle manipulering av den innkapslede objekt privat
preClickedState: TCheckBoxState; funksjon
GetState: TCheckBoxState; prosedyre
SetState (State: TCheckBoxState); avkrysnings offentlig Bilde: TCheckbox; eiendom
State: TCheckBoxState lese GetState skrive SetState; konstruktør
Lag (theCheckbox: TCheckbox); end
; TCheckboxCollection = klasse
//knytte en data-aware redigeringsboksen og dens verdi med en samling //markeringsfelt beskrivelsene; standard oppførsel ligner radio knapper checkboxDescriptors: tListe; handlingClick: Boolean; privat
funksjon
FindSender (Sender: TObject): TCheckboxDescriptor; funksjon
GetValue: string
; prosedyre
SetValue (NewValue: string
); offentlig
associatedDBEdit: TDBEdit; konstruktør
Lag (DBEdit: TDBEdit; theCheckboxes: rekke
av
TCheckbox); prosedyre
Klikk (Sender: TObject); eiendom
Verdi: string
lese GetValue skrive SetValue; end
; TPersonalityCBCollection = klasse plakater (TCheckboxCollection) //avledet klasse som tillater mer enn én avkrysnings å bli sjekket på //gangen, og bruker ett kryss ved å tilbakestille de andre privat
funksjon
GetValue: string
; prosedyre
SetValue (NewValue: string
); offentlig
eiendom
Verdi: string
lese GetValue skrive SetValue; prosedyre
Klikk (Sender: TObject); end
; TForm1 = klasse plakater (TForm) Table1: TTable; DBEdit1: TDBEdit; DataSource1: TDataSource; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; CheckBox4: TCheckBox; CheckBox5: TCheckBox; CheckBox6: TCheckBox; CheckBox7: TCheckBox; CheckBox8: TCheckBox; CheckBoxNA: TCheckBox; CheckBox9: TCheckBox; CheckBox10: TCheckBox; CheckBox11: TCheckBox; CheckBox12: TCheckBox; CheckBox13: TCheckBox; CheckBox14: TCheckBox; CheckBox15: TCheckBox; CheckBox16: TCheckBox; DBNavigator1: TDBNavigator; Label1: TLabel; Label2: TLabel; Label3: TLabel; Shape1: TShape; Label4: TLabel; DBEdit2: TDBEdit; prosedyre
FormCreate (Sender: TObject); prosedyre
CheckBoxNAClick (Sender: TObject); prosedyre
DBEdit1Change (Sender: TObject); prosedyre
CheckBox9Click (Sender: TObject); prosedyre
DBEdit2Change (Sender: TObject); privat
SeverityCBs: TCheckboxCollection; PersonalityCBs: TPersonalityCBCollection; offentlig
end
; Var
Form1: TForm1; implementering product: {$ R * .DFM} konstruktør
TCheckboxDescriptor.Create (theCheckbox: TCheckbox); begynne
arvet
Lag; avkrysnings: = theCheckbox; //Beholde utformingen tilstanden i avkrysnings preClickedState: = theCheckbox.State; end
; funksjon
TCheckboxDescriptor.GetState: TCheckBoxState; begynne
resultat: = preClickedState; < b> end
; prosedyre
TCheckboxDescriptor.SetState (State: TCheckBoxState); begynne
checkbox.State: = stat; preClickedState: = State end
; konstruktør
TCheckboxCollection.Create (DBEdit: TDBEdit; theCheckboxes: rekke
av
TCheckbox); Var
jeg: integer; begynne
arvet
Lag; associatedDBEdit: = DBEdit; checkboxDescriptors: = TList.Create; for
i: = 0 for bedriften høy (theCheckboxes) trenger
checkboxDescriptors.Add (TCheckboxDescriptor.Create (theCheckboxes [i])); handlingClick: = false; end
; funksjon
TCheckboxCollection.FindSender (Sender: TObject): TCheckboxDescriptor; Var
c: integer; checkboxDescriptor: TCheckboxDescriptor; begynne
checkboxDescriptor: = nil
; for
c: = 0 for bedriften checkboxDescriptors.Count - en do
begynne
checkboxDescriptor: = checkboxDescriptors.Items [c]; hvis
checkboxDescriptor.checkbox = Sender deretter
bryte end
; Resultatet: = checkboxDescriptor end
; prosedyre
TCheckboxCollection.Click (Sender: TObject); Var
clickedCBDescriptor, oneCBDescriptor: TCheckboxDescriptor; c: integer; begynne
hvis
handlingClick deretter
exit; handlingClick: = true; clickedCBDescriptor: = FindSender (Sender); hvis
clickedCBDescriptor.State = cbChecked deretter
clickedCBDescriptor.State: = cbUnchecked annet
begynne
clickedCBDescriptor.State: = cbChecked; for
c: = 0 for bedriften checkboxDescriptors.Count - en do
begynne
oneCBDescriptor: = checkboxDescriptors.Items [c]; hvis
oneCBDescriptor < > clickedCBDescriptor deretter
oneCBDescriptor.State: = cbUnchecked; end
; end
; associatedDBEdit.DataSource.Edit; associatedDBEdit.Text: = verdi; handlingClick: = false; end
; prosedyre
TPersonalityCBCollection.Click (Sender: TObject); Var
clickedCB: TCheckbox; clickedCBDescriptor, oneCBDescriptor: TCheckboxDescriptor; c: integer; begynne
hvis
handlingClick deretter
exit; handlingClick: = true; clickedCB: = Sender som
TCheckbox; clickedCBDescriptor: = FindSender (Sender); hvis
clickedCB.Name = 'CheckBox16' deretter
for
c: = 0 til
checkboxDescriptors. Telle - en do
begynne
oneCBDescriptor: = checkboxDescriptors.Items [c]; oneCBDescriptor.State: = cbUnchecked; end
annet
case
clickedCBDescriptor.State av
cbChecked: clickedCBDescriptor.State: = cbUnchecked; annet
clickedCBDescriptor.State: = cbChecked; end
; associatedDBEdit.DataSource.Edit; associatedDBEdit.Text: = verdi; handlingClick: = false; end
; funksjon
TPersonalityCBCollection.GetValue: string
; Var
c, modulo, resultAsInt: integer; oneCBDescriptor: TCheckboxDescriptor; begynne
resultAsInt: = 0; modulo: = 1; for
c: = 0 til
checkboxDescriptors. Telle - 2 do
begynne
hvis
c > 0 deretter
modulo: = modulo * 2; oneCBDescriptor: = checkboxDescriptors.Items [c]; hvis
oneCBDescriptor.checkbox.State = cbChecked deretter
resultAsInt: = resultAsInt + modulo; end
; Resultatet: = IntToStr (resultAsInt) end
; funksjon
TCheckboxCollection.GetValue: string
; Var
c: integer; oneCBDescriptor: TCheckboxDescriptor; begynne
for
c: = 0 til
checkboxDescriptors. Telle - en do
begynne
oneCBDescriptor: = checkboxDescriptors.Items [c]; hvis
oneCBDescriptor.checkbox.State = cbChecked deretter
begynne
hvis
oneCBDescriptor.checkbox.Caption = 'N /A' deretter
resultat: = "0" annet
resultat: = oneCBDescriptor.checkbox.Caption; bryte end
end
end
; prosedyre
TPersonalityCBCollection.SetValue (NewValue: string
); Var
c, modulo, mønster: integer; oneCBDescriptor: TCheckboxDescriptor; begynne
hvis
NewValue = '' deretter
exit; hvis
handlingClick deretter
exit; handlingClick: = true; modulo: = 1; mønster: = StrToInt (NewValue); for
c: = 0 til
checkboxDescriptors. Telle - en do
begynne
hvis
c = 0 deretter
modulo: = 1 annet
modulo: = modulo * 2; oneCBDescriptor: = checkboxDescriptors.Items [c]; hvis plakater (mønster og Selge modulo) < > 0 deretter
oneCBDescriptor.State: = cbChecked annet
oneCBDescriptor.State: = cbUnchecked; end
; handlingClick: = false; end
; prosedyre
TCheckboxCollection.SetValue (NewValue: string
); Var
c: integer; oneCBDescriptor: TCheckboxDescriptor; begynne
hvis
NewValue = '' deretter
exit; hvis
handlingClick deretter
exit; handlingClick: = true; for
c: = 0 til
checkboxDescriptors. Telle - en do
begynne
oneCBDescriptor: = checkboxDescriptors.Items [c]; oneCBDescriptor.State: = cbUnchecked; end
; c: = StrToInt (NewValue); oneCBDescriptor: = checkboxDescriptors.Items [c]; oneCBDescriptor.State: = cbChecked; handlingClick: = false; end
; prosedyre
TForm1.FormCreate (Sender: TObject); begynne
SeverityCBs: = TCheckboxCollection. Lag (DBEdit1, [CheckBoxNA, CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8]); PersonalityCBs: = TPersonalityCBCollection.Create (DBEdit2, [CheckBox9, CheckBox10, CheckBox11, CheckBox12, CheckBox13, CheckBox14, CheckBox15, CheckBox16]); Table1.Open end
; prosedyre
TForm1.CheckBoxNAClick (Sender: TObject); begynne
SeverityCBs.Click (Sender); end
; < b> prosedyre
TForm1.DBEdit1Change (Sender: TObject); begynne
SeverityCBs.SetValue (DBEdit1.Text) end
; prosedyre
TForm1.CheckBox9Click (Sender : TObject); begynne
PersonalityCBs.Click (Sender); end
; prosedyre
TForm1.DBEdit2Change (Sender: TObject); begynne
PersonalityCBs .SetValue (DBEdit2.Text) end
;. end