2016-08-24 36 views
0

私は複数のタブシートを持っています。私のPageControlの各タブシートには、このdbgridを操作するためのボタンが付いたDbgridが含まれています。私はボタンの削除をクリックしたときDelphi Dbgridレコードを削除

時々、私のDBGridを変更しません。削除後、私は私のDBgridで私の価値を参照してください。

If MyTable.recordcount > 0 then 
begin 
str := 'Value of name field/**' + MyTable.FieldByName('Name').AsString+'**/'; 
If Application.MessageBox(PChar(str), PChar('NAME'), MB_OKCANCEL + MB_ICONQUESTION) = IDOK then 
begin 
     MyTable.Delete; 
end; 
end; 

私は削除した後

MyTable.Refresh; 

を追加しようとするが、それは動作しません。 MessageBoxのmyfieldの値は正しいです!私はMyDBgridで別のタブシートを選択したときに

、この問題が表示されます。 フォーカスのDBGridに問題がありますか?私のDBGrid(dsBrowser、dsEdit、...)の状態の問題がありますか?

============================================== ===========

私はBeforeDeleteイベントとAfterDeleteイベントのログを作成しよう:AfterDeleteイベントで

Log(1,'------------------------------------Before Del'); 
Log(1,Format('DataSet.IsEmpty:%s',[BoolToStr1(DataSet.IsEmpty)])); 
Log(1,Format('DataSet.State:%d',[Ord(DataSet.State)])); 
Log(1,'--------'); 
Log(1,Format('DataSet.RecNo:%d',[DataSet.RecNo])); 
Log(1,Format('DataSet.TabSheet:%s',[DataSet.FieldByName('TabSheetName').AsString])); 
Log(1,Format('DataSet.FieldName:%s',[DataSet.FieldByName('FieldName').AsString])); 
Log(1,Format('DataSet.FieldId:%s',[DataSet.FieldByName('FieldId').AsString])); 

Log(1,'------------------------------------After Del'); 
Log(1,Format('DataSet.IsEmpty:%s',[BoolToStr1(DataSet.IsEmpty)])); 
Log(1,Format('DataSet.State:%d',[Ord(DataSet.State)])); 
Log(1,'--------'); 
Log(1,Format('DataSet.RecNo:%d',[DataSet.RecNo])); 
Log(1,Format('DataSet.TabSheet:%s',[DataSet.FieldByName('TabSheetName').AsString])); 
Log(1,Format('DataSet.FieldName:%s',[DataSet.FieldByName('FieldName').AsString])); 
Log(1,Format('DataSet.FieldId:%s',[DataSet.FieldByName('FieldId').AsString])); 

私はタブシートを使用します以下のように:

enter image description here

私はこのログを取得

------------------------------------Before Del 
DataSet.IsEmpty:False 
DataSet.State:1 
-------- 
DataSet.RecNo:7 
DataSet.TabSheet:tabsheet_0 
DataSet.FieldName: 
DataSet.FieldId:03 
------------------------------------After Del 
DataSet.IsEmpty:False 
DataSet.State:1 
-------- 
DataSet.RecNo:6 
DataSet.TabSheet:tabsheet_0 
DataSet.FieldName: 
DataSet.FieldId:03 

あなたは私のログに見ることができます:データセットは変更しない(filednameおよびフィールド識別子/ RECNOのプロパティを変更しないで変更される)の後03を含む行を削除します。

+0

申し訳ありませんが、私はあなたのqがあなたの問題を適切に説明しているとは思えません。a)あなたのスクリーンショットを見て、なぜそれが表示されているときにタブシートについて話しているのですが、それはDBGridの一部です。 b)選択した行のDBGridのLHデータ列が空白なのはなぜですか? c)そして、あなたが示すログは、RecNo 6が正常に削除された場合ですか?もしそうなら、私はそれが私たちに示されることを知ることができません - レコードが削除されないときのログが良いでしょう。 d)DBGridが埋め込まれている形式の属性を記録するためにデータセットが使用されていますか?あなたのqは、あなたが何をしているのか明確に分かりません。 – MartynA

+0

Btw、私はあなたがこれに助けが必要なら、あなたはあなたのqにMCVEを含めなければならないと思う - http://stackoverflow.com/help/mcveを参照してください。 – MartynA

+0

@MartynA助けてくれてありがとう...私私は現在のタブシートを変更し、選択された新しいタブシートの行を削除するときにエラーを再現できるので、私はタブシートについて話します。この場合、削除は正しく実行されません... B>このセルは空です..私はこのセルに何も入れません。C>あなたはRecNo = 6を見ることができますが、fieldnameとfieldIdは変更されず、私のDBgridインターフェイスは変更されません... D> MyDbgrid新しいタブシートを作成するときに追加されます((新しいタブシートを追加すると、DBGrid、すべてのボタンを含むクラスをインスタンス化します)) – userPro

答えて

0

あなたの問題は断続的であるので、あなたは、読者があなたのためにそれを行うことができないので、それを自分でデバッグする必要があります。

まず、ロギング機能を設定し、データセットのBeforeDeleteAfterDeleteイベントで呼び出します。現在のデータセット行のID、データセットの状態(dsBrowsedsEditなど)と関連性があると思われるもの(アクティブなタブシートのIDなど)を記録し、どのような状況で削除は失敗します。ロギングコールの結果をフォームのTMemoに書き込むことができます。

IMEは、それがデータセットがdsBrowse状態にある場合にのみ削除を許可することをお勧めします。

ちなみに、データセットがdsInsertまたはdsSetKeyの状態であれば、削除操作が自動的に中止されることにご注意ください。あなたが説明したところから、問題が発生したときにそれがdsInsert状態にあるかどうかを調べることによってデバッグを開始します。もちろん、データセットがdsInsert状態に入るときに、そのBeforeInsertイベントをキャッチしてそこからログ機能を呼び出すことで、キャッチすることができます。

関連する問題