我在Tstringgrid  嵌入了一个TCOMBOBOX ,我在Tstringgrid的ONKEYDOWN 的事件
写了如下焦点移动的代码:
postmessage((sender as Tstringgrid).handle,Wm_keydown,vk_tab,0);
问题就是,当我在TCOMBOBOX选择某个条目的时候,上面那条语句就不起作用了。必须再
点击第二次才能下移到另一个网格. 如果是这样会给用户带来不便就是自己用也觉得不爽各位大侠怎么解决??

解决方案 »

  1.   

    重新继承ComboBox,重载下拉窗口的EndProc。
      

  2.   

    那你可以处理combox的onkeydown消息呀。
      

  3.   

    postmessage(stringgrid1.handle,Wm_keydown,vk_tab,0);
    可以这样吗??
      

  4.   

    在comboboxr的keydown中写上我上面的代码
      

  5.   

    TO: tanlijun37(tlj) 和  findcsdn  我在我发表此问题前,我已经进行处理过了,但是不能解决啊!!
       TO:(数字蛋糕)wndproc  这个窗口过程是怎么处理,给详细点好吗??
        我在TCOMBOBOX  的Onkeydown  的处理是这样的:
        postmessage(combobox1.handle,Wm_killfocus,0,0);
        postmessage(stringgrid1.handle,Wm_setfocus,0,0);
        postmessage(stringgrid1.handle,Wm_keydown,vk_tab,0);  
      其结果是下移了但输入焦点还在Tcombobox,也就是说下移到下一网格,但你输入时还在Tcombobox  里面,要用 鼠标点过才能转移输入焦点.
      

  6.   

    那我说清楚一点吧!比如说: 我在Tstringgrid 嵌入了一个TCOMBOBOX,TCOMBOBOX是在Tstringgrid 的第五列嵌入, 当我在第五列重画Tcombobox 时,进行选择条目的时候,就会发生
    输入焦点不下移的情况(也就是按回车键); 
        我在TCOMBOBOX  的Onkeydown  的处理是这样的:
        postmessage(combobox1.handle,Wm_killfocus,0,0);
        postmessage(stringgrid1.handle,Wm_setfocus,0,0);
        postmessage(stringgrid1.handle,Wm_keydown,vk_tab,0);  
      其结果是下移了但输入焦点还在Tcombobox,也就是说下移到下一网格,但你输入时还在Tcombobox  里面,要用 鼠标点过才能转移输入焦点.
      

  7.   

    postmessage(stringgrid1.handle,Wm_keydown,vk_tab,0); 
    你这一行代码,就是向StringGrid1 发送一个键盘消息,键值是vk_tab
    那么这一句的作用相当于在StringGrid1由焦点的时候,你敲了tab键,那么默认的操作就是将焦点移给可以接受焦点的下一个控件,所以你的StringGrid1肯定不能获得焦点啊
    去掉这句试试
      

  8.   

    首先感谢(天边流星)的回答,  其实上面的语句不管是代码顺序,还是去掉那一句都试过了.
    我是模拟了TAB 键,既然Tcombobox 是一个可以接受焦点的控件,Tstringgrid 也是一个可以接受
    焦点的控件,那么当我在Tstringgrid 里面重画的时候,并对Tcombobox选择条目的时,候应该说焦点已经转移到Tcombobox,所以我在进行一次模拟TAB键可以的吧! 按你的分析就是Tstringgrid不是下一控件,所以不能获得焦点,这个有道理.
      

  9.   

    To楼主:我几天没上网,没看到你的恢复。可能的原因是:
    因为你的问题是在ComboBox正在下拉的时候,此时拥有焦点的并不是ComboBox,而是它的下拉的窗口,所以你Post到ComboBox的消息没有得到处理。因为我上次接触到这个问题也有段时间了,所以一时没有办法给你一个确定的答案,望包涵。此外,个人人为有别的方法来解决这个问题。你也可以在Grid的选择事件中移动ComboBox呀。
      

  10.   

    TO: cybercake 我希望在CSDN有象你更多的热心人很感谢你的支持。你有QQ吗? 咱们交个朋友. 我的QQ :43350195
      

  11.   

    试了一下,这样可否procedure TMainForm.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    var
      rc: TRect;
    begin
      rc := StringGrid1.CellRect(ACol, ARow);
      rc.Left := rc.Left + StringGrid1.Left + 2;
      rc.Right := rc.Right + StringGrid1.Left;
      rc.Top := rc.Top + StringGrid1.Top + 2;
      rc.Bottom := rc.Bottom + StringGrid1.Top;
      ComboBox1.BoundsRect := rc;
      ComboBox1.SetFocus;
    end;procedure TMainForm.ComboBox1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key = 13 then
      begin
        PostMessage(StringGrid1.Handle, WM_KEYDOWN, VK_TAB, 0);
        PostMessage(StringGrid1.Handle, WM_KEYUP, VK_TAB, 0); 
        Key := 0;
      end;
    end;
      

  12.   

    xzgyb: 可能是你理解错我的意思了,要不就是我表达的不清楚。
      

  13.   

    TO: xzgyb   你看这里应该明白了吧!如果 不明白可以再问我, 非常感谢你! 
    那我说清楚一点吧!比如说: 我在Tstringgrid 嵌入了一个TCOMBOBOX,TCOMBOBOX是在Tstringgrid 的第五列嵌入, 当我在第五列重画Tcombobox 时,进行选择条目的时候,就会发生
    输入焦点不下移的情况(也就是按回车键); 
        我在TCOMBOBOX  的Onkeydown  的处理是这样的:
        postmessage(combobox1.handle,Wm_killfocus,0,0);
        postmessage(stringgrid1.handle,Wm_setfocus,0,0);
        postmessage(stringgrid1.handle,Wm_keydown,vk_tab,0);  
      其结果是下移了但输入焦点还在Tcombobox,也就是说下移到下一网格,但你输入时还在Tcombobox  里面,要用 鼠标点过才能转移输入焦点.
      

  14.   

    kl2000() :
    不好意思,才看到,不用谢
    哎,我太笨了,不是很懂。
    你能不能简单的弄个例子程序
    发到我邮箱里
    [email protected]
    我看看
      

  15.   

    xzgyb:  你有QQ吗? 加我QQ就行了。