自动获取列的数量和宽度

时间:2015-09-17 11:02:50

标签: delphi delphi-2010

我遇到了一段自动生成列号和宽度的代码问题。

我用这部分代码完成了所有工作,只有困扰我的是我的网格不是100%使用的;有一小块网格未使用,这使得报告变得疯狂。

这是完成工作的代码的一部分。

 procedure TForm1.NoScrollDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  i: Integer;
  brkol: integer;
  sirina : Integer;
  width1: Integer;
begin
  width1 := 1;
  brkol:=-4;
  for i := 0 to NoScrollDBGrid1.Columns.Count - 1 do
  begin
    width1 := width1 + NoScrollDBGrid1.Columns[i].Width + 1;
    if NoScrollDBGrid1.Columns[i].Visible then
       brkol:=brkol +1;
  end;
  sirina:=(80 div brkol);
  if width1 < NoScrollDBGrid1.ClientWidth - 8 then
  begin
NoScrollDBGrid1.Columns[0].Width:=(NoScrollDBGrid1.ClientWidth-11)*2 div 100;
NoScrollDBGrid1.Columns[1].Width:=(NoScrollDBGrid1.ClientWidth-11)*5 div 100;
NoScrollDBGrid1.Columns[2].Width:=(NoScrollDBGrid1.ClientWidth-11)*10 div 100;
NoScrollDBGrid1.Columns[3].Width:=(NoScrollDBGrid1.ClientWidth-11)*3 div 100;
NoScrollDBGrid1.Columns[4].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[5].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[6].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[7].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[8].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[9].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[10].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[11].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[12].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[13].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[14].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[15].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[16].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;
NoScrollDBGrid1.Columns[17].Width:=(NoScrollDBGrid1.ClientWidth-11)*sirina div 100;

2 个答案:

答案 0 :(得分:0)

以下内容并非完全回答您的问题,但应该足以让您继续。

CreateForm事件会创建一个TNoScrollDBGrid,其最右边的列会停止 网格客户区的右边界。

Button1点击处理程序调用{​​{1}},显示如何检索网格的GetDrawInfo (请参阅DrawInfo中的TGridDrawInfo)并使用它将右侧列重新调整为 到达网格客户区的RHS。

Grids.Pas还会显示如何查找可见数据列的数量 - 请参阅GetDrawInfo,允许左侧可能存在指标列。调整最右列的宽度还会考虑是否存在指标列。

顺便说一下,网格的DrawCell事件可能不是一个改变网格布局的好地方,如评论中所指出的那样。

VisibleDataColumns

[...]

type
  TNoScrollDBGrid = Class(TDBGrid)  // Per Peter Below of TeamB
  private
    Procedure WMNCCalcSize( Var msg: TMessage );
     message WM_NCCALCSIZE;
  end;

 TForm1 = class(TForm)
   CDS1: TClientDataSet;
   DataSource1: TDataSource;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   procedure GetDrawInfo;
 protected
 public
   NoScrollDBGrid1 : TNoScrollDBGrid;
 end;

答案 1 :(得分:0)

正如@GuidoG建议香港专业教育学院试图给其中一列提供剩余宽度而且它有效。似乎noscrolldbgrid中的列必须是整数,这就是网格未填充100%的原因。无论如何都需要很多帮助。