一个计算器
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if char(key)=#97 then
    begin
        button1.SetFocus;
         .....//执行语句
 end;
end;
上面的为按小键盘对应数字键所对应的执行语句,为了看出按的是哪个键,所以每次先用setfocus
语句来取得焦点,即按数字键1就焦点跑到界面上1对应的button1,并执行相应的语句,按2就焦点定位到界面上的button2.
可是当焦点在数字键例如button1时,当按小键盘的Enter(本意是作为等于号计算结果时)时,
if  char(key)=#13 then
begin
button15.setfocus //button15为等于号,并没有取得焦点
end;
此时由于焦点定位在button1上,按回车时并没有使button15即等于号取得焦点,而是变成在button1上再次执行了。
请问该如何解决,已经设数字键button的default为false,而回车是还是执行了该按键,而没有使button15取得焦点。谢了

解决方案 »

  1.   

    先将TForm1的KeyPreview设置为true.
      

  2.   

    有啊,KeyPreview设置为true已经设置为true了
    问题是我按小键盘的Enter是想激发界面上的button15(等于号按钮)的事件,可由于焦点定位在前面按的数字键上,按回车时变成了再次单击前面的button了
      

  3.   

    上次执行完了焦点还在button1上,所以回车相当于单击,所以执行了button1.click;
    你可以每次执行完了之后把焦点再放回到form1上
    form1.setFocus;不就可以了吗?!
      

  4.   

    谢了!但是:
    有啊~ 我开始也这样认为可是不行,执行完button1焦点还是在button1上
    if char(key)=#97 then begin
    button1.setfocus;
    button1click(sender);
    form1.setfocus; //焦点还是在button1上
    end;if char(key)=#13 then  begin
    button12.setfocus; 还是没有取得焦点
    button12click(sender);
    end;
      

  5.   

    有谁知道为什么用了form1.setfocus,可焦点仍然在button上吗?谢了
      

  6.   

    你把button2的taborder设置成0,看看效果怎么样?
      

  7.   

    多放几个按钮button, 然后把button1 的tag 设为1,button2的tag 设为2    ,button3的tag 设为3,当from.setfoucus 的语句执行后,系统会把焦点自动设置在tag为最小值到button上面的,明白了吧!       给分吧.
      

  8.   

    还是不行呀,我把 button12即等于号设为taborder设置成0 了,还是不行呀
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    if char(key)=#97 then begin //小键盘 1
    button1.setfocus;
    button1click(sender);    //执行button1的代码
    form1.setfocus;
    end;
    if char(key)=#98 then   begin  //小键盘 2
    button2.setfocus;
    button2click(sender);   //执行button2的代码
    form1.setfocus;
    end;
    ...
    ....
    if char(key)=#13 then  begin //小键盘的回车
    button12.SetFocus;
    button12click(sender);  //执行button12的代码
    end;
    end;
      

  9.   

    button12我已经设为0 ,其他也分别大于0了
      

  10.   

    我用D7测试了一下,在form的keydown事件根本没办法捕获用户按回车的这个动作。估计要你特殊处理了。
      

  11.   

    建议你在keydown和keyup中使用伪码VK_ENTER!
    回车键不要用#13直接写13 其他的如:VK_DOWN VK_UP VK_SPACE VK_END VK_HOME 等等
    你可以到window.pas中查看!
      

  12.   

    to winxkm(蹩脚的程序员) 
      我就是用vk_return来测试的,根本没办法捕获回车事件。估计要用消息拦截来处理。
      

  13.   

    to 麻烦nann32258(大小迷糊)和winxkm(蹩脚的程序员) 两位大哥说详细一点可以吗?
    (我初学delphi),我就是用D7~if key=VK_ENTER  then  begin
    button12.SetFocus;
    button12click(sender);
    end;
    结果提示[Error] Unit1.pas(119): Undeclared identifier: 'VK_ENTER'我在keyup试了也和上面提示同样请问两位如何特殊处理或消息拦截,谢谢了!!
      

  14.   

    这样写:
    if  char(key)=#13 then
    begin
      button15.setfocus //button15为等于号,并没有取得焦点
    end;
    key:=#0;    //<-------------------------注意此处
      

  15.   

    OnKeyPress
    写上以下语句:
    if Key=#13 then begin
      Key := #0;
      button15.setfocus;
    end;
      

  16.   

    但是
    to:Alphen(正在学习VC) 和 kiboisme(蓝色光芒) 两位大哥
    如果我在FormKeyDown
    if char(key)=#13   then  begin
    char(key):=#0;
    button15.SetFocus;
    button15click(sender);
    end;
    [Error] Unit1.pas(198): Left side cannot be assigned to而放在FormKeyPress
    则和上面一样等于号button15没法取得焦点
    if key=#13   then  begin
    key:=#0;
    button15.SetFocus;
    button15click(sender);
    end;
    则等于号还是无法取得焦点
      

  17.   

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    beginif char(key)=#97 then begin
    button1.SetFocus ;
    button1click(sender); 小键盘数字键1
    form1.setfocus;
    end;if char(key)=#98 then   begin
    button2.setfocus;
    button2click(sender);  //小键盘数字键2
    form1.setfocus;
    end;if char(key)=#107 then  begin
    button13.setfocus; //小键盘的加号
    button13click(sender);
    form1.setfocus;
    end;end;procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
    beginif key=#13   then  begin
    key:=#0;
    button15.SetFocus; //小键盘的Enter ,即作为等于键使用
    button15click(sender);
    end;   end;我就是用上面的代码,试一下1+2 但就是不能当按小键盘的Enter使button15(等于号)取得焦点