如何判断TDBGridEh点击的是标题行而非下面的数据行

解决方案 »

  1.   

    類似要在ontitleclick事件裡寫東西(如:判斷是第幾列的標題)
      

  2.   

    点击标题就在OnTitleClick中处理,别和其他点击混在一起
      

  3.   

    Tols2位。那如何判断点击的是下面的数据行而标题行
      

  4.   

    思路:加判斷處理列的index(即ID)即可
      

  5.   

    在OnMouseDown事件中判断,鼠标位置是否在标题高度中,DBGridEh1.TitleHeight可以获得标题高度,只要鼠标的Y值,在DBGridEh1.Top和DBGridEh1.TitleHeight之间,表明在标题上
      

  6.   

    這個問題不太嚴謹,這是為什麼呢?因為這個標題(有可能是行,也有可能是列)所以要綜合考勤再作判斷,所以處理行或列的index(以單元格為基準);如果需要作處理(如後期傳值操作等)這樣才比較全面和周密。。
      

  7.   

    列是column,行是cell,代碼得到,能聯繫上(而且關聯相當大),自己動手你就知道了......
      

  8.   

    呵呵,言不必有失,旨在解決問題不是沒試過?方法、思路、技術等問題,沒有實現不了的...只是怕理解岐意寫不出來................ 
      xx:=ACellViewInfo.Value;
      yy:=cxGrid1DBTableView1.Controller.FocusedColumn.VisibleCaption;
      zz:=cxGrid1DBTableView1.Controller.FocusedRow.Values[0];
      jj:=RightStr(yy,2);
      ff:=cxGrid1DBTableView1.Controller.FocusedColumnIndex;
      aa:=FormatDateTime('yyyy-mm',cxDateEdit1.Date)+'-'+jj;
      if StrToInt(Trim(ff))=0 then
      begin
        MessageDlg('提示:不要選擇“部門名稱”的列標題,請點擊選擇擇人數!',mtWarning,[mbOK],0);
        Exit;
      end else
      begin
        qry_psjbdetail.Close;
        qry_psjbdetail.SQL.Clear;
        qry_psjbdetail.SQL.Add( ' select '''+ FormatDateTime('mm',cxDateEdit1.Date)+''' as YF,c.COLRQ,''>''+'''+ Trim(dxSpinEdit1.Text)+'''+''Hr'' as TJ,c.CB,c.BM,c.KB,c.XB,c.COLAID,c.Full_Name,c.COLJBT from ' );
        qry_psjbdetail.SQL.Add( ' (se...........
      

  9.   

    得不到,别拿cxGrid1DBTableView1来说事,别贴这些不沾边的代码,你去看看TDBGridEh的源代码,是如何区分titleclick的
      

  10.   

    拋磚引玉地補充下:
    以下是CX下測試的,DB的自己研究下.................  
      xx:=ACellViewInfo.Value;
      yy:=cxGrid1DBTableView1.Controller.FocusedColumn.VisibleCaption;
      zz:=cxGrid1DBTableView1.Controller.FocusedRow.Values[0];
      jj:=RightStr(yy,2);
      ff:=cxGrid1DBTableView1.Controller.FocusedColumnIndex;
      //DB的自己研究下...
      aa:=FormatDateTime('yyyy-mm',cxDateEdit1.Date)+'-'+jj;
      if StrToInt(Trim(ff))=0 then
      begin
      MessageDlg('提示:不要選擇“部門名稱”的列標題,請點擊選擇擇人數!',mtWarning,[mbOK],0);
      Exit;
      end else
      begin
      qry_psjbdetail.Close;
      qry_psjbdetail.SQL.Clear;
      qry_psjbdetail.SQL.Add( ' select '''+ FormatDateTime('mm',cxDateEdit1.Date)+''' as YF,c.COLRQ,''>''+'''+ Trim(dxSpinEdit1.Text)+'''+''Hr'' as TJ,c.CB,c.BM,c.KB,c.XB,c.COLAID,c.Full_Name,c.COLJBT from ' );
      qry_psjbdetail.SQL.Add( ' (se...........
      

  11.   

    其实楼主,没有必要费这么大劲,你不就要判断是在title还是在cell吗,那好,TDBGridEh有两个事件,OnCellClick和OnTitleClick,你只需要定义一个变量,比如clickwhich,然后写下面代码procedure TForm1.DBGridEh1CellClick(Column: TColumnEh);
    begin
      clickwhich := 0;
    end;procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
    begin
      clickwhich := 1;
    end;剩下的,你就是判断clickwhich 就ok了
      

  12.   

    DB的測試如下:var
      a,b:string;
    begin
     a:=inttostr(dbgrid1.DataSource.DataSet.recno);
     b:=inttostr(dbgrid1.SelectedIndex);
    end;StringGrid的測試如下: ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
      StringGrid1.Cells...
      StringGrid1.Cols...
      StringGrid1.Rows...
    end;cx的寫過了,DBgridEh的不用再測試了吧
      

  13.   

    顶居士,牛人
    经测试,kye_jufei((飞飞VS玲玲)天涯浪子居士)的代码通过。而且写出了db\cx\stringgrid,良师益友....
      

  14.   


    var
      iTmp: Integer;
    begin
      iTmp := DBGrid1.Row;end;
    {点击标题行与数据的第一行皆返回1,问题依然没有返回}
      

  15.   

    仔细看看,写了一堆代码,没一个着边的,不是cx就是dbgrid,还有cx,看看楼主要的是什么
      

  16.   

    SelectedIndex,你知道SelectedIndex返回的是什么值吗,如果你选择了一列,即使你再点击标题,这个值一样不会改变,根本不能作为点击标题的判断,DBgridEh的SelectedIndex返回的是点击的列的索引
      

  17.   

    你那方法也不好使呀!
    1、用MouseDown判断坐标,这个试过不行,你可以试试,
    2、你说用标志,这个也不行, 
    我要实现的是,DBGrid1DblClick里面做点事情
      

  18.   

    会不会问问题,说了半天才知道要在DBClick中做事情,告诉你OnTitleClick会发生在DBClick之前,所以你加个标志,然后双击时,是可以独到这个标记的,你自己动手试试,别张嘴就是不行
      

  19.   

    回bdmh:
    如果在CellClick里面加标志的话,楼主是在DblClick中判断。
    我用gettickcount判断,貌似DblClick比CellClick先触发,这样楼主判断的时候,
    标志可能还没有刷新赋值呢。stringgrid有个MouseToCell的方法,楼主看看他的代码,
    procedure TCustomDrawGrid.MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
    var
      Coord: TGridCoord;
    begin
      Coord := MouseCoord(X, Y);
      ACol := Coord.X;
      ARow := Coord.Y;
    end;grideh有个MouseCoord方法,返回的也是一个TGridCoord类型,楼主可以参考一下试试。
      

  20.   

    楼主这话好像是在说自己愚钝啊~~偶觉得没什么。
    楼上的脾气够爆的……呵呵~~procedure dbgrideh1dblclick(sender: tobject);
    var pot: TPoint;
        p: TGridCoord;
    begin
      getcursorpos(pot);
      pot := screentoclient(pot);
      p := dbgrideh1.MouseToCell(pot.X,pot.Y);
      if p.Y = 0 then
        showmessage('title')
      else
        showmessage('cell');
    end;
      

  21.   

    你在OnTitltClick,OnCellClick,DBClick中写代码,你就知道了,DBClick都是最后执行的
      

  22.   

    说一下,你的代码根本就不对,首先MouseToCell应为MouseCoord,即使改过,也无法得到是否点击标题栏,提示永远都是'cell'
      

  23.   

    我提供给你们正确的方法var
      cell:TGridCoord;
      p: TPoint;
    begin
      GetCursorPos(p);
      p := DBGridEh1.ScreenToClient(p);
      cell := DBGridEh1.MouseCoord(p.X,p.Y);
      if cell.Y = 0 then  //表示点击的上方标题栏
        ShowMessage('TopTitle')
      else if cell.X = 0 then  //表示点击的左侧标题栏
        ShowMessage('LefTitle')
      else
        ShowMessage('Cell');  //点击的是单元格
    end;
      

  24.   

    嘿嘿·~那个mousetocell是stringgrid的方法,写错了·~ -_-!!!!代码是凭感觉写的,没在环境下测试,就是给楼主说这个思路或者方法·~
      

  25.   

    to xu_xq:
    已经投诉你了,这位仁兄就像疯狗一样,各位不必理会
      

  26.   

    建议楼主使用 bdmh 说的 在OnTitleClick和OnCellClick中加标志,简单易懂,将来容易维护