我现在有一个MDI主窗体,还有一个MDI字窗体,
在这个子窗体上又建了一个窗体,怎么将新建的窗体中的值传给MDI子窗体form1 主窗体
form2 子窗体
form3 新窗体新窗体中
 procedure TForm3.Button1Click(Sender: TObject);
 begin
  form2.edit1.text:='aaaaaaaaa';
 end;
会提示
access violation at address 00571baa in module 'client.exe'.read of address 0000032c.

解决方案 »

  1.   

    你写一个property,在property中读取edt里的信息。
    类似于bean里的get和set的思想。不然通过全局变量传也可以
      

  2.   

    function form3create: string;
    begin
      with TForm3.create(nil) do
      begin
        try
          ShowModal;
        finally
          Result := s;  //   新窗体的值
           Free;
        end;
    end;uses unit3;form2.edit1.text := form3create;
      

  3.   

    2:你要先得到被控制的MDI的指针。如
    ControledMDi:=MDIFORM1;
    ...
    in MDIFORM2.button1的onclidk事件;
    TMDIFORM(ControledMDI).lable1.caption; 网上找到的答案,但是我试了不成功var
    ControledMDi:TFORM;
    begin
    ControledMDi:=Form2;
    TForm2(ControledMDI).LabeledEdit17.text:='aaaaaaaaaa';
    end;
      

  4.   

    所有窗体已经建立,那USES后就可以直接访问了。
      

  5.   

    我是这样做的,fmpubLOv是MDI子窗体,子窗体的值LOV_Result写入到主窗体的MEmo3中。if fmpubLOV.ShowModal = mrOk then
    begin
      Memo3.Lines.Add(Trim(LOV_Result));
      with TDM.cds_Public do
      begin
        close;
        CommandText :=' SELECT MB001 FROM INVMB WHERE MB001 LIKE :MB001 ORDER BY MB001';
        params.ParamByName('MB001').AsString := fmpubLOV.edFind.text;
        open;
      end;
    end;
      

  6.   

    楼主,你这问题很简单,是因为在创建form2时声明的不是全局变量,所以在其他地方不能引用到这个窗体变量,这样写就行了uses unit2;.....
      Form2:=Tform2.Create(Self);
      Form2.Show;
      

  7.   

    楼主,你这问题很简单,是因为在创建form2时声明的不是全局变量,所以在其他地方不能引用到这个窗体变量,这样写就行了 uses unit2; ..... 
      Form2:=Tform2.Create(Self); 
      Form2.Show;----------------------------
       with FrmClass.Create(self) do
         begin
           FormStyle:=fsMDIChild;
           WindowState:=wsMaximized;
           Show;
         end;你好,已经是全局变量了
      

  8.   

    哎,看来delphi的人才凋零啊!Delphi是面向对象的程序语言.窗体也是类.因此,窗体之间传参数,应按类的方式传递.一般好的开发语方时惯,不要使用form1 form2 form2等类似的变量.有两种方式传参数.
    一\过程
       在form的public段,声明procedure 或function 主窗体调用子窗体的实例的pcocedure或 function传参数.如 TForm3 中定义  procedure SendString( value :string;otherform :Tform);procedure Tform3.SendString( value :string;otherform :Tform);
    begin
       if assign(otherform) then
       begin
          Tform2(otherform).edit1.text:= value ; 
       end;
    end;
                    
    另一种是在 publice 段声明  property 属性  Property  otherform :Tform  seng   get .............
      

  9.   

    楼主,你这问题很简单,是因为在创建form2时声明的不是全局变量,所以在其他地方不能引用到这个窗体变量,这样写就行了 uses unit2; ..... 
      Form2:=Tform2.Create(Self); 
      Form2.Show;------------------------------
    声明的是全局变量
      

  10.   

    老大
    with  Tform2.Create(Self) do 这样创建能传递给全局变量(form2)吗?
    应该Form2:=Tform2.Create(Self);
        Form2.FormStyle:=fsMDIChild;
        Form2.WindowState:=wsNormal;
        Form2.Show;
    另外还是楼上的网友们说的,跨越类操作的应该还是调用被操作类的方法,不应该直接对被操作类里面的变量、子类进行操作,这样有点越权了吧?
      

  11.   

    zhihui521 的回答正确
    但还有个问题
    要将Form2:=Tform2.Create(Self); 
    Form2.FormStyle:=fsMDIChild; 
    Form2.WindowState:=wsNormal; 
    Form2.Show; 改成一个显示Form的函数怎么做,以上两种方法都不行procedure   TForm_Client.ShowForm(FrmClass:TForm);
    begin
        FrmClass:=TForm.Create(Self);
        FrmClass.FormStyle:=fsMDIChild;
        FrmClass.WindowState:=wsMaximized;
        FrmClass.Show;
    end;
    procedure   TForm_Client.ShowForm(ShowForm:TFormClass);
    var
     MyForm:TForm;
    begin
        MyForm:=ShowForm.Create(self);
        MyForm.FormStyle:=fsMDIChild;
        MyForm.WindowState:=wsMaximized;
        MyForm.Show;
    end;
    //无法传递给全局变量
      

  12.   

    做成函数的话,
    比较麻烦一些,要注册窗体类,然后按字符串查找类名,再创建窗体,最后将创建的窗体给全局变量form就行了
      

  13.   

    最近没上csdn,不好意思啊
    这是创建窗体的函数,现在返回的是窗体的handle,你自己改成返回窗体类的吧
    传进去的参数是窗体类名,且这些类名必须在初始化的时候注册,要不然找不到
    function TfrmMain.SetForm(frmClassName: string): THandle;
    var
      frmcls: Tformclass;
      cc: TPersistentclass;
      frm: Tform;
      i: Integer;
    begin
      Result := 0;
      try
        cc := Getclass(frmClassName);
        frmcls := TFormClass(cc);
      except  end;
      for i := 0 to MDIChildCount - 1 do
      begin
        if UpperCase(frmClassName) = UpperCase(MDIChildren[i].ClassName) then
        begin
          MDIChildren[i].BringToFront;
          Exit;
        end;
      end;  frm := frmcls.create(self);
      case frm.FormStyle of
        fsMDIChild:
          begin
            frm.show;
            Result := frm.Handle;
          end;
        fsNormal:
          begin
            frm.ShowModal;
             Result := frm.Handle;
            FreeAndNil(frm);
          end;
      end;
    end;