Form1.Edit1.SetFocus;
Edit1是当前窗体的...

解决方案 »

  1.   

    Form1上没有任何控件,Edit是原来OnEnter的那个Edit,只有一个Edit,意思就是在Edit上点击之后触发OnEnter事件,并打开新窗口,新窗口打开后会获得焦点,原来的Edit就不能输入内容了,我现在要求原来的Edit又重新获得焦点
      

  2.   

    form1上有个edit1,form1中显示form2,在form2的OnShow事件里设置form1.edit1.SetFocus
      

  3.   


    用SetFocus的方法治标不治本,当程序复杂一点了就没办法控制了,就是想找一种更好的方法
      

  4.   

    关键还有一个要求,Form1中打开Form2之后,不能在Form2中写代码控制Form1中的控件 
      

  5.   

    LZ基础也实在太差了点啊啥是标本啊所有窗体获取焦点都是通过发送WM_SETFOCUS消息实现的,
    SetFocus方法就是发送WM_SETFOCUS消息这一过程的包装而已。在form2类中添加一个变量用来访问form1中的变量// form2
    type
      TForm2 = class(TForm)
        procedure formshow(sender:tobject);
      public
        parent:tform; // 用来保存父窗体的引用,假设是form1
      end;procedure TForm1.FormShow(Sender: TObject);
    begin
      parent.edit1.sefocus;// 直接操作form1中的控件
    end;// 在from1中
    var
     f2:tfom2;
    begin
     f2:=tform2.create(self);
     f2.parent:= form1;// 把form1的引用传递给form2的parent变量
     .....
      

  6.   


    谢谢sololie的热心帮助,你说的这些我也懂,现在的要求是Form2不允许访问Form1中的控件
      

  7.   

    加句PostMessage(Edit1.Handle, WM_SETFOCUS, 0, 0); 试试
      

  8.   

    PostMessage(Edit1.Handle, WM_SETFOCUS, 0, 0);
    这种方法也试过了,可以获焦,也可以自动选中Edit1中的文本,但是无法输入内容。
      

  9.   

    var
      Form1: TForm2;
    begin
      Form1 := TForm2.Create(Application);
      Form1.Show;
      Edit1.SetFocus;
      PostMessage(Edit1.Handle, WM_SETFOCUS, 0, 0);
    我这样没问题啊.可以获焦点也可以自动选中
      

  10.   

    var
      Form1: TForm2;
    begin
      Form1 := TForm2.Create(Application);
      Form1.Show;
      Edit1.SetFocus;直接这样就可以,可以获得焦点可以直接输入不用再点鼠标,只不过不现实caret而已,我是奇怪你为什么不行?
      

  11.   

    caret看不到就像你10#那样直接postmessage就行了嘛
      

  12.   

    可以看看这个,比较下有什么不一样
    http://pan.baidu.com/s/1FyrUQ
      

  13.   

    Type
      TMyEdit = class(TEdit)
      protected
        procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
      end;{ TMyEdit }
    procedure TMyEdit.WMSetFocus(var Message: TWMSetFocus);
    begin
      if not Form2.Visible then begin
        SendMessage(Handle , WM_KILLFOCUS , 0 , 0);
        Form2.Show;
        SetFocus;
        Message.Result := 1;
        exit;
      end;
      inherited;
    end;
      

  14.   

    其实我猜到LZ意思,可能是想要两个窗口(form1和form2)都是活动的,即都在最前面
      

  15.   

    windows下同一时刻只能一个窗口获得焦点
      

  16.   

    把form2的样式设置成fsStayOnTop就得了,不可能form2获得焦点时,form1中的edit窗口也能获得焦点
      

  17.   

    解决了,昨天晚上回去试验成功了,我的要求是:
    Form1是子窗体或fsNormal窗体,Form2是任意窗体,在Form1中有个Edit1,在Edit1的OnEnter上触发弹出Form2,Form2弹出后光标继续停留在Form1.Edit1上,且可在Edit1上直接输入内容。我的解决方案是:
      

  18.   

    怎么Ctrl+Enter是提交回复啊,换行用习惯了总搞错!不好意思!解决了,昨天晚上回去试验成功了,我的要求是:
    Form1是子窗体或fsNormal窗体,Form2是任意窗体,在Form1中有个Edit1,在Edit1的OnEnter上触发弹出Form2,Form2弹出后光标继续停留在Form1.Edit1上,且可在Edit1上直接输入内容。我的解决方案是:
    procedure TForm1.Edit1Enter(Sender: TObject);
    var
      v_CustonForm: TCustomForm;
    begin
      Form2 := TFrom2.Create(Application);
      Form2.Show;
      v_CustonForm := GetParentForm(Edit1);
      if v_CustonForm <> nil then
      begin
        if TForm(v_CustonForm).FormStyle = fsMDIChild then
        PostMessage(v_CustonForm.Handle,WM_SETFOCUS,0,0);  //如果是子窗体必须要先让子窗体获得焦点
      end;
      PostMessage(Edit1.Handle,WM_SETFOCUS,0,0);//再设置Edit1获得焦点
      Edit1.SelectAll;
    end;
      

  19.   


      Form2:=TForm2.Create(Application);
      Form2.Enabled:=False;
      form2.Show;
      Edit1.SetFocus;
      Form2.Enabled:=True;已测试,可用.form2.最好前置.要不会显示在form1后面.