我的问题是这样的:有三个窗体 frmA,frmB,frmC在frmA中这样调用frmB:
procedure .....
  with TfrmB.Create(Self,optAdd,-1) do
  try
    ShowModal;
    DM.qryAppTest.Close;
    DM.qryAppTest.Open;
  finally
    Free;
  end;
end;frmB中的关键相应代码:constructor Create(AOwner: TComponent;AOperateType: TOperateType;ATestID: Integer); reintroduce;{这是定义}{构建函数}
constructor TfrmB.Create(AOwner: TComponent;AOperateType: TOperateType;ATestID: Integer);
begin
  inherited Create(AOwner);
  FOperateType:=AOperateType;
  FTestID:=ATestID;  ClearData;
  if FOperateType=optEdit then
    LoadData;
end;然后在frmB中又调用到frmC
procedure TfrmB.btnRyxmClick(Sender: TObject);
begin
  with TfrmC.Create(Self,1) do
  try
    ShowModal;
  finally
    Free;
  end;
end;frmC中的代码如下:
constructor Create(AOwner: TComponent;AFlag: Integer); reintroduce;{定义}constructor TfrmC.Create(AOwner: TComponent;AFlag: Integer);
begin
  inherited Create(AOwner);
  FFlag:=AFlag;
end;后面我想把frmC中的一些数据赋值给frmB中的变量,可是一直报错:
赋值代码:
   frmB.FManID:=1;
   frmB.FYpxmID:=2;错误提示:project a.exe raised exception class EAccessViolation with message'Access
violation at address 00558EC1 in module 'a.exe'.Write of address 00000358'.
Process stopped.Use Step or Run to continue.不知道如何解决,请大家指教呀!

解决方案 »

  1.   

    呵呵
    以前也遇到过此麻烦。解决了。
    每个frm都有一个系统生成的实例。
    你的frma是系统生成的。你的frmb 和 frmc 也是系统生成的。既然系统已经生成他们了,所以编译的时候可以通过,但是他们没有初始化!
    关键就是这句坏了事:
    with TfrmB.Create(Self,optAdd,-1) do 
    改成 
    with frmb=TfrmB.Create(Self,optAdd,-1) do 
    再到系统配置里把frmb,frmc的自动生成属性消掉。
    可能也要注掉这句:constructor Create(AOwner: TComponent;AOperateType: TOperateType;ATestID: Integer); reintroduce;{这是定义}手边没有delphi,
    未验证。
      

  2.   

    把frmB中的变量地址作为参数传递给frmC的实例,这样就可以在frmC的实例中改变这里变量值了。例如:  TfrmB = class(TForm)
        private
          FManID : Integer;
          FYpxmID: Integer;
      end;  TfrmC = class(TForm)
        private
          FManID : PInteger;
          FYpxmID: PInteger;
          constructor Create(AOwner: TComponent; AFlag: Integer; AManID: PInteger); reintroduce;
      end;constructor TfrmC.Create(AOwner: TComponent; AFlag: Integer; AManID, AYpxmID: PInteger); reintroduce;
    begin
      FManID := AManID;
      FYpxmID:= AYpxmID;
    end;procedure TfrmC.XXX();
    begin
      FManID^ := 1;
      FYpxmID^ := 2;
    end;procedure TfrmB.btnRyxmClick(Sender: TObject); 
    begin 
      with TfrmC.Create(Self,1, @FManID, @FYpxmID) do 
      try 
        ShowModal; 
      finally 
        Free; 
      end; 
    end; 
      

  3.   

    一个指针就可以了:
    TfrmC......
    private 
       PSendForm:Pointer;
       constructor Create(AOwner: TComponent; ASendForm:Pointer); reintroduce;
    ......constructor TfrmC.Create(AOwner: TComponent; ASendForm:Pointer); reintroduce; 
    begin 
      PSendForm:=ASendForm; 
    end; procedure Tfrmc.btnRyxmClick(Sender: TObject);  
    begin
     TfrmB(PSendForm).Show;
     TfrmB(PSendForm).Edit1.Text:='He';
     TfrmB(PSendForm).FypxmId:=98;
     ......
    end;
    procedure TfrmB.btnRyxmClick(Sender: TObject);  
    begin  
      with TfrmC.Create(Self,@frmB) do  
      try  
        ShowModal;  
      finally  
        Free;  
      end;  
    end; 
      

  4.   

    既然formC以模式窗口打开,你就可以在formC里定义几个public属性,在窗口关闭的时候进行赋值fromC:private
      FID:string;
    public
      property ID:string read FID write FID;fromB:
    procedure TfrmB.btnRyxmClick(Sender: TObject);
    begin
      with TfrmC.Create(Self,1) do
      try
        ShowModal;
        showmessage( ID );
      finally
        Free;
      end;
    end;