DBGrid 默認列寬固定,導致標題截斷或數據顯示不全。本文提供通用過程 MakeDBGridColumnsAutoFixItsWidth,遍歷所有行計算每列最大字符寬度(含標題),乘以字符像素寬度(經驗值 8)賦予列寬。
cc,創建動態數組 aDgCLength 存儲各列最大字符數Title.Caption 長度作為初始值DataSet.First 到 EOF 遍歷每行,Fields[i].AsString 去空格後取長度,更新最大值Columns[i].Width := aDgCLength[i] * 8 設置像素寬度procedure MakeDBGridColumnsAutoFixItsWidth(objDBGrid: TDBGrid);
var
cc, i, tmpLength: Integer;
objDataSet: TDataSet;
aDgCLength: array of Integer;
begin
cc := objDBGrid.Columns.Count - 1;
objDataSet := objDBGrid.DataSource.DataSet;
SetLength(aDgCLength, cc + 1);
{ 標題寬度 }
for i := 0 to cc do
aDgCLength[i] := Length(objDBGrid.Columns[i].Title.Caption);
{ 數據寬度 }
objDataSet.DisableControls; // 防止界面閃爍
try
objDataSet.First;
while not objDataSet.Eof do
begin
for i := 0 to cc do
begin
tmpLength := Length(Trim(objDataSet.Fields.Fields[i].AsString));
if tmpLength > aDgCLength[i] then
aDgCLength[i] := tmpLength;
end;
objDataSet.Next;
end;
finally
objDataSet.EnableControls;
end;
{ 應用列寬 }
for i := 0 to cc do
objDBGrid.Columns[i].Width := aDgCLength[i] * 8;
end;
Canvas.TextWidth 精確測量TDBGrid 幫助類方法,調用更優雅