5

フォームに2つのDBグリッドがあり、一方には垂直スクロールバーがあり、もう一方にはありません。データソースクエリがグリッドの表示行よりも多くの結果を返す場合でも同様です。

の垂直スクロールバーがTDBGrid表示されないのはなぜですか?


[更新]AnyDacを使用したDelphiXE2スターター。

プログラムを最初に起動したとき、DBグリッドには垂直スクロールバーがありますが、後で消えて絞り込みましたが、問題を修正する方法を理解できません。

2つのMySqlテーブルと2つのDBgridがあります。1つはすべてのテスト実行の概要であり、もう1つはテスト実行中に行われた測定の詳細を含みます。ユーザーが「概要」グリッドの行をクリックすると、「詳細」グリッドのクエリのパラメーターが更新されます。これは機能し、スクロールバーは削除されません。

新しいtetsの実行を開始し、「summary」テーブルに新しい行を挿入すると、問題が発生します。 「details」テーブルのスクロールバーが消えます。

mysql> describe test_runs;
+------------------+-------------+------+-----+-------------------+----------------+
| Field            | Type        | Null | Key | Default           | Extra          |
+------------------+-------------+------+-----+-------------------+----------------+
| run_id           | int(11)     | NO   | PRI | NULL              | auto_increment |
| start_time_stamp | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
| end_time_stamp   | timestamp   | YES  |     | NULL              |                |
| description      | varchar(64) | YES  |     | NULL              |                |
+------------------+-------------+------+-----+-------------------+----------------+
4 rows in set (0.02 sec)

mysql> describe measurements;
+------------------------+-----------+------+-----+-------------------+-------+
| Field                  | Type      | Null | Key | Default           | Extra |
+------------------------+-----------+------+-----+-------------------+-------+
| run_id                 | int(11)   | NO   | MUL | NULL              |       |
| measurement_time_stamp | timestamp | NO   |     | CURRENT_TIMESTAMP |       |
| ph                     | float     | NO   |     | NULL              |       |
| conductivity           | float     | NO   |     | NULL              |       |
| cod                    | float     | NO   |     | NULL              |       |
+------------------------+-----------+------+-----+-------------------+-------+
5 rows in set (0.04 sec)

mysql>

AnyDacクエリは、それぞれ、

