delphi 用代码模拟2个鼠标、键盘操作,高手进
1、datetimepicker用鼠标点击右端的箭头才能出现下拉菜单,我希望按回车键就能弹出下拉菜单,应该怎么实现?2、dbgrid用方向键能把光标移动到指定的单元格,用...
1、datetimepicker用鼠标点击右端的箭头才能出现下拉菜单,我希望按回车键就能弹出下拉菜单,应该怎么实现?
2、dbgrid用方向键能把光标移动到指定的单元格,用代码又应该怎么定格在指定的单元格呢?例如有一个5*5的dbgrid,点击某个按钮就把光标移到第2行第3列的单元格。
本人新手,这2个问题琢磨了很久,请高手们指点一下,先谢了。 展开
2、dbgrid用方向键能把光标移动到指定的单元格,用代码又应该怎么定格在指定的单元格呢?例如有一个5*5的dbgrid,点击某个按钮就把光标移到第2行第3列的单元格。
本人新手,这2个问题琢磨了很久,请高手们指点一下,先谢了。 展开
1个回答
2013-09-19
展开全部
问题一: // 敲回车键时,取当前鼠标位置备份起来, 再计算日历控件的下拉按钮的位置,//并设置当前鼠标位置到此点,最后就是模拟鼠标点一下,然后还原原先鼠标的位置就可以搞掂了procedure TForm1.DateTimePicker1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
p1,p: TPoint;
begin
if key=13 then begin
p.X:= DateTimePicker1.Left + DateTimePicker1.Width - 3;
p.Y:= DateTimePicker1.Top + 3;
p:= ClientToScreen(p);
GetCursorPos(p1);
SetCursorPos(p.X,p.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN,p.X,p.Y,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,p.X,p.Y,0,0);
SetCursorPos(p1.X,p1.Y);
end;
end;///////////////////////////////////////////////////////////////{问题二:首先, 要设置某单元格的焦点的前提是要知道这个单元格的坐标位置,我们知道TStringGrid有CellRect这个属性可以轻易取得某行某列的单元格的坐标位置,但遗憾的是TDBGrid却没有继承这个好用的方法, 自己继承TDBGrid再发布该方法也可以,但这样要声明控件及创建对象,不太方便,幸好TDBGrid 和TStringGrid都继承自同一基类: TCustomGrid, 并且在TCustomGrid类里已在保护域实现了该方法,因此可把TDBGrid作兼容性转换为TStringGrid再调用父类的CellRect方法就可以取得坐标了,知道坐标后就好办了,所有的单元格都是父窗口(TDBGrid主窗口)的子窗口,只要发送单击鼠标的消息给子窗口处理就可以实现了.为了方便使用,我做了下边这个函数}///////函数功能: 使DBGrid里边指定的单元格呈选定状态, x为 第几列, y 为第几行
procedure FocusCell(var StrGrid :TDBGrid; const x, y :Integer);
var
P :TPoint;
R :TRect;
ch :HWND;
begin
R := TStringGrid(StrGrid).CellRect(x, y);
p.X := R.Left;
p.Y := R.Top;
ch := ChildWindowFromPoint(StrGrid.Handle, p);
SendMessage(ch, WM_LBUTTONDOWN, 0, MAKELPARAM(p.X, p.Y));
SendMessage(ch, WM_LBUTTONUP, 0, MAKELPARAM(p.X, p.Y));
end; procedure TForm1.Button1Click(Sender: TObject);
begin
FocusCell(DBGrid1, 5, 5); //五行 五列 选定, 注意,必须要有5行5列
end;////////////////////////////////可以试用我的方法, 如果仍无法解决你的问题再问.
Shift: TShiftState);
var
p1,p: TPoint;
begin
if key=13 then begin
p.X:= DateTimePicker1.Left + DateTimePicker1.Width - 3;
p.Y:= DateTimePicker1.Top + 3;
p:= ClientToScreen(p);
GetCursorPos(p1);
SetCursorPos(p.X,p.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN,p.X,p.Y,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,p.X,p.Y,0,0);
SetCursorPos(p1.X,p1.Y);
end;
end;///////////////////////////////////////////////////////////////{问题二:首先, 要设置某单元格的焦点的前提是要知道这个单元格的坐标位置,我们知道TStringGrid有CellRect这个属性可以轻易取得某行某列的单元格的坐标位置,但遗憾的是TDBGrid却没有继承这个好用的方法, 自己继承TDBGrid再发布该方法也可以,但这样要声明控件及创建对象,不太方便,幸好TDBGrid 和TStringGrid都继承自同一基类: TCustomGrid, 并且在TCustomGrid类里已在保护域实现了该方法,因此可把TDBGrid作兼容性转换为TStringGrid再调用父类的CellRect方法就可以取得坐标了,知道坐标后就好办了,所有的单元格都是父窗口(TDBGrid主窗口)的子窗口,只要发送单击鼠标的消息给子窗口处理就可以实现了.为了方便使用,我做了下边这个函数}///////函数功能: 使DBGrid里边指定的单元格呈选定状态, x为 第几列, y 为第几行
procedure FocusCell(var StrGrid :TDBGrid; const x, y :Integer);
var
P :TPoint;
R :TRect;
ch :HWND;
begin
R := TStringGrid(StrGrid).CellRect(x, y);
p.X := R.Left;
p.Y := R.Top;
ch := ChildWindowFromPoint(StrGrid.Handle, p);
SendMessage(ch, WM_LBUTTONDOWN, 0, MAKELPARAM(p.X, p.Y));
SendMessage(ch, WM_LBUTTONUP, 0, MAKELPARAM(p.X, p.Y));
end; procedure TForm1.Button1Click(Sender: TObject);
begin
FocusCell(DBGrid1, 5, 5); //五行 五列 选定, 注意,必须要有5行5列
end;////////////////////////////////可以试用我的方法, 如果仍无法解决你的问题再问.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询