我制作一个添加记录的模块
该窗体上动态创建了label和maskedit控件
为了使用户使用时方便些,需要使用setfocus属性
例如:有两个动态创建的文本输入控件aa1,aa2
用户在aa1内添入文本后按下回车光标自动定位到aa2上。
如果窗体上本身就有的控件可以在该控件的keydown事件里定义setfocus
但是由于控件是动态建立的,也就是窗体显示的时候这些控件才生成,那要实现上面的功能,该怎么办呢?

解决方案 »

  1.   

    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if key=13 then
        SelectNext(ActiveControl,True,True);
    end;var edit:TEdit;
      edit:=TEdit.Create(self);
      edit.Parent:=self;
      edit.OnKeyDown:=Edit1KeyDown;
      

  2.   

    楼上说的对
    不过,还有一种方法
    即全局EnterToTab 
    不过这个,要设置控件的Tab是按顺序来的1
      

  3.   

    为动态建立的添加keydown事件
    定义自己的keydown事件
    procedure MyKeyDown(Sender: TObject; var Key: Word;
           Shift: TShiftState);
    keydown事件的实现
    procedure TForm1.MyKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if Key = VK_RETURN then
        SelectNext(self, true, true);//
    end;var
      aa, bb: TEdit;
    begin
      aa := TEdit.Create(self);
      aa.Top := 200;
      aa.Left := 30;
      aa.Parent := self;
      aa.TabOrder := 0;
      aa.Text := '0';
      aa.OnKeyDown := MyKeyDown;//动态赋值keydown事件
      

  4.   

    楼上的各位,SelectNext(ActiveControl,True,True);这句话过不去呀
      

  5.   

    Perform(WM_NEXTDLGCTL, 0, 0);不过保证这两个控件的taborder 相互挨着 而且前面的要比后面的小1
      

  6.   

    Perform(WM_NEXTDLGCTL, 0, 0);还是这句有问题
      

  7.   

    利用RETURN代替TAB    
        
    Shift + Tabperform(WM_NEXTDLGCTL,0,0);这是向下移动,请问如何向上移动??????perform(WM_NEXTDLGCTL,1,0);即可向上移动为什么不看MSDN,不看HELP你当然不知道了。perform(WM_NEXTDLGCTL,0,1)控制焦点移动,还可以利用TWinControl.SelectNext()方法来做!*********************Form.KeyPreview := true; 在Form的KeyDown中if Key = VK_RETURN thenbeginif ActiveControl is TDBGrid or ... thenPostMessage(ActiveControl.Handle, WM_KEYDOWN, VK_TAB, 0);elsePostMessage(Handle, WM_KEYDOWN, VK_TAB, 0);Key := 0;end---------------procedure EnterToTab(aForm: TForm; var Key: Char);beginif Key = #13 thenbeginkey := #0;aForm.Perform(CM_DialogKey, VK_TAB, 0);end;end;***************或者拦截Application.OnMessage即可,添加代码:if Msg.Message = WM_KEYDOWN thenbeginif Msg.wParam = VK_RETURN thenKeybd_event(VK_TAB, 0, 0, 0);end; //if
     
       
      

  8.   

    SelectNext(self, true, true);//
    这句提示undeclared identifier 'selectnext'
      

  9.   

    SelectNext(self, true, true);//
    这句提示undeclared identifier 'selectnext'--use Controls;
      

  10.   

    在调用MyKeyDown时会要求aa.mykeydown
    要怎么写呢?
      

  11.   

    在调用MyKeyDown时会要求aa.mykeydown
    要怎么写呢?
    --
       aa.OnKeyDown := MyKeyDown;//动态赋值keydown事件,这其实就是函数指针,
      这样赋之后当出发aa的onKeyDown事件时就会自动运行aa.mykeydown
      

  12.   

    aa.OnKeyDown := MyKeyDown;//动态赋值keydown事件,这其实就是函数指针,
      这样赋之后当出发aa的onKeyDown事件时就会自动运行aa.mykeydown//可是我创建的是好多好多控件,不是一个呀
    控件为数组型,控件名为ss[1],ss[2].......那aa.ondeydown要怎么写呢?
      

  13.   

    没人顶,我自己来我们做了一个软件,在开发过程中是分块做的,现在把各块合到一起以后
    在引用窗体名时,例如:aa.showmodal
      messagebox(sccxct.Handle,'该操作将删除所有条件,您真的要删除吗?','提示',mb_yesno)
    都会发生错误,提示内存读写错误请问高手为什么呢?
      

  14.   

    //可是我创建的是好多好多控件,不是一个呀
    控件为数组型,控件名为ss[1],ss[2].......
    --一样赋值
      你在创建ss[1],ss[2].......时,
       把ss[1],ss[2].......的onKeyDown := MyKeyDown;就可以了
      

  15.   

    可以试试动态的设置创建控件得table order属性
      

  16.   

    创建部分:for i:=0 to hang*lie-1 do   //hang*lie是创建控件的个数,为全局变量
        begin
          if xgct_lab1.Caption='修改记录' then f1:=dm.Query1.Fields[i].AsString  ;
          zdz1[i]:=Tmaskedit.Create(self);
          zdz1[i].Parent:=self;
          zdz1[i].Text :=f1 ;
          zdz1[i].Left :=ll;    //ll,tt为控制控件位置的变量
          zdz1[i].Top:=tt;
          if (dm.Query1.Fields[i].DataType=ftdatetime) and (f1='') then
            begin
              zdz1[i].EditMask:='9999/99/00 90:00:00;1;_'   ;
            end;
          tt:=tt+40;
           if ((i+1) mod hang*lie )=0 then
            begin
               if (yu>0) and (yu<=2) then//控件生成时为二列或三列,yu 是字段个数除二或除三的余数。
                begin
                  if xgct_lab1.Caption='修改记录' then f1:=dm.Query1.Fields[hang*lie].AsString  ;
                  if (yu=1) and (f=true) then
                    begin
                      //f1:=dm.Query1.Fields[hang*lie].AsString ;
                      zdz1[hang*lie]:=Tmaskedit.Create(self);
                      zdz1[hang*lie].Parent:=self;
                      zdz1[hang*lie].Text:=f1;
                      zdz1[hang*lie].Left :=ll;
                      zdz1[hang*lie].Top :=tt;
                      f:=false;
                    end;
                  if (yu=2) and (f=true) then
                    begin
                      for j:=1 downto 0 do
                        begin
                          zdz1[hang*lie+j]:=Tmaskedit.Create(self);
                          zdz1[hang*lie+j].Parent:=self;
                          zdz1[hang*lie+j].Text :=f1;
                          zdz1[hang*lie+j].Left :=ll;
                          zdz1[hang*lie+j].Top :=tt;
                          ll:=ll+64+200;
                        end;
                      f:=false;
                       ll:=ll-528;
                    end;
                  end;
                  ll:=ll+64+200;
                  btt:=tt;
                  tt:=60;
                end;
            end;
      

  17.   

    if xgct_lab1.Caption='修改记录' then f1:=dm.Query1.Fields[i].AsString  ;
          zdz1[i]:=Tmaskedit.Create(self);
          zdz1[i].Parent:=self;
          zdz1[i].onKeyDown := MyKeyDown;  //添加onKeyDown 事件-------------------------
          zdz1[i].Text :=f1 ;
          zdz1[i].Left :=ll;    //ll,tt为控制控件位置的变量
          zdz1[i].Top:=tt;
      

  18.   

    在//  private下面定义MyKendown控件