Delphi是否允许用户在没有固定行的情况下调整TStringGrid列的大小?

时间:2013-10-23 08:05:50

标签: delphi column-width tstringgrid

我想要一个所有行看起来都相同的网格 在Delphi中,如何让用户在没有固定行的情况下调整TStringGrid列的大小?通常,您只能调整固定行,而不能修复整个网格。

我正在使用XE2。

TIA

标记

1 个答案:

答案 0 :(得分:1)

您可以覆盖CalcSizingState。

设置
  - 如果符合条件,请说明gsRowSizing(在下面的示例中检查是否在MouseMove中按下了Alt键)和
  - 使用MouseToCell从MouseDown索引计算索引。

可能需要进行一些微调。

type

  TStringGrid = Class(Grids.TStringGrid)
  private
    FIsSizing: Boolean;
    FIndex: Integer;
    procedure CalcSizingState(X, Y: Integer; var State: TGridState; var Index: Longint; var SizingPos, SizingOfs: Integer; var FixedInfo: TGridDrawInfo); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  private

  End;

  TForm3 = class(TForm)
    StringGrid1: TStringGrid;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}
{ TStringGrid }

procedure TStringGrid.CalcSizingState(X, Y: Integer; var State: TGridState; var Index, SizingPos, SizingOfs: Integer; var FixedInfo: TGridDrawInfo);
begin
  inherited;
  if FIsSizing then
    State := gsRowSizing;
  if (FIndex > -1) then
  begin
    Index := FIndex;
  end;
end;

procedure TStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Col: Integer;
begin
  inherited;
  MouseToCell(X, Y, Col, FIndex);
end;

procedure TStringGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  FIsSizing := ssAlt in Shift;
end;