主窗体frmCrmi中创建子窗体:
 if not Assigned(frmCrmi_1) then
  begin
    frmCrmi_1 := TfrmCrmi_1.Create(self);
  end;
  frmCrmi_1.ShowModal;
在子窗体中:
FOwner: TComponent;
constructor TfrmCrmi_1.Create(AOwner: TComponent);
begin
  inherited;
  FOwner := AOwner;//这个FOwner应该就是主窗体对吗?
end;在子窗体中调用主窗体的方法:
TfrmCrmi(Fowner).serch();//这里可以frmCrmi.serch();吗?有点拎不清

解决方案 »

  1.   

    只要serch()是主窗体公开的方法,子窗体可以调用的
      

  2.   

    我继续深入一下:我的主窗体是继承一个父类来的,父类中定义了一个Property JInstanceID,在创建主窗体的时候,会对JInstanceID赋值。因为serch()方法有前后台的交互,会引用JInstanceID,我在用frmCrmi.serch();时在JInstanceID处就出现内存错误,但是用TfrmCrmi(Fowner).serch();却是正常的,这里是什么情况?
      

  3.   

    frmCrmi.serch();时在JInstanceID处就出现内存错误你设置断点,在这句的时候看看,frmCrmi是不是=nil?
      

  4.   

    可能我说的不清楚,能够进入serch方法内,这时主窗体应该不是nil
      

  5.   

    给一下我的完整代码,我的编译器是2007,然后是DLL工程://主窗体初始化
    procedure TfrmCrmi.Initialize;
    begin
      inherited;
      CreateInstance('Crmi');
    end;
    //基类
    function TfrmChildBase.CreateInstance(ClassName: String): Integer;
    begin
      JInstanceID:=0;
      ....
    end;
    //主窗体的serch方法
    function TfrmCrmi.serch(TS1: String): Boolean;
    Var
      Protocol : TBzProtocol;
      Index : Integer;
      sResult : String;
    begin
      inherited;
      Result := False;
      Protocol := TBzProtocol.Create;
      try
        Protocol.ClearAll;
        Index:=Protocol.AddParam;
        sResult := Invoke(JInstanceID,'serch',Protocol.text);
        Protocol.GetResultContext(sResult);
        if Protocol.ResultStatus >= 0 then
        begin
          Result := true;
        end
        else
        begin
          ShowInfoTxt(DM_ERROR,Protocol.ResultErrorInfo);
        end;
      finally
        FreeAndNil(Protocol);
      end;
    end;
    //子窗体的创建(子窗体继承另外一个父类)
    if not Assigned(frmCrmi_1) then
    begin
      frmCrmi_1 := TfrmCrmi_1.Create(self);
    end;
    frmCrmi_1.ShowModal;
    //子窗体
    private
         FOwner: TComponent;
    public
        constructor Create(AOwner: TComponent); override;
    constructor TfrmCrmi_1.Create(AOwner: TComponent);
    begin
      inherited;
      FOwner := AOwner;
    end;
    //子窗体的调用主窗体的方法
    procedure TfrmCrmi_1.btnFlatSpeedButton1Click(Sender: TObject);
    begin
    //这里如果用frmCrmi.serch(ts1);就会报错,我跟踪了一下,在主窗体的JInstanceID出错
      if TfrmCrmi(Fowner).serch(TCrmi020DM(DM1).mtblTs.FieldByName('TS1').AsString) then
      Close
      else
      begin
       MessageBox('提示:','查询失败!',DM_INFO);
       Exit;
      end;
    end;
      

  6.   

    父类的变量/方法写在Public下面
      

  7.   

    我其实就像问下:frmCrmi.serch();和TfrmCrmi(Fowner).serch();在子窗体中是相同的意思吗?他们之间没有任何区别?