用 windows message 吧截获

解决方案 »

  1.   

    我现在也遇到同样的问题。而且用Ctrl+鼠标左可一行一行得选定多行后,再点击鼠标取消时也很不直观。
      

  2.   

    自己写处理方法:
      DataSet->First();
      for (int i=0; i<DataSet->RecordCount; i++)
      {
        DBGrid->SelectedRows->CurrentRowSelected = true;
        DataSet->Next();
      }
      

  3.   

    stringgrid用它;
    或是下一个控件
      

  4.   

    ihihonline(小小) :下的控件不敢用,
    windindance(风舞轻扬) (  ) :怎样确定选中的一块的开始记录和结束记录呢?还有就是取消选中的记录呢?
      

  5.   

    这个……
    没有用过
    这样试试:
    在MouseDown、MouseMove和MouseUp事件中:
    根据DBGrid.MouseCoord得到鼠标位置所在的行列
    然后将Table的当前记录指向该行(没有试过,不知道如何实现)
    然后按上面的方法
      

  6.   

    谢谢windindance(风舞轻扬) 给了我提示,我基本解决该问题,我先在Tform上
    定义了 private ,choseTkte,choseTktb,确定起,止,然后在DbGrid2上如下处理:procedure TFrmCSalManage.DBGrid2MouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var lstyptkt,temptkt:string;
        i:integer;
    begin
      inherited;  lstyptkt:=DS_SalCTick.DataSet.Fields [3].asstring+DS_SalCTick.DataSet.Fields[4].asstring;  if ssshift in  Shift then
         begin
              choseTkte:=lstyptkt;
              DS_SalCTick.DataSet.First;
              while not DS_SalCTick.DataSet.Eof do
              begin
              temptkt:=DS_SalCTick.DataSet.Fields[3].asstring
                       +DS_SalCTick.DataSet.Fields[4].asstring;
              if ((choseTktb<=temptkt) And (temptkt<=choseTkte))  then
                   DBGrid2.SelectedRows.CurrentRowSelected:= true;
              if (temptkt>=choseTkte) then
                  break;
              DS_SalCTick.DataSet.next;
              end;
         end;  i:=0;
      DS_SalCTick.DataSet.First;
      while not DS_SalCTick.DataSet.Eof do
            begin
            if DBGrid2.SelectedRows.CurrentRowSelected = true
            then
               break;
            i:=i+1;
            DS_SalCTick.DataSet.next;
            end;
      DS_SalCTick.DataSet.First;
      DS_SalCTick.DataSet.MoveBy(i);  choseTktb:=DS_SalCTick.DataSet.Fields[3].asstring
                +DS_SalCTick.DataSet.Fields[4].asstring;
      end;   执行后可随意使用shift,Ctrl选定和取消记录,但还有些问题:
    1.我的DS_SalCTick.DataSet是按Fields[3],Fields[4]排序的,因此可利用此特性,但我想应有更通用的方法。
    2.如shift选定一块后,第三次选择在该块中间,后面,都与windows的方法一致,
    但第三次选择在该块前面,有问题。
      任务紧,暂无时间细想,望能抛砖引玉。