フォームに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_runs
DBグリッドをクリックすると、詳細measurements
DBグリッドの内容が正しく更新されます。
唯一の問題は、クエリのテーブルに行を挿入すると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
をご覧ください