如何捕获Grid的列分隔线的双击事件或消息
类似于windows的操作,在一个表格列头的分隔线处双击鼠标,此列的宽度就会自动设置为合适的宽度.

解决方案 »

  1.   

    {============
     自动调整列宽
     =============}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);就可了
      

  2.   

    >>此列的宽度就会自动设置为合适的宽度.:)
      

  3.   

    哈哈,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;
    