我的自动调整DBGrid列的程序: procedure SetDBGridSize(DataSource:TDataSource;Table:TTable;DBGrid:TDBGrid); var i,j : integer; FieldWidth : Array[0..255] of integer; //Íø¸ñ¿í¶ÈÊý¾Ý Bkmk:TBook; begin if Table.Active then begin with DBGrid do begin Bkmk:=Table.GetBook; for i:=0 to DataSource.DataSet.FieldCount-1 do begin FieldWidth[i]:=canvas.TextWidth(DBGrid.Columns[i].Title.Caption) + 4; if DataSource.DataSet.Fields[i].DataType=ftDate then if canvas.TextWidth('2000/12/12')>FieldWidth[i] then FieldWidth[i]:=canvas.TextWidth('2000/12/12')+4; end; Table.DisableControls; Table.First; // Êý¾ÝÖ¸ÏòÊ×Ò³ j:=0; while not Table.Eof do begin j:=j+1; for i:=0 to DataSource.DataSet.FieldCount-1 do // ͳ¼Æ¸÷Íø¸ñµÄ¿í¶È if (DataSource.DataSet.Fields[i].DataType=ftString) or (DataSource.DataSet.Fields[i].DataType=ftinteger) or (DataSource.DataSet.Fields[i].DataType=ftCurrency) then begin if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4) then FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4); if (DataSource.DataSet.Fields[i].DataType=ftCurrency) then if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44) then FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44); end; Table.next; if j>10 then break; end; end; Table.GotoBook(Bkmk); Table.FreeBook(Bkmk); Table.EnableControls; end; for i:=0 to DataSource.DataSet.FieldCount-1 do DBGrid.Columns[i].Width:=FieldWidth[i]; end;
编辑时显示(并拉长),编辑完后隐藏和提交.
procedure SetDBGridSize(DataSource:TDataSource;Table:TTable;DBGrid:TDBGrid);
var i,j : integer;
FieldWidth : Array[0..255] of integer; //Íø¸ñ¿í¶ÈÊý¾Ý
Bkmk:TBook;
begin
if Table.Active then
begin
with DBGrid do
begin
Bkmk:=Table.GetBook;
for i:=0 to DataSource.DataSet.FieldCount-1 do
begin
FieldWidth[i]:=canvas.TextWidth(DBGrid.Columns[i].Title.Caption) + 4;
if DataSource.DataSet.Fields[i].DataType=ftDate then
if canvas.TextWidth('2000/12/12')>FieldWidth[i] then
FieldWidth[i]:=canvas.TextWidth('2000/12/12')+4;
end;
Table.DisableControls;
Table.First; // Êý¾ÝÖ¸ÏòÊ×Ò³
j:=0;
while not Table.Eof do
begin
j:=j+1;
for i:=0 to DataSource.DataSet.FieldCount-1 do // ͳ¼Æ¸÷Íø¸ñµÄ¿í¶È
if (DataSource.DataSet.Fields[i].DataType=ftString) or
(DataSource.DataSet.Fields[i].DataType=ftinteger) or
(DataSource.DataSet.Fields[i].DataType=ftCurrency) then
begin
if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4) then
FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+4);
if (DataSource.DataSet.Fields[i].DataType=ftCurrency) then
if FieldWidth[i] < (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44) then
FieldWidth[i] := (Canvas.TextWidth(DataSource.DataSet.Fields[i].AsString)+44);
end;
Table.next;
if j>10 then break;
end;
end;
Table.GotoBook(Bkmk);
Table.FreeBook(Bkmk);
Table.EnableControls;
end;
for i:=0 to DataSource.DataSet.FieldCount-1 do
DBGrid.Columns[i].Width:=FieldWidth[i];
end;
2楼的兄弟提出EDIT的思路,可能是一个办法,但怎么做不太明确。
3楼的兄弟提出的方案是根据字段的类型,确定长度,不适合本题的要求。我已经能够在窗体显示时自动适应列宽度了,但是由于列太多,宽都都自动变窄了,我的想法是,再一次动态调整列宽。根据输入的内容长度,动态变化,离开该列时,该列又回到原来的样子,新的一列进入时,又根据输入的内容动态变化宽度。
不知我说清楚没有,有没有大虾帮忙解决,直接散分!