我要在dbgrid 中响应向下、向上的按键,在onkeydown中写了相应的代码,希望在按键时记录先下移(上移)一条,然后再从新记录中取值做条件进行查询,但是现在查询可以实现,只是查询到的记录却是以上一条记录相应值为条件的,也就是说,是先查询再记录移动了,请问怎么实现先移动记录再执行查询代码???

解决方案 »

  1.   

    这个你用不着在onkeydown中写你在datasource的ondatachange中写就可以,不用记录,直接根据dbgrid中的信息做查询条件写查询
      

  2.   

    在按键中可能有难度,不过我觉得要完成你的目标可在dbgrid的数据集TQuery(或TADOquery/TTable)的AfterScroll事件中实现,当你用UP/DOWN在dbgrid中移动数据时,都会产生AfterScroll事件(先移后触发),你可将新的查询放在其中
      

  3.   

    把查询放到AFTERSCORALL事件中去试试
      

  4.   

    其实我只是想让程序先响应按键动作,再执行代码?能实现吗?
    (因为我使用的是frame,而且是动态创建的,所有frame在创建时的实例名均为FFrame,不容易实现你所说的代码)
      

  5.   

    我的query 和datasource 均是放在datamodule里的,我不知道在相应的事件如何操作界面控件
      

  6.   

    也可能我说的不够清楚,我可以在afterscroll中查询数据,但是这些数据如何对应到界面中相应的控件中去呢?
      

  7.   

    不太明白你的意思,不过你可以参考下面的代码,
    //dbgrid响应回车
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    begin
      if key=#13 then { 判断是按执行键}
      if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控件内}
      begin
          With TDbgrid(ActiveControl) Do
          begin
             if not DataSource.DataSet.Eof then
                 DataSource.DataSet.Next
             else
                 DataSource.DataSet.First;
          end;
      end;
    end;
      

  8.   

    在afterscroll中和onkeydown中
    写查询代码并操作界面控件应该没区别啊
      

  9.   

    假设你的DBGRID1连接的DATASOURCE是DATASOURCE1,DATASOURCE连接的DATASET是QUERY1。
    你只需在QUERY1的AFTERSCORALL事件中写你的查询代码。就可以了。因为你在DBGRID事件中移动记录后才会触发QUERY1的AFTERSCORALL事件。这样应该完全符合你的要求呀
      

  10.   

    我觉得是不是在form的shortcut事件中写,然后判断DBGrid的记录是否移动。
      

  11.   

    //在你的DBGrid中放入下面代码,并将注释部分填写相应代码试试
      with TDBGrid(Sender).DataSource.DataSet do
      begin
        case Key of
        VK_UP:
          begin
            if not BOF then
            begin
              Prior;
              //get condition and to search...
            end;
          end;
        VK_DOWN:
          begin
            if not BOF then
            begin
              Next;
              //get condition and to search...
            end;
          end;
        end;
      end;
      

  12.   

    借用楼上的代码:
    在keydown里写:
    with DBGrid1.DataSource.DataSet do
      begin
        case Key of
        VK_UP:
          begin
            if not BOF then
            begin
              Prior;
              dbgrid1.SelectedIndex:=dbgrid1.SelectedIndex-1;
            end;
          end;
        VK_DOWN:
          begin
            if not EOF then
            begin
              Next;
              dbgrid1.SelectedIndex:=dbgrid1.SelectedIndex+1;
            end;
          end;
        end;
      end;这样可以满足你的要求吧?你的要求是达到这样的效果吗?