超郁闷,真困惑.....请各位帮忙解决......谢谢...//form1的代码 
uses Unit2;{$R *.dfm}procedure TForm1.ClickOpenForm(formname:string);  自定义的用字符串打开form的过程
var
myformclass:TFormClass;
aform:TForm;
begin
  myformclass:=TFormClass(FindClass(formname));
  aform:=Tform(TFormClass(FindClass(formname)));
  if GetClass(TFormClass.ClassName)<>nil then
    begin
      aform:=myformclass.Create(Application);
      try
        aform.ShowModal;
      finally
        aform.Free;
      end;
    end;
end;procedure TForm1.Button1Click(Sender: TObject);  
begin
  ClickOpenForm('Tform2');  //将想要ShowModal的窗体名称传给自定义过程
end;initialization
  RegisterClass(Tform2);
end.//form2的代码
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form2.Edit1.Text:='hello';       //这样给edit1.text赋值,没反应.
  //Self.Edit1.Text:='hello';       //这样给edit1.text赋值,可以.
  //Edit1.Text:='hello';       //这样给edit1.text赋值,也没问题.
 //在form2内需要打开窗体form3 在form3内的button1的click事件内写代码    Form2.Edit1.Text:='hello';  也是不行的....
end;请问如何解决呢?万分感谢!!!!!!!!

解决方案 »

  1.   

    因为你没有建FORM2这个实例吖,晕
      

  2.   

    if Assigned(Form2) then Form2.Edit1.Text:='hello'; 这样你就知道了,你没实例,怎么去操作..
      

  3.   

    1、Form2.Edit1.Text:='hello';       //这样给edit1.text赋值,没反应.
    这个Form2是全局变量(可能叫实例准确一些)2、aform:=myformclass.Create(Application);
    这个aform是TForm1.ClickOpenForm方法中定义的局部变量看出来了吧,这两个并不是一回事,此Form非彼Form,所以当然没反应
      

  4.   

    解决什么呢,你都写出来了
    用Self,Self也可省略
      

  5.   

    请看我的这一句....... //在form2内需要打开窗体form3 在form3内的button1的click事件内写代码    Form2.Edit1.Text:='hello';  也是不行的....
      

  6.   


    他只创建一个TFORM2类的一个实例,叫aform. 并没有FORM2这个实例不有一点,亮剑兄说的,应该就是全局的问题了. 如果把aform:TForm;放到全局那里,是可以的
    但TFORM2里的事件是则要改成  (AForm as TForm2).Edit1.Text:= 'Hello';
      

  7.   

    这样明显不行.........
    如果改成  (AForm as TForm2).Edit1.Text:= 'Hello'; 都知道是要 as TForm2 了,那当时还用字符串创建干嘛哩?
      

  8.   

    那你不会在建FORM3时传指针吖
      

  9.   

    上面的人不是解释原因了?
    你的form2根本没有指向TForm2的实例你可以定义一个基类窗,里面定义一个虚方法
    procedure AssignObject(aObj : TObject); virtual;
    子类窗 override AssignObject
    begin
      子类窗变量:= aObj;
    end;
    然后创建时:
    procedure TForm1.ClickOpenForm(formname:string);  自定义的用字符串打开form的过程
    var
    myformclass:TMyFormClass;
    aform:TForm;
    begin
      myformclass:=TMyFormClass(FindClass(formname));
      aform:=Tform(TMyFormClass(FindClass(formname)));
      if GetClass(TMyFormClass.ClassName)<>nil then
        begin
          aform:=myformclass.Create(Application);
         aform.AssignObject(aForm)
          try
            aform.ShowModal;
          finally
            aform.Free;
          end;
        end;
    end;
      

  10.   

    都知道是要 as TForm2 了,那当时还用字符串创建干嘛哩..
    问题1:我看你是自己把你自己搞晕了, 你不对TFORM2的实例操作,你对什么操作吖??  你本意是对什么操作?? 还反过来问,晕了.... 
    问题2:看过 TEDIT(xxx).xxx了吧. 竟然你都还能找类了,那为什么不能用这个类来强制转换吖??
    问题3:看样子,你是想通用字符来操作吧,那么,当你找到字符对应的类后,但是你的程序里又写死了某类的某控件的TEXT:='HELLO'. 你怎么知道这个类里的这个控件吖,就算有,你怎么知道有这个控件就叫这个名吖.唉~ 不说了. 
      

  11.   

    在form3中引用的Form2并不是ShowModal出的那个Form2实例!
    ShowModal出那个Form叫aform,是定义在TForm1.ClickOpenForm方法中的局部变量
    而Form2如果你没有删掉IDE默认加上的,则是TForm2所在单元的全局变量简而言之,就是搞错对象
    对象(也称为实例)名只在代码中是有意义的,是给程序员看的
    执行时计算机是不认名字的,对象都是内存地址
      

  12.   

    uses Unit2;{$R *.dfm}procedure TForm1.ClickOpenForm(formname:string);  自定义的用字符串打开form的过程
    var
      myformclass:TFormClass;
      aform:TForm;
    begin
      myformclass:=TFormClass(FindClass(formname));
      aform:=Tform(TFormClass(FindClass(formname)));
      if myformclass <> nil then
      begin
        aform:=myformclass.Create(nil);
        try
          aform.ShowModal;
        finally
          aform.Free;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);  
    begin
      ClickOpenForm('Tform2');  //将想要ShowModal的窗体名称传给自定义过程
    end;initialization
      RegisterClass(Tform2);
    finalization
      UnRegisterClass(Tform2);end.//form2的代码
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      Form2.Edit1.Text:='hello';       //这样给edit1.text赋值,没反应.
      //Self.Edit1.Text:='hello';       //这样给edit1.text赋值,可以.
      //Edit1.Text:='hello';       //这样给edit1.text赋值,也没问题.
     //在form2内需要打开窗体form3 在form3内的button1的click事件内写代码    Form2.Edit1.Text:='hello';  也是不行的....
    //更改为,因为Form2是变量。类中不要设计用变量的名称
      self.Edit1.Text:='hello';end;
      

  13.   

    找到最简单的解决办法了。在每个窗体的建体时执行一下窗体名:=self.
    例如:
    procedure TForm_Apply_Money_To_OA.FormCreate(Sender: TObject);
    begin
      Form_Apply_Money_To_OA:=Self;
    end;
    这样之后,就没有任何问题了
      

  14.   

    真有创意。直接换成self就行了