数据少到时无所谓,多了系统花费就太大了:
procedure SetColWidth(ADBGRdi:TDBGrid);
var
I:Byte;
SavedPlace:TBookMarkStr;
ColWidths:array of Integer;
begin
with ADBGrid,DataSource.DataSet do
begin
SetLength(ColWidths,Columns.Count);
for I:=0 to Columns.Count-1 do
ColWidths[I]:=Length(Columns[I].Title.Caption);
SavedPlace:=BookMark;
DisableControls;
try
First;
while not EOF do
begin
for I:=0 to Columns.Count-1 do
try
ColWidths[I]:=Max(ColWidths[I],Length(Columns[I].Field.AsString));
//这里还可以做一些判断,只是对某些类型字段处理。其它采用默认值就是了
except
//屏蔽不能转换为字符的字段导致的异常。
end;
Next;
end;
for I:=0 to Columns.Count-1 do
Columns[I].Width:=ColWidths[I];
finally
BookMark:= SavedPlace;
EnableControls;
end;
end;
end;
procedure SetColWidth(adbgrdCtl: TDBGridEh; pMinWidth: Integer = 50; pFieldWidthList: String = '');
Const
WIDTH_PER_CHAR = 7;
Var
i: Integer;
ColWidth: Integer;
WidthList: TStringList;
procedure SetDefaultWidth();
Var
FieldName: String;
j: Integer;
begin
FieldName := adbgrdCtl.Columns[i].Title.Caption;
//处理多行显示标题
for j := Length(FieldName) downto 1 do
if FieldName[j] = '|' then
begin
FieldName := RightStr(FieldName,Length(FieldName) - j);
break;
end;
ColWidth := Length(FieldName) * WIDTH_PER_CHAR;
if ColWidth < pMinWidth then adbgrdCtl.Columns[i].Width := pMinWidth
else adbgrdCtl.Columns[i].Width := ColWidth;
end;
begin
WidthList := nil;
if pFieldWidthList <> '' then
begin
WidthList := TStringList.Create;
WidthList.CommaText := pFieldWidthList;
end;
try
for i := 0 to adbgrdCtl.Columns.Count - 1 do
begin
adbgrdCtl.Columns[i].Title.Alignment := taCenter;
if WidthList = nil then
begin
SetDefaultWidth;
continue;
end;
if WidthList.Values[adbgrdCtl.Columns[i].FieldName] = '' then
SetDefaultWidth
else adbgrdCtl.Columns[i].Width := StrToInt(WidthList.Values[adbgrdCtl.Columns[i].FieldName]);
end;
finally
if WidthList <> nil then WidthList.Free;
end;
end;