{============ 自动调整列宽 =============}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 } {列宽}procedure TForm1.DBGridDraw1ColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin DBGridRecordSize(Column); end;//调用DBGridAutoSize(DBGrid1);就可了
>>此列的宽度就会自动设置为合适的宽度.:)
哈哈,100分的 下面是我的一个思路,根据鼠标的形状进行判断,不知是否合这位兄弟胃口: procedure TForm1.StringGrid1DblClick(Sender: TObject); var p : TPoint; r : TRect; ACol, ARow : Integer; begin if GetCursor = Screen.Cursors[crHSplit] then begin GetCursorPos(p); p := StringGrid1.ScreenToClient(p); StringGrid1.MouseToCell(p.X, p.Y, ACol, ARow); r := StringGrid1.CellRect(ACol, ARow); if p.X - r.Left < 10 then ACol := ACol - 1; if ACol = -1 then ACol := StringGrid1.ColCount - 1; StringGrid1.ColWidths[ACol] := 100; end; end;
自动调整列宽
=============}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 }
{列宽}procedure TForm1.DBGridDraw1ColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
DBGridRecordSize(Column);
end;//调用DBGridAutoSize(DBGrid1);就可了
下面是我的一个思路,根据鼠标的形状进行判断,不知是否合这位兄弟胃口:
procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
p : TPoint;
r : TRect;
ACol, ARow : Integer;
begin
if GetCursor = Screen.Cursors[crHSplit] then
begin
GetCursorPos(p);
p := StringGrid1.ScreenToClient(p);
StringGrid1.MouseToCell(p.X, p.Y, ACol, ARow);
r := StringGrid1.CellRect(ACol, ARow);
if p.X - r.Left < 10 then
ACol := ACol - 1;
if ACol = -1 then
ACol := StringGrid1.ColCount - 1;
StringGrid1.ColWidths[ACol] := 100;
end;
end;