SELECT 
   run_id,
   start_time_stamp,
   end_time_stamp,
   CONCAT(CONCAT(CONCAT(CONCAT(LPAD(EXTRACT(HOUR FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"),LPAD(EXTRACT(MINUTE FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'), ":"), LPAD(EXTRACT(SECOND FROM timediff(end_time_stamp,start_time_stamp)), 2, '0'))) AS duration,
   description    
FROM 
   test_runs 
ORDER BY 
   start_time_stamp 
DESC

SELECT 
   run_id,
   measurement_time_stamp, 
   ROUND(ph, :float_precision) as ph, 
   ROUND(conductivity, :float_precision) as conductivity, 
   ROUND(cod, :float_precision) as cod    
FROM 
   measurements    
WHERE 
   run_id=:run_id
ORDER BY 
   measurement_time_stamp 
DESC

ご覧のとおり、テーブルにはテーブルmeasurementsへの参照がありますtest_runs

次のSQLを実行すると、測定値テーブルのスクロールバーが消えます。

INSERT INTO 
   test_runs (start_time_stamp, description) 
VALUES 
   (CURRENT_TIMESTAMP, "<Currently running test>"); 

SELECT LAST_INSERT_ID() AS run_id

誰かが私が間違っていることを教えてもらえますか?ありがとう0x000F4240


[更新]ここでも問題は、テーブルに行を追加すると、test_runsテーブルのクエリを反映するDBグリッドの垂直スクロールバーがmeasurements消えることです。

したがって、どういうわけか、1つのDBグリッド/データセット/テーブルが他のDBグリッドに影響を与えています。

実際のMySqlデータベースのデータは問題ありません。この問題は、コマンドを使用しINSERT INTOて2つのdecicatedクエリ(SQLは設計時に修正され、変更されていない)を使用するか、@kobikの提案を使用するかに関係なく発生しますdataset.append

データベースの内容は問題なく、DBの内容は正しいです。要約test_runsDBグリッドをクリックすると、詳細measurementsDBグリッドの内容が正しく更新されます。

唯一の問題は、クエリのテーブルに行を挿入するとtest_runs、DBグリッドのDBグリッドからスクロールバーが消えることmeasurementsです。

コメントすると、DBグリッドをクリックして、スクロールバーを表示せずにtest_runsテストの実行を切り替えることができますが、DBグリッドにエントリがないため、現在のテストに戻ることはできません。

新しいテストを最初に開始したときdataset、.RecordCount`はもちろんゼロです。これにより、スクロールバーが消える可能性がありますか?

ただし、測定が行われると(1秒ごと、タイマーベース)、チェックしてdataset.RecordCount`の値が増加するので、2回目の測定後にスクロールバーを表示する必要がありますか?または、コントロールが不要であると判断した場合は、強制的に表示する必要がありますか?(DBグリッドを無効にしても、欠落しているスクロールバーは表示されませんでした)


[更新]@kobikが提案したように、run_idをテーブルのプライマリ、自動インクリメントキー、test_runsおよびテーブルのインデックスにしましたmeasurements。上記の表の詳細を更新しました。またmastersource、テスト実行DBグリッドにデータを入力するクエリのをテスト実行「要約」DBグリッドのクエリのデータソースに設定しました。

データベースを削除します(私のコードは最初の実行時に自動的にデータベースを再作成します)。最初は、どちらも空だったため、どちらのDBグリッドにも垂直スクロールバーがありませんでした。最初のテストを追加したとき、「概要」DBグリッドにはスクロールバーがありませんでした。これは、エントリが1つしかないため、「詳細」DBグリッドには0とエントリにスクロールバーがなく、スクロールバーが2番目の測定セットとともに表示されたためです。

2番目のテスト実行を追加すると、「sumamry」DBグリッドには2つのエントリがあるためスクロールバーがありましたが、2番目のエントリを要約に追加するとすぐに、スクロールバーは「details」DBグリッドから消えました(単一のテスト実行があった場合は実行されませんでした)、エントリの数に関係なく(測定の各セットが追加され、0、1、2measurementsQuery.RecordCountになることを確認してブレークポイントを設定します...)

これは、(最初​​の))以外の新しいテスト実行を追加した場合にのみ発生することを指摘しておく価値があります。プログラムを起動すると、両方のDBグリッドに期待どおりのスクロールバーがあります(> 1エントリ)。そして、要約をクリックまたはマウスホイールで移動して、対応するテスト実行の詳細を無効にすることができます。スクロールバーが消えることはありません。新しいテスト実行を追加するまで、サマリーDBグリッドに行が挿入されます。

[更新] https://stackoverflow.com/questions/15399769/why-is-the-vertical-scrollbar-on-a-tdbgrid-not-displayed-redux
をご覧ください


4

2 に答える 2

9

コメントを読み、編集の質問を確認した後、TDBGridの「詳細」があなたの後に単一のレコードをDataSet返していることは間違いありません。そして、それが垂直スクロールバーがない理由を説明しています-レコードが1より大きい場合にのみ垂直スクロールバーが表示されます。INSERTTDBGrid

DataSet.RecordCountグリッドにリンクされているをチェックすることで、簡単なテストを行うことができます。表示されるはずです1


どうやら、QCにはTDBGrid vertical scrollbar dissappears既知の問題があります。
それはD7..XE2からずっと行きます。(たぶん古い/新しいバージョンでも)。

マスター/詳細レコードがあり、TDBGridを使用して詳細が表示される場合、収まるよりも多くのレコードがある場合でも、垂直スクロールバーはランダムに消えます。ただし、親指が動くことを含め、スクロールバーの右の境界線の輪郭を見ることができます。グリッドがスクロールバー上でわずかにサイズ変更されたかのようです。

これは、フィルタリングされたデータセットにも当てはまる可能性があります。
したがって、QCで提案されている回避策の1つを実装することをお勧めします。

于 2013-03-07T12:16:26.693 に答える
0

スクロールバーをssBothに設定しました。修正されました

于 2020-05-04T20:01:30.960 に答える