2017-08-20 10 views
-3

DataSource,AdoQuery,AdoConnection,DBgridに加えて、editmemoを持つフォームがありました。 ユーザー名、住所などを入力し、[保存]ボタンを押します。その時点で、アプリケーションはAccessリンクテーブルに接続されているコンマ区切りのtxtファイルに詳細を書き込みます。ユーザーが「保存」ボタンを押すと、即座にメモに書き込まれますが、アプリケーションを再度開いたときにのみ、dbgridデータベースが更新されません。Delphi:TDBGridが更新されていません

私は多くのことを検索しますが、誰もが異なる提案を持っている:DBGridのLiveUpdateが動作しない理由などdbgrid refresh, adorequery, post, append, showmodal, open and close the databaseを行う

私の質問はありますか?

ソースコードは、以下である:


ユニットテスト、

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 
     then 
     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 =('') 
     then 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. 

それはデータへの変更を保存するためのTDBGridの責任ではありませんあなた

+0

誰かが簡単な提案をしている場合は、それもappreicatedです。私は少し複雑なやり方をするのが好きです。 :( – LoneRanger

+0

'DataSource.DataSet.Refresh;'を試しましたか? – Sami

+0

サミ、はい、私もそれを試しました。 – LoneRanger

答えて

2

をありがとう、あなたは自分で行う必要があります。つまり、データが保存されない理由は、実際にAdoQuery1の「保存」メソッドを呼び出さないということです。このメソッドは実際にはPostと呼ばれます。あなたは

if AdoQuery1.State in [dsEdit, dsInsert] then 
    AdoQuery1.Post; 

をやるべき実在しない「保存」ボタンのOnClickハンドラはところで、あなたのデータはあなたの現在のコードと全く保存されます理由は、特定のデータセットの操作(いないDBGridのものは)への変更を引き起こすということですデータセットはPostになります。これらは、データセットの論理カーソルをスクロールさせることを含む。 DBGrid内の別の行をクリックするか、データセットを閉じます。しかし、これに頼ることは非常に悪い習慣です。フォームでは、データセットの変更を保存してキャンセルする明示的な方法をユーザーに常に提供する必要があります。

また、btw、はありませんあなたのFormKeyDownにあるようなコードを書く - それは起こるのを待っている事故です。

+0

私はSQLの代わりにmsアクセスとテキストベースのドキュメントを使用する方が良いでしょうか? – LoneRanger

+0

あなたは "sql"、MS SQL Server、または何を意味しますか? – MartynA

+0

yes with SQL server – LoneRanger

0

あなたがここに見ることができるように:

procedure TForm1.FormShow(Sender: TObject); 
     var lStrings: TStringList; 
    begin 
    DataSource1.DataSet.Append; 
    Label6.Caption :=GetCurrentUserName; 

DataSetはここdsInsertであるので、あなたは、変更内容を保存する必要があります。

それを行うには、2つの方法があります:

  • MartynA答え

  • としてDataSet状態をチェックし、あなたのコード内の行DataSource.DataSet.Post;を追加します。

btw、あなたのコードでは、データベースにデータが保存されていません。

+0

ありがとうございました – LoneRanger

関連する問題