为什么TDBGrid上的垂直滚动条没有显示?

Maw*_*awg 5 delphi tdbgrid

我在表单上有两个DB网格,一个有垂直滚动条而另一个没有,即使DataSource查询返回的结果多于Grid的可见行.

为什么TDBGrid不显示垂直滚动条?


[更新] Delphi XE2启动程序,使用AnyDac.

当我第一次启动程序时,DB网格确实有一个垂直滚动条,但后来它消失了,我缩小了它,但仍然无法理解如何纠正问题.

我有两个MySql表和两个DBgrids.一个是所有测试运行的概述,另一个是测试运行期间测量的详细信息.当用户单击"摘要"网格的一行时,我更新"详细信息"网格的查询参数.这有效,但不会删除滚动条.

当我开始一个新的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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如您所见,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
Run Code Online (Sandbox Code Playgroud)

能不能告诉我我做错了什么?谢谢你的0x000F4240


[更新]问题是,当我向test_runs表中添加一行时,反映measurements表查询的数据库网格的垂直滚动条消失了.

因此,不知何故,一个DB网格/数据集/表正在影响otherDB网格.

实际的MySql数据库中的数据很好.无论我是否使用命令INSERT INTO和两个已删除的查询(在设计时固定SQL并且从未更改过)或者如果我使用@kobik建议,问题就会发生dataset.append.

数据库内容很好,数据库内容正确,当我点击摘要test_runs数据库网格时,详细measurements数据库网格的内容被正确更新.

唯一的问题是在test_runs查询表中插入一行会导致滚动条从DB网格的measurementsDB网格中消失.

当我对此进行评论时,我可以单击test_runs数据库网格并在没有滚动条转换的情况下在测试运行之间进行交换,但是永远无法返回到当前测试,因为在数据库网格中没有它的条目.

当我第一次开始一个新的测试dataset.RecordCount`当然是零 - 这可能导致滚动条消失?

但是,当进行测量时(每隔一秒,基于计时器),我已检查并且dataset.RecordCount 的值递增,所以在第二次测量后应该是滚动条吗?或者,一旦控件确定不需要它,我是否必须强制它出现?(使DB网格无效并未导致丢失的滚动条出现)


[更新]正如@kobik所建议的,我已经使run_id成为test_runs表上的主要自动增量键和表上的索引measurements.我已经更新了上面给出的表格详细信息.我还设置了mastersource将测试drun DB网格填充到测试运行"summary"DB网格查询的数据源的查询.

我删除了数据库(我的代码在第一次运行时自动重新创建).首先,DB网格都没有垂直滚动条,因为它们都是空的.当我添加第一个测试时,"摘要"DB网格没有滚动条,因为它只有1个条目,"详细信息"DB网格在0处没有滚动条,条目和滚动条在第2组测量中出现.

我添加了第二次测试运行,"sumamry"DB网格有一个滚动条,因为它现在有两个条目,但是一旦我将第二个条目添加到摘要,滚动条就从"详细信息"数据库网格中消失了(它没有做任何一次测试运行),无论它有多少条目(断点,因为每组测量都被添加并检查measurementsQuery.RecordCount并看到它变为0,1,2 ......)

值得指出的是,这只发生在我添加新的测试运行时(第一次除外)).如果我启动程序,两个DB网格都有预期的滚动条(> 1个条目).我可以点击或鼠标滚动摘要,以显示相应测试运行的详细信息.滚动条永远不会消失 - 直到我添加一个新的测试运行,它将一行插入到摘要数据库网格中.

[更新]
请参阅/sf/ask/1077983861/


kob*_*bik 8

阅读您的意见,并检查您的编辑的问题后,我敢肯定的是,TDBGrid的'详细信息’ DataSet返回一个单一的记录后INSERT.这解释了为什么没有垂直滚动条 - TDBGrid只有当记录> 1时才会显示垂直滚动条.

您可以通过检查DataSet.RecordCount链接到网格的内容进行简单测试.应该表明1.


显然,QC中存在一个已知问题:TDBGrid vertical scrollbar dissappears.
它从D7..XE2开始.(甚至可能适用于较旧/较新版本).

当你有一个主/详细记录,并且使用TDBGrid显示细节时,垂直滚动条会随机消失,即使有更多的记录也不合适!您可以看到滚动条的右边框轮廓,包括拇指移动.就像网格在滚动条上稍微调整一样.

对于过滤的DataSet也可能是这样.
因此,您可能希望实现QC中建议的一种解决方法.

  • @Mawg,我不太关心这些要点.这个Q已成为一个很大的沙拉,可以帮助其他人,并涉及大量的信息.你真的需要付出努力,将你的*问题*分解成更小更准确的问题. (4认同)
  • 这是不可能的范围......查看您的来源,主/详细信息定义是错误的.在`DetailsADQuery`中你不需要使用`WHERE run_id =:run_id` - 你需要设置`MasterFields = run_id`和`IndexFieldNames = run_id`.并且不要使用`INSERT INTO`,使用`Append`方法.请先查看一些主要/详细的Delphi教程.一旦你明白了它真的很容易:) (3认同)