在dbgrid上,当鼠标移动到某一行的时候(还没有点击,这时记录指针还不原来位置), 如何将记录指针移动到当前鼠标所在的行。

解决方案 »

  1.   

    { 浠ヤ笅浠g爜鍦?Delphi6 涓紪鍐?}{ 闇€瑕佽缃瓺BGrid1鐨勫睘鎬ptions锛?
      缃甦gRowSelect鍜宒gAlwaysShowSelection鍧囦负True }procedure MouseLButtonClick(Handle: Integer; X, Y: Integer);
    begin
      PostMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, Y shl 16 + X);
      PostMessage(Handle, WM_LBUTTONUP, 0, Y shl 16 + X);
    end;var
      FLastY: Integer = 0;//璁$畻榧犳爣鎵€鍦ㄧ殑琛岋紝璇ュ嚱鏁伴渶瑕佹牴鎹疄闄呭簲鐢ㄨ繘琛屾敼杩涖€?
    function CalcRowID(Y: Integer): Integer;
    const
      RowH  = 18;//杩欐槸DBGrid涓瘡琛岀殑楂樺害
    begin
      Result := Y div RowH;
    end;{ DBGrid 鐨勪簨浠?OnMouseMove }
    procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if CalcRowID(Y) <> CalcRowID(FLastY) then begin//闇€瑕佹洿鏂版椂鎵嶆洿鏂版樉绀?
        MouseLButtonClick(DBGrid1.Handle, X, Y);
        FLastY := Y;
      end;
    end;{ 濡傛灉闇€瑕佺獊鍑轰釜鎬у寲锛岄偅涔堝彲浠ラ厤鍚圤nDrawColumnCell浜嬩欢瀹炵幇锛屽苟涓旈渶瑕佹洿鍔犵簿纭湴璁$畻榧犳爣浣嶇疆鍜屾暟鎹涔嬮棿鐨勫搴斿叧绯汇€倉
      

  2.   

    { 以下代码在 Delphi6 中编写 }{ 需要设置DBGrid1的属性Options,
      置dgRowSelect和dgAlwaysShowSelection均为True }procedure MouseLButtonClick(Handle: Integer; X, Y: Integer);
    begin
      PostMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, Y shl 16 + X);
      PostMessage(Handle, WM_LBUTTONUP, 0, Y shl 16 + X);
    end;var
      FLastY: Integer = 0;//计算鼠标所在的行,该函数需要根据实际应用进行改进。
    function CalcRowID(Y: Integer): Integer;
    const
      RowH  = 18;//这是DBGrid中每行的高度
    begin
      Result := Y div RowH;
    end;{ DBGrid 的事件 OnMouseMove }
    procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if CalcRowID(Y) <> CalcRowID(FLastY) then begin//需要更新时才更新显示
        MouseLButtonClick(DBGrid1.Handle, X, Y);
        FLastY := Y;
      end;
    end;{ 如果需要突出个性化,那么可以配合OnDrawColumnCell事件实现,并且需要更加精确地计算鼠标位置和数据行之间的对应关系。}