我使用了dbgrid控件,但不知该设定哪个属性来控制每一列的宽度。如果采用默认的方法,则每一列都很宽,很难看。如果采用dbgrid.coloms[i].width;=n的方式,我发现只能设置第一列的宽度,设置其他列的宽度则会报告越界错误。请指教。

解决方案 »

  1.   

    {============
     自动调整列宽
     =============}
    function DBGridRecordSize(mColumn: TColumn): Boolean;
    { 返回记录数据网格列显示最大宽度是否成功 }
    begin
    Result := False;
    if not Assigned(mColumn.Field) then Exit;
    mColumn.Field.Tag := Max(mColumn.Field.Tag,
     TDBGrid(mColumn.Grid).Canvas.TextWidth(mColumn.Field.DisplayText));
    Result := True;
    end; { DBGridRecordSize }function DBGridAutoSize(mDBGrid: TDBGrid; mOffset: Integer = 5): Boolean;
     {返回数据网格自动适应宽度是否成功 }
    var
    I: Integer;
    begin
    Result := False;
    if not Assigned(mDBGrid) then Exit;
    if not Assigned(mDBGrid.DataSource) then Exit;
    if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
    if not mDBGrid.DataSource.DataSet.Active then Exit;
    for I := 0 to mDBGrid.Columns.Count - 1 do begin
     if not mDBGrid.Columns[I].Visible then Continue;
     if Assigned(mDBGrid.Columns[I].Field) then
     mDBGrid.Columns[I].Width := Max(mDBGrid.Columns[I].Field.Tag,
     mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)) + mOffset
     else mDBGrid.Columns[I].Width :=
     mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption) + mOffset;
     mDBGrid.Refresh;
    end;
    Result := True;
    end; { DBGridAutoSize }
    ///////源代码结束
    {列宽}
    procedure TForm1.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
       DBGridRecordSize(Column);
    end;
    ------------------调用
    begin
           dbgrid1.OnDrawColumnCell:=DBGridDrawColumnCell_I;
           DBGridAutoSize(DBGrid1);
         end;
      

  2.   

    dbGrid.title.Colums[i].Width := ?
      

  3.   

    如果你使用DBGrid默认的列宽,那其实运行时列宽是和字段宽度相关的,可以直接在设计期拖动DBGrid的列宽进行设置
      

  4.   

    Procedure SetGridWidth(SQLText:String);
    var
    i:integer;
    Query1:TAdoQuery;
    begin
    Query1:=TAdoQuyer1.Create(nil);
    Query1.Connection:=你的连接Conn;
    With Query1 do begin
    Close;
    SQL.Clear;
    SQL.Text:=SQLText;{可以这么写 例如你的SQL语句是 SELECT A FROM TABLE 这时你的SQLText:=select Max(Len(a)*2) from Table}
    Open;
    end;
    for i:=0 to FieldCount-1 do
    DBGrid.Columns.Items[i].Width:=Query1.Fields.Fields[1].Value;
    end;
    end;