可是可以的,不过SELECT 出来的记录不能太多,太多的话可能效果不好
偏方:
你在表里面加一个字段,用来记录行号,怎么增加这个行号有很多方法了,这个不说了,你应该知道
示范,将表数据搞成这个样子
行号 字段1 字段2
1 A 1
2 B 1
3 BB 1
4 BA 2
5 CC 2
然后在KeyDown事件中,不是KEYPRESS事件,最好做两个按钮一个上一个下
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var p,n,r:Integer;
//P表示上一行行号
//N表示下一行行号
//R表示当前行行号
begin
if Key=VK_DOWN
then begin
if ADOQuery1.RecNo=ADOQuery1.RecordCount then Exit;
r:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Next;
n:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=r;
ADOQuery1.Post;
ADOQuery1.Prior;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=n;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Locate('rno',r,[]);
end;
if Key=VK_UP
then begin
if ADOQuery1.RecNo=1 then Exit;
r:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Prior;
p:=ADOQuery1.FieldByName('rno').AsInteger;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=r;
ADOQuery1.Post;
ADOQuery1.Next;
ADOQuery1.Edit;
ADOQuery1.FieldByName('rno').AsInteger:=p;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.Open;
ADOQuery1.Locate('rno',r,[]);
end;
end;
//SQL里面记得ORDER BY rno