我要实现的功能在所有的子窗体中的DBGridEH上点击鼠标的时候,在MainF中的状态栏上显示当前的行和列
并且当加入新的子窗体后也能继续使用,不用在子窗体上加入任何的代码我的实现方法是:1.在主要窗体上写行和列显示过程,调试后可以使用
如下:procedure Tmainf.ShowNowColAndRow(); //public
var
Cell : TGridCoord;
point : TPoint;
Row, Col : integer;
begin
if screen.ActiveControl is TDBGridEh then
begin
point := mouse.CursorPos;
Point := TDBGridEh(screen.ActiveControl).ScreenToClient(point);
cell := TDBGrid(screen.ActiveControl).MouseCoord(point.X, point.Y);
Col := THackGrid(TDBGridEh(screen.ActiveControl)).RawToDataColumn(cell.X);
Row := THackGrid(TDBGridEh(screen.ActiveControl)).RawToDataColumn(cell.y);
if not TDBGridEh(screen.ActiveControl).STFilter.Visible then
Row := Row + 1;
mainf.StatusBar.Panels.Items[0].Text := '行:' + inttostr(Row); ;
mainf.StatusBar.Panels.Items[1].Text := '列:' + inttostr(Row + 1); ; NowRow := Row; //private
NowCol := Col + 1; //private
end;
end;
2, 利用鼠标钩子实现全局的获取鼠标点击事件,并发送自定义消息 Dll中钩子执行代码如下:const LEFTMOUSE_DOWN =WM_USER+7;
//
//
function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
MouseHookStruct : ^TMOUSEHOOKSTRUCT;
begin
Result := 0;
if nCode < 0 then
Result := CallNextHookEx(hHk, nCode, WParam, LParam)
else
if wParam = WM_LBUTTONDOWN then
begin
Result := 1;
MouseHookStruct := Pointer(LParam);
SendMessage(MouseHookStruct.hwnd, LEFTMOUSE_DOWN, WParam, LParam);
end;
end;3,主程序窗体接收到消息后进行当前的行列显示代码如下:procedure Tmainf.WMLEFTMOUSE_DOWN(var Message: TMessage);
begin
ShowNowColAndRow;
end;//////
问题,我的这个代码不能够实现对子窗体可用,只能够对当主窗体可用原因是 MouseHookProc 中代码发送的是当前鼠标坐在的窗体的句柄,我试图改为mainf.handle
并没有成功
,
请各位大侠帮我想想办法,是不是不通过钩子也能实现,怎么去实现?
我从昨天就可是弄这个了,很累了.
谢谢,
并且当加入新的子窗体后也能继续使用,不用在子窗体上加入任何的代码我的实现方法是:1.在主要窗体上写行和列显示过程,调试后可以使用
如下:procedure Tmainf.ShowNowColAndRow(); //public
var
Cell : TGridCoord;
point : TPoint;
Row, Col : integer;
begin
if screen.ActiveControl is TDBGridEh then
begin
point := mouse.CursorPos;
Point := TDBGridEh(screen.ActiveControl).ScreenToClient(point);
cell := TDBGrid(screen.ActiveControl).MouseCoord(point.X, point.Y);
Col := THackGrid(TDBGridEh(screen.ActiveControl)).RawToDataColumn(cell.X);
Row := THackGrid(TDBGridEh(screen.ActiveControl)).RawToDataColumn(cell.y);
if not TDBGridEh(screen.ActiveControl).STFilter.Visible then
Row := Row + 1;
mainf.StatusBar.Panels.Items[0].Text := '行:' + inttostr(Row); ;
mainf.StatusBar.Panels.Items[1].Text := '列:' + inttostr(Row + 1); ; NowRow := Row; //private
NowCol := Col + 1; //private
end;
end;
2, 利用鼠标钩子实现全局的获取鼠标点击事件,并发送自定义消息 Dll中钩子执行代码如下:const LEFTMOUSE_DOWN =WM_USER+7;
//
//
function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
MouseHookStruct : ^TMOUSEHOOKSTRUCT;
begin
Result := 0;
if nCode < 0 then
Result := CallNextHookEx(hHk, nCode, WParam, LParam)
else
if wParam = WM_LBUTTONDOWN then
begin
Result := 1;
MouseHookStruct := Pointer(LParam);
SendMessage(MouseHookStruct.hwnd, LEFTMOUSE_DOWN, WParam, LParam);
end;
end;3,主程序窗体接收到消息后进行当前的行列显示代码如下:procedure Tmainf.WMLEFTMOUSE_DOWN(var Message: TMessage);
begin
ShowNowColAndRow;
end;//////
问题,我的这个代码不能够实现对子窗体可用,只能够对当主窗体可用原因是 MouseHookProc 中代码发送的是当前鼠标坐在的窗体的句柄,我试图改为mainf.handle
并没有成功
,
请各位大侠帮我想想办法,是不是不通过钩子也能实现,怎么去实现?
我从昨天就可是弄这个了,很累了.
谢谢,
解决方案 »
- 新人搞多线程,把我搞晕乎了,大虾支支招吧,谢谢了
- delphi6开发人员指南,谁需要
- 请问自己做的组件怎么给它加上图标??
- 哪有installshield下的?
- 请问:类似于病毒库更新的程序是什么原理呢?我知道,肯定是向FTP服务器或者HTTP服务器发请求,然后比对文件,再下载。可是究竟是怎么实
- 有没有象Delphi的对象查看器那样的控件?
- 多表联合统计!诚征高手解答。
- 请问高手,WORD加密文档可以用什么方法解密?
- 如何向表单内写信息。
- DHTMLEdit中如何设置字体颜色,大小??
- 如何获取一个TComponent控件所在位置的屏幕坐标???
- ADO通过IP地址远程连接SQL Server的问题!!!
begin
Form1.Caption:='行:'+IntToStr(DBGridEh1.Row)+'/列:'+IntToStr(DBGridEh1.Col mod (DBGridEh1.FieldCount-1));
end;
不知道还有没有其他方法
你的这个办法是可以的,但是必须在每个表格上写入的
我需要的是一次写入后,所有的表格都能用,包括新加入的表格
另外,你的这个方式仅能判断点击到了那个单元格,不能判断是否点击到了标题上或者行标上,这些我都要的
大家帮忙想想吧