http://kingron.myetang.com.zsfunc0w.htm (*// 标题:数据网格自动适应宽度 说明:使用DBGrid不可不看 设计:Zswang 日期:2002-03-04 支持:[email protected] //*)///////Begin Source uses Math;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 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 } ///////End Source///////Begin Demo procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin DBGridRecordSize(Column); end;procedure TForm1.Button2Click(Sender: TObject); begin DBGridAutoSize(DBGrid1); end; ///////End Demo
to BCB(天下三分明月夜,二分无赖是扬州): //请试试 DBGrid1.Columns.SaveToFile(); DBGrid1.Columns.LoadFromFile();
以下这段过程是本人自制的TSortDBG的自动调整显示宽度的过程,其中self指本TSortDBG./////////////////////////////////////////////////////////// procedure TSortDBG.AdjustShowColumnWidth; var i, iWidth: Integer; aiWidth: array of Integer; bm: TBookMark; begin if not FAutoColumnWidth then Exit; SetLength(aiWidth,Columns.Count); Screen.Cursor := crHourGlass; for i := Low(aiWidth) to High(aiWidth) do aiWidth[i] := 0; if DataSource<>nil then if DataSource.DataSet<>nil then if DataSource.DataSet.Active then begin bm := DataSource.DataSet.GetBook; DataSource.DataSet.DisableControls; DataSource.DataSet.First; while not DataSource.DataSet.Eof do begin for i := Low(aiWidth) to High(aiWidth) do begin iWidth := Self.Canvas.TextWidth(Self.Fields[i].DisplayText); if iWidth>aiWidth[i] then aiWidth[i] := iWidth; end; DataSource.DataSet.Next; end; DataSource.DataSet.GotoBook(bm); DataSource.DataSet.EnableControls; DataSource.DataSet.FreeBook(bm); end; for i := Low(aiWidth) to High(aiWidth) do begin iWidth := Self.Canvas.TextWidth(Self.Columns.Items[i].Title.Caption); if iWidth>aiWidth[i] then aiWidth[i] := iWidth; Columns.Items[i].Width := aiWidth[i]+4; end; Screen.Cursor := crDefault; end;
DBGrid1.Columns[1].Width :=100;
DBGrid1.Columns[2].Width :=100;
DBGrid1.Columns[3].Width :=220;
DBGrid1.Columns[4].Width :=200;
DBGrid1.Columns[5].Width :=100;
DBGrid1.Columns[6].Width :=100;
DBGrid1.Columns[7].Width :=100;
让用户自动拖动列宽变化,设法将列宽保存到.ini或注册表中,
下次运行时,再读出上次保存下来的列宽送到有关控件中,
让它有记忆功能一样.
(*//
标题:数据网格自动适应宽度
说明:使用DBGrid不可不看
设计:Zswang
日期:2002-03-04
支持:[email protected]
//*)///////Begin Source
uses
Math;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
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 }
///////End Source///////Begin Demo
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DBGridRecordSize(Column);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
DBGridAutoSize(DBGrid1);
end;
///////End Demo
//请试试
DBGrid1.Columns.SaveToFile();
DBGrid1.Columns.LoadFromFile();
procedure TSortDBG.AdjustShowColumnWidth;
var
i, iWidth: Integer;
aiWidth: array of Integer;
bm: TBookMark;
begin
if not FAutoColumnWidth then Exit;
SetLength(aiWidth,Columns.Count);
Screen.Cursor := crHourGlass;
for i := Low(aiWidth) to High(aiWidth) do
aiWidth[i] := 0;
if DataSource<>nil then
if DataSource.DataSet<>nil then
if DataSource.DataSet.Active then
begin
bm := DataSource.DataSet.GetBook;
DataSource.DataSet.DisableControls;
DataSource.DataSet.First;
while not DataSource.DataSet.Eof do
begin
for i := Low(aiWidth) to High(aiWidth) do
begin
iWidth := Self.Canvas.TextWidth(Self.Fields[i].DisplayText);
if iWidth>aiWidth[i] then
aiWidth[i] := iWidth;
end;
DataSource.DataSet.Next;
end;
DataSource.DataSet.GotoBook(bm);
DataSource.DataSet.EnableControls;
DataSource.DataSet.FreeBook(bm);
end;
for i := Low(aiWidth) to High(aiWidth) do
begin
iWidth := Self.Canvas.TextWidth(Self.Columns.Items[i].Title.Caption);
if iWidth>aiWidth[i] then
aiWidth[i] := iWidth;
Columns.Items[i].Width := aiWidth[i]+4;
end;
Screen.Cursor := crDefault;
end;
再在DBGRID中选择这些字段,分别定义每一个对应字段的显示宽度、标题、等其它显示格式。
(伴水** 的方法大家可以试试看)
DBGrid1.Columns.LoadFromFile();(伴水)的方法非常好!!!