[英]Setting TDBGrid visible rows
我想在給定VisibleRows
參數的情況下調整TDBGrid高度。 網格可能有也可能沒有標題。
假設我從數據庫中選擇了100條記錄,但我想調整網格高度以顯示前10行(使它們可見)。 數據集仍將保留100條記錄。
即
procedure SetVisibleRows(DBGrid: TCustomDBGrid; VisibleRows: Integer);
begin
...
DBGrid.Height := ???
end;
我知道如何獲得可見的行:
type
TCustomGridHack = class(TCustomGrid);
function GetVisibleRows(DBGrid: TCustomDBGrid): Integer;
begin
Result := TCustomGridHack(DBGrid).VisibleRowCount;
end;
但是,有沒有辦法設置 VisibleRowCount
?
這似乎工作(也許可以更優化):
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;
或者TGridDrawInfo
建議使用TGridDrawInfo。 它產生更准確的結果(我稍微修改了一下):
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;
正如@nil所提到的, RowHeight
也可以用以下公式計算:
RowHeight := DrawInfo.Vert.GetExtent(DrawInfo.Vert.FirstGridCell) + DrawInfo.Vert.EffectiveLineWidth;
我沒有發現任何差異。 (應進一步調查)。
以上可以進一步改進,以使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.