database - Delphi: TDBGrid not update -
i had form has datasource,adoquery,adoconnection,dbgrid
plus couple edit
, memo
. user enter username,street address, etc.. , hit 'save' button. on time application write details in comma separated txt file, connected access linked table. when user hit 'save' button write memo instantly not live update dbgrid database, when reopen app.
i search lot has different suggestions: dbgrid refresh, adorequery, post, append, showmodal, open , close database
etc.
my question why dbgrid liveupdate doesn't work?
sourcecode following:
unit test;
interface uses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, stdctrls, strutils, grids, buttons, pngimage, extctrls, comctrls, dbgrids, db, dbtables, colorgrd, diroutln, adodb, fmtbcd, sqlexpr, dbctrls, dbclient, jpeg; type tform1 = class(tform) memo1: tmemo; exit: tbutton; resetbtn: tbutton; label3: tlabel; groupbox1: tgroupbox; label7: tlabel; label8: tlabel; groupbox2: tgroupbox; label1: tlabel; edit1: tedit; edit2: tedit; edit3: tedit; generate: tbutton; groupbox3: tgroupbox; label5: tlabel; label6: tlabel; checkbox1: tcheckbox; image1: timage; image2: timage; button6: tbutton; datetimepicker1: tdatetimepicker; groupbox4: tgroupbox; label10: tlabel; label9: tlabel; dellastentry: tbutton; adoconnection1: tadoconnection; adoquery1: tadoquery; datasource1: tdatasource; dbgrid1: tdbgrid; label13: tlabel; label14: tlabel; label16: tlabel; label17: tlabel; label18: tlabel; label2: tlabel; label4: tlabel; label11: tlabel; label15: tlabel; adoquery1username: twidestringfield; adoquery1requestednumber: twidestringfield; adoquery1allocatednumber: twidestringfield; adoquery1dateofrequest: twidestringfield; procedure exitclick(sender: tobject); procedure resetbtnclick(sender: tobject); procedure formcreate(sender: tobject); procedure dellastentryclick(sender: tobject); procedure generateclick(sender: tobject); procedure checkbox1click(sender: tobject); procedure formshow(sender: tobject); procedure button6click(sender: tobject); procedure formkeydown(sender: tobject; var key: word; shift: tshiftstate); private { private declarations } public { public declarations } end; var form1: tform1; implementation {$r *.dfm} function getcurrentusername: string; const cnmaxusernamelen = 50; var susername: string; dwusernamelen: dword; begin dwusernamelen := cnmaxusernamelen - 1; setlength(susername, cnmaxusernamelen); getusername(pchar(susername), dwusernamelen); setlength(susername, dwusernamelen); result := susername; end; procedure tform1.exitclick(sender: tobject); begin memo1.lines.savetofile('c:\numbergen\numberdb.txt'); form1.close; end; procedure tform1.resetbtnclick(sender: tobject); begin edit1.clear; edit2.clear; end; procedure tform1.formcreate(sender: tobject); begin memo1.lines.loadfromfile('c:\numbergen\numberdb.txt'); memo1.wordwrap := true; end; procedure tform1.formkeydown(sender: tobject; var key: word; shift: tshiftstate); begin form1.showmodal; form1.free; end; procedure tform1.formshow(sender: tobject); var lstrings: tstringlist; begin datasource1.dataset.append; label6.caption :=getcurrentusername; lstrings := tstringlist.create; lstrings.delimiter := ','; lstrings.delimitedtext := memo1.lines[memo1.lines.count-1]; label8.caption:= lstrings.strings[0]; label13.caption:= lstrings.strings[1]; label14.caption:= lstrings.strings[2]; label15.caption:= lstrings.strings[3]; end; procedure tform1.dellastentryclick(sender: tobject); begin memo1.lines.delete(memo1.lines.count-1); end; procedure tform1.button6click(sender: tobject); var val2, sum: integer; begin val2 := strtoint(edit3.text); sum := val2; edit3.text := (inttostr(sum+1)); end; procedure tform1.checkbox1click(sender: tobject); begin if checkbox1.checked edit1.text := label6.caption else edit1.text :=''; end; procedure tform1.generateclick(sender: tobject); var val1, val2, sum: integer; begin val1 := strtoint(edit2.text); val2 := strtoint(edit3.text); sum := val1 + val2; edit3.text := inttostr(sum); memo1.lines.savetofile('c:\numbergen\numberdb.txt'); if edit1.text =('') messagedlg('invalid/blank username! please enter one!',mterror, mbokcancel, 0) else memo1.lines.add(edit1.text+',' +edit2.text+','+inttostr(sum-val1)+'-'+edit3.text+ ','+formatdatetime('yyyy/mm/dd', datetimepicker1.date) ); end; end.
thank
it's not responsibility of tdbgrid save changes data, need yourself. in other words, reason data isn't getting saved aren't calling "save" method of adoquery1. method called post
, somewhere in code, e.g. non-existent "save" button's onclick
handler should doing
if adoquery1.state in [dsedit, dsinsert] adoquery1.post;
btw, reason data gets saved @ current code dataset operations (not dbgrid ones) cause changes dataset post
ed. these include causing dataset's logical cursor scroll, e.g. clicking in different row in dbgrid or closing dataset. extremely bad practice rely on - form should provide user explicit way save , cancel changes dataset.
also btw, never write code have in formkeydown
- accident waiting happen.
Comments
Post a Comment