yTakeです。
お世話になります。
DBGridとDBNavigatorで不可解な現象に困っています。
DBNavigatorの”次へ”と”前へ”のボタンでレコードを移動している限り、DBGrid上のリストデータの表示に特に異常は見られません。
しかし、一旦、”最後へ”ボタンを使用すると、DBGridのリスト表示が乱れます。具体的には、最後から2つのデータの繰り返し表示になってしまったり、そのまま”前へ”や”次へ”を操作すると、全部同じリスト内容になってしまったりします。この時、レコード数も見かけ上増えていたりもします。
検索がかかってしまっている様にも見える為、解除すると正常に戻ります。つまり、レコードは増えてはいません。
もちろん、同じレコード内容が重複して存在することはありません。確認しています。
良いデバック方法が思いつかない点にも困っています。
取り敢えず、DBNavigatorの"OnClick"イベントでSQLテキストを監視しましたが、特に変更は加えられていません。自分で設定した全レコード表示の文が残っています。
同じレコードが繰り返し表示される現象がよくわかりません。
どの辺りを確認すれば解決の糸口がみつかるでしょう?
環境は、32ビットWin7、Delphi XE3 + Firebird v2.5
です。
なお、テーブルは2つあり、上述のリストから選択されたレコードに対応して二つ目テーブルから関連レコードが表示される関係にありますが、こちらは影響していないと思っています。
ご教授頂けると幸いです。
Delphi XE3は使っていないのですが・・
・Delphi XE3の最新のアップデートは、適用されていますか?
・接続で使用しているのは、IBX?dbExpress?FireDAC?
また、新しいプロジェクトで、DBGridとDBNavigatorだけの単体での動作では、正常に表示されますか?
単に描画の問題なのかどうかの切り分けをしてみてはいかがでしょうか?
適当に置いたボタンのOnClickなどからDBGrid.Invalidateを呼び出し、表示が正常になるのか、おかしいままなのか。
igyさん、ありがとうございます。
以前にも確認を促されて、最新版にした気がします。Windows 7.6.1 (ビルド7601:ServicePack1)です。
IBXで接続しています。
新しいプロジェクトでなくても、問題の生じているテーブルに対して、別のDBNavigatorとDBGridを関連付けて、”最後へ”ボタンを押しても問題の表示不正は発生しません。ただし、このテストではテーブル2からのリレーションは省いています。
何か、余計なSQLコマンドが実行されている様に思うのですが、その発生内容や発生箇所を特定できずにいます。
また、現象の説明で訂正があります。”最後へ”を実施後、同じ表示が繰り返される点は同じですが、必ずしも最後の2つではなく、”最後に”をクリックした時点のレコード内容と最後のレコードの2つの繰り返しであったりします。
いずれにしても、この様な検索コマンドを登録している箇所はありません。
何かの拍子で、この様なコマンドが実行されるのでしょうか?
何から絞り込んで良いのやら、と言う状況です。
>ただし、このテストではテーブル2からのリレーションは省いています。
リレーションなしでは、正常動作して、リレーションありで異常な動作であれば、
その リレーション 関連で、問題がある可能性が高い気が・・・・
# 実際のコードが提示されていないので、具体的に何が悪いというのは、指摘できませんが。
通りすがりさん
ありがとうございます。
”DBGrid.Invalidate”とは何でしょう?ヘルプでは良く分かりませんでした。
取り敢えず、ボタンを一つ追加して、”OnClicck”イベントに”DBGrid.Invalidate”を置きました。
実行して、そのボタンをクリックしましたが、何も変わりません。”最後に”をクリックして、乱れた後にもそのボタンをクリックしましたが、何も変わりません。
使い方が間違っているのでしょうね。少し、使い方を調べてみます。
リレーションに関しましては、テーブル1は参照される側なので関係ないのかなと思いました。
しかし、全ての可能性を検証する意味では、確認すべきでした。
結果、別に作成したテスト用のDBNavigatorとDBGridでは表示の乱れは発生しませんでした。リレーションも定義してあります。
これにより、本ルーチンでのDBNavigatorとDBGridではそのコンポーネント構造も含めてどこかに違いがあると言う事になります。
ソースをご提示申し上げたいとも思いますが、疑わしき箇所を絞り込めていないので、長くなってしまう為、デバッグ方法のヒントを頂ければと思いました。
DBGrid.Invalidateは表示の初期化(再描画)手続きの様ですね。
これを実行しても変化しないと言う事は、実際にその様なレコードが返されていると言う事でしょうか?同じレコードは2つ存在していないのですが、、、
本ルーチンのDBNavigator+DBGridのプロパティ内容とテスト版との違いを、関連するその他のコンポーネントも含めて、突き詰めてみます。
すみません、間が空きました。
コンポーネントの設定の検証の過程で別のエラーで少し手間取りました。
本件に関しましては、ようやく期待通りの動作になりました。
結局、IBQueryのコンポーネントを新規に導入して直りました。
設定やSQL文には違いは見出せなかったのですが、結論的には自ら何らかの違いを作り出していたのですが、分かりませんでした。
取り敢えず、動作は修正できましたので、本件は閉めさせて頂きます。
新たにデバッグ用プロジェクトを構築しかつ完全に再現する事でデバッグに有益である点が良く分かりました。
ありがとうございました。