我要实现的功能在所有的子窗体中的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 TForm1.DBGridEh1CellClick(Column: TColumnEh);
    begin
    Form1.Caption:='行:'+IntToStr(DBGridEh1.Row)+'/列:'+IntToStr(DBGridEh1.Col mod (DBGridEh1.FieldCount-1));
    end;
    不知道还有没有其他方法
      

  2.   

    RocketLi(火箭)
    你的这个办法是可以的,但是必须在每个表格上写入的
    我需要的是一次写入后,所有的表格都能用,包括新加入的表格
    另外,你的这个方式仅能判断点击到了那个单元格,不能判断是否点击到了标题上或者行标上,这些我都要的
    大家帮忙想想吧