GVKun编程网logo

delphi – 设置TDBGrid可见行(delphi dbgrid属性)

10

如果您想了解delphi–设置TDBGrid可见行和delphidbgrid属性的知识,那么本篇文章将是您的不二之选。我们将深入剖析delphi–设置TDBGrid可见行的各个方面,并为您解答delp

如果您想了解delphi – 设置TDBGrid可见行delphi dbgrid属性的知识,那么本篇文章将是您的不二之选。我们将深入剖析delphi – 设置TDBGrid可见行的各个方面,并为您解答delphi dbgrid属性的疑在这篇文章中,我们将为您介绍delphi – 设置TDBGrid可见行的相关知识,同时也会详细的解释delphi dbgrid属性的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

delphi – 设置TDBGrid可见行(delphi dbgrid属性)

delphi – 设置TDBGrid可见行(delphi dbgrid属性)

我想在给定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;

或者按照@nil的建议使用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;

DbGridToExcel(Delphi)

DbGridToExcel(Delphi)

总结

以上是小编为你收集整理的DbGridToExcel(Delphi)全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi 7 中DBGrid的排序

Delphi 7 中DBGrid的排序

总结

以上是小编为你收集整理的Delphi 7 中DBGrid的排序全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Delphi DBGrid 实现复选框

Delphi DBGrid 实现复选框

1

在数据库对应的表中加入  bit 列验证是否被选中

然后 dbgrid 第一列的 filedname 是 bit 列

在 DBgrid 的 onDrawColumnCell 事件中写:

procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
const  
  CtrlState: array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); begin if column.Field.DataType=ftboolean then begin DBGrid1.Canvas.FillRect(rect); drawframecontrol(DBGrid1.Canvas.Handle,rect,dfc_button,ctrlstate[column.Field.asboolean]); end; end;

  

上方事件写完后会在第一行第一列出现复选框

 

 2

 在 dbgrid 的 oncellclick 事件中写,目的就是实现单击时  复选框被选中

procedure TcgDaohuodj.DBGrid1CellClick(Column: TColumn);
begin
  if DBGrid1.SelectedField.DataType=ftboolean   then
  begin
    DBGrid1.SelectedField.DataSet.Edit;
    DBGrid1.SelectedField.AsBoolean:=not DBGrid3.SelectedField.AsBoolean;
    DBGrid1.SelectedField.DataSet.Post;
  end;
end

  

3
在 dbgrid 的 ontitileclick 事件中写如下代码,目的是点击 bit 列是实现全选和全消

 

procedure DBGrid1TitleClick(Column: TColumn);
var i:integer;
begin
  if column.Index=0 then begin    //验证是否第一列
    adoquery1.First;                //游标回滚
    DBGrid1.SelectedRows.CurrentRowSelected:=true;    //第一行被选中

    if trim(column.Title.Caption)=''全选'' then
    begin
      for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
      begin
        dbgrid1.Fields[0].DataSet.edit;
        dbgrid1.Fields[0].AsBoolean:=true;
        dbgrid1.Fields[0].DataSet.post;
        dbgrid1.datasource.dataset.next;
      end;
      column.Title.Caption:=''全消'';
    end else begin
      for i:=0 to dbgrid1.DataSource.DataSet.RecordCount-1 do
      begin
        dbgrid1.Fields[0].DataSet.edit;
        dbgrid1.Fields[0].AsBoolean:=false;
        dbgrid1.Fields[0].DataSet.post;
        dbgrid1.datasource.dataset.next;
      end;
      column.Title.Caption:=''全选'';
    end;
    adoquery1.First;    //游标回滚
    DBGrid1.SelectedRows.CurrentRowSelected:=true;  //选中第一行
  end;
end;

 

 

效果如图:

 

delphi dbgrideh 列宽度自适应问题

delphi dbgrideh 列宽度自适应问题

总结

以上是小编为你收集整理的delphi dbgrideh 列宽度自适应问题全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

今天关于delphi – 设置TDBGrid可见行delphi dbgrid属性的讲解已经结束,谢谢您的阅读,如果想了解更多关于DbGridToExcel(Delphi)、Delphi 7 中DBGrid的排序、Delphi DBGrid 实现复选框、delphi dbgrideh 列宽度自适应问题的相关知识,请在本站搜索。

本文标签: