在“自动设置表格宽度”文本框中获取每个字段实际使用的最大字节数,然后设置DBGrid表格列的Field.DisplayWidth属性来根据实际字段长度自动调整表格宽度,主要代码如下:
procedure TFrmOrderBy.BtnOrderClick(Sender: TObject);
var
i: integer;
fieldname: string;
begin
with AQuery do
begin
Close;
SQL.Clear;
SQL.Add('SELECT max(datalength(id)) AS id ,');
SQL.Add('max(datalength(number))AS number,');
SQL.Add('max(datalength(name))AS name,');
SQL.Add('max(datalength(old))AS old,');
SQL.Add('max(datalength(sex))AS sex,');
SQL.Add('max(datalength(telephone))AS telephone,');
SQL.Add('max(datalength(department))AS department,');
SQL.Add('max(len(joindate))AS joindate');
SQL.Add('FROM TB_Worker');
Open;
end;//本段代码用于获取目标数据中各个字段实际数据的最大长度
for i := 0 to DBGList.Columns.Count - 1 do//根据目标数据的最大长度设置列宽
begin
fieldname := DBGList.Columns[i].Field.FieldName;
DBGList.Columns[i].Field.DisplayWidth := AQuery.FieldByName(fieldname).AsInteger;
end;
end;
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
DBGridRecordSize(mDBGrid.Columns[I]);//此句可以屏蔽在DBGrid1DrawColumnCell事件中加入DBGridRecordSize(Column);
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 }