[英]Setting TDBGrid visible rows
I want to adjust a TDBGrid height given a VisibleRows
parameter. 我想在给定
VisibleRows
参数的情况下调整TDBGrid高度。 the grid may or may not have titles. 网格可能有也可能没有标题。
Suppose I select 100 records from the db, but I want the grid height to adjust to show the first 10 rows (make them visible). 假设我从数据库中选择了100条记录,但我想调整网格高度以显示前10行(使它们可见)。 the dataset will still hold 100 records.
数据集仍将保留100条记录。
ie 即
procedure SetVisibleRows(DBGrid: TCustomDBGrid; VisibleRows: Integer);
begin
...
DBGrid.Height := ???
end;
I know how to get the visible rows: 我知道如何获得可见的行:
type
TCustomGridHack = class(TCustomGrid);
function GetVisibleRows(DBGrid: TCustomDBGrid): Integer;
begin
Result := TCustomGridHack(DBGrid).VisibleRowCount;
end;
But, is there a way to set the VisibleRowCount
? 但是,有没有办法设置
VisibleRowCount
?
This seems to work (maybe could be optimized more): 这似乎工作(也许可以更优化):
type
TCustomDBGridHack = class(TCustomDBGrid);
procedure SetVisibleRows(DBGrid: TCustomDBGrid; VisibleRows: Integer);
var
TitleHeight, RowHeight: Integer;
begin
with TCustomDBGridHack(DBGrid) do
begin
if dgTitles in Options then
begin
TitleHeight := RowHeights[0] + GridLineWidth;
RowHeight := RowHeights[1] + GridLineWidth;
end
else
begin
TitleHeight := 0;
RowHeight := RowHeights[0] + GridLineWidth;
end;
end;
DBGrid.ClientHeight := TitleHeight + (RowHeight * VisibleRows) + 1;
end;
Or by using TGridDrawInfo
as suggested by @nil. 或者
TGridDrawInfo
建议使用TGridDrawInfo。 It produces more accurate results (I modified it a bit): 它产生更准确的结果(我稍微修改了一下):
procedure SetVisibleRows(DBGrid: TCustomDBGrid; VisibleRows: Integer);
var
DrawInfo: TGridDrawInfo;
TitleHeight, RowHeight: Integer;
begin
with TCustomDBGridHack(DBGrid) do
begin
CalcDrawInfo(DrawInfo);
TitleHeight := DrawInfo.Vert.FixedBoundary;
RowHeight := RowHeights[DrawInfo.Vert.FirstGridCell] + DrawInfo.Vert.EffectiveLineWidth;
end;
DBGrid.ClientHeight := TitleHeight + (RowHeight * VisibleRows) + 1;
end;
As mentioned by @nil, RowHeight
could be also calculated with: 正如@nil所提到的,
RowHeight
也可以用以下公式计算:
RowHeight := DrawInfo.Vert.GetExtent(DrawInfo.Vert.FirstGridCell) + DrawInfo.Vert.EffectiveLineWidth;
I haven't noticed any difference though. 我没有发现任何差异。 (should be further investigated).
(应进一步调查)。
The above could be further improved to make the TDBGrid
scroll-bars adjust better: 以上可以进一步改进,以使
TDBGrid
滚动条更好地调整:
procedure SetVisibleRows(DBGrid: TCustomDBGrid; VisibleRows: Integer);
var
DrawInfo: TGridDrawInfo;
TitleHeight, RowHeight: Integer;
HasActiveDataSet: Boolean;
begin
if VisibleRows < 0 then VisibleRows := 0;
HasActiveDataSet := Assigned(DBGrid.DataSource) and
Assigned(DBGrid.DataSource.DataSet) and
DBGrid.DataSource.DataSet.Active;
if HasActiveDataSet then
DBGrid.DataSource.DataSet.DisableControls;
try
with TCustomDBGridHack(DBGrid) do
begin
CalcDrawInfo(DrawInfo);
TitleHeight := DrawInfo.Vert.FixedBoundary;
RowHeight := RowHeights[DrawInfo.Vert.FirstGridCell] + DrawInfo.Vert.EffectiveLineWidth;
end;
DBGrid.ClientHeight := TitleHeight + (RowHeight * VisibleRows) + 1;
finally
if HasActiveDataSet then
DBGrid.DataSource.DataSet.EnableControls;
end;
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.