各位高手,请帮忙看一下如下代码,有些问题搞不定,希望大家帮一下:type
 TBaseFrame=class of TFrameBase;
......private
   fm:TframeBase;
   function Execute(f:TFrameBase;FFrameType:TBFrame;AOwner:TComponent;Readonly:Boolean):boolean;
end;function TForm2.Execute(f:TFrameBase;FFrameType:TBFrame;AOwner:TComponent;Readonly:Boolean):boolean;
var
 p:TcxTabSheet;
begin
    if   not Assigned(f ) then
    begin      P:=CreatePage; //建立页
      try
        f:=FFrameType .Create(AOwner,readonly); //建立FRAME
        f .parent:=p;
        result:=true;
  
      except
           freeandnil(f );
           FreeAndNil(p);
           Exit(False);
      end;    end ;    ActivePage(f); //显示FRAMEend;procedure Tform2.loadFM(readonly:Boolean);
begin
 if    Execute(FM,TframeBase,self,readonly)  then
      fm.abc='adfas';end;我想动因建立类型为TFrameBase的FRAME ,这个FRAME是继承TFRAME的,然后建立之后使用它。为何在执行 Execute(FM,TframeBase,self,readonly) ;这一个语句后,再执行fm.abc='adfas'时FM还为空?
如果在function Execute(f:TFrameBase;FFrameType:TBFrame;AOwner:TComponent;Readonly:Boolean):boolean;这里改为
function Execute(var f:TFrameBase;FFrameType:TBFrame;AOwner:TComponent;Readonly:Boolean):boolean;编译时出现
[DCC Error] uWorktime.pas(690): E2250 There is no overloaded version of 'Execute' that can be called with these arguments这个错误,不知各位大侠有什么好建议。

解决方案 »

  1.   

    聲明部分改為var,實現部分也要改為var,這樣編譯就不會出錯了
      

  2.   

    这个没有用的,还是一样的错误。其实fm是已经建立好的FRAME,可能还有fm1,fm2等等但这里没有写。
      

  3.   

    改成如下的,编译还是通不过的。还是有:There is no overloaded version of 'Execute' that can be called with these arguments的错误.
    function Execute(var f:TFrameBase;FFrameType:TBaseFrame;AOwner:TComponent;Readonly:Boolean):boolean;function TForm2.Execute(var f:TFrameBase;FFrameType:TBaseFrame;AOwner:TComponent;Readonly:Boolean):boolean;
    var
    p:TcxTabSheet;
    begin
    if not Assigned(f ) then
    beginP:=CreatePage; //建立页
    try
    f:=FFrameType .Create(AOwner,readonly); //建立FRAME
    f .parent:=p;
    result:=true;except
    freeandnil(f );
    FreeAndNil(p);
    Exit(False);
    end;end ;ActivePage(f); //显示FRAMEend;
      

  4.   

    從錯訊看,錯誤是出在調用excute時出的,檢查你FM是怎么來的...
      

  5.   

    FM是继承一个TBASEFrame类,TBaseFrame是继承TFrame类的。不过如果不通过以上的方法放在一个过程里建立Frame而直接在调用模块中建立和打开是没有任何问题的。只是想有一个过程专门做建立就完事了,否则每个FRAME都的敲建立的过程。
    procedure Tform2.loadFM(readonly:Boolean);
    var
    p:TcxTabSheet;
    begin
    if not Assigned(FM ) then
    beginP:=CreatePage; //建立页
    try
    fM:= TframeBase.Create(self,readonly); //建立FRAME
    f .parent:=p;
    result:=true;except
    freeandnil(fM );
    FreeAndNil(p);
    Exit(False);
    end;end ;ActivePage(fM); //显示FRAME
    end;
      

  6.   

    這么說吧,你的FM無法滿足作為Execute中var 參數的條件,所以編譯出錯。
    可能是因為你的FM是一個屬性,而不是變量...
      

  7.   

    改了一下,将返回值改为Tcomponent最后RESULT:=F,调用时改为
    FM:=Tframebase(Execute(FM,TframeBase,self,readonly))
    就OK了