想自己做个控件,从TDBGrid承续,来完成自动列宽.
在重载DrawColumnCell中输入
Column.Field.Tag := Max(Column.Field.Tag,
TDBGrid(Column.Grid).Canvas.TextWidth(Column.Field.DisplayText));函数
procedure DBGridAutoSize();
{ 数据网格自动适应宽度 }
var
I: Integer;
begin
for I := 0 to self.Columns.Count - 1 do begin
if not self.Columns[I].Visible then Continue;
if Assigned(self.Columns[I].Field) then
self.Columns[I].Width := Max(self.Columns[I].Field.Tag,
self.Canvas.TextWidth(self.Columns[I].Title.Caption))
else self.Columns[I].Width :=
self.Canvas.TextWidth(self.Columns[I].Title.Caption);
self.Refresh;
end;
end; { DBGridAutoSize } 将DBGridAutoSize放在 DrawColumnCell 和 Paint 中是有效果,但是一直刷新.
请问放到那个位置可以呢,或者有别的写法.
在重载DrawColumnCell中输入
Column.Field.Tag := Max(Column.Field.Tag,
TDBGrid(Column.Grid).Canvas.TextWidth(Column.Field.DisplayText));函数
procedure DBGridAutoSize();
{ 数据网格自动适应宽度 }
var
I: Integer;
begin
for I := 0 to self.Columns.Count - 1 do begin
if not self.Columns[I].Visible then Continue;
if Assigned(self.Columns[I].Field) then
self.Columns[I].Width := Max(self.Columns[I].Field.Tag,
self.Canvas.TextWidth(self.Columns[I].Title.Caption))
else self.Columns[I].Width :=
self.Canvas.TextWidth(self.Columns[I].Title.Caption);
self.Refresh;
end;
end; { DBGridAutoSize } 将DBGridAutoSize放在 DrawColumnCell 和 Paint 中是有效果,但是一直刷新.
请问放到那个位置可以呢,或者有别的写法.
begin
with adoquery1 do
begin
close;
sql.clear;
sql.add('select * from table');
open;
end;
DBGridAutoSize(dbgrid1);
end;
可能估计我还没有把我的意思表达清楚吧我说的是做一控件,而我想将这个函数放到控件类的某个位置,只要在装载数据的时候它就自动调整列宽,而不需要在设计程序的时候再调用DBGridAutoSize这个函数.
procedure SetDBGridSizeQuery(DataSource:TDataSource;Query:TQuery;DBGrid:TDBGrid);
var i,j : integer;
FieldWidth : Array[0..160] of integer; //网格宽度数据
Bkmk:TBook;
begin
if Query.Active then
begin
Bkmk:=Query.GetBook;
with DBGrid do
begin
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;
j:=1;
Query.DisableControls;
Query.First; // 数据指向首页
while not Query.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;
Query.next;
if j>20 then break;
end;
Query.GotoBook(Bkmk);
Query.FreeBook(Bkmk);
Query.EnableControls;
end;
end;
for i:=0 to DataSource.DataSet.FieldCount-1 do
DBGrid.Columns[i].Width:=FieldWidth[i];
end;