求解:
说明:Tfrmbaseform = Class(Tform);(在A运行时包中)
TfrmBaseForm1 = Class(TfrmBaseForm);(在B运行时包中)主程序中:
   的主窗体中已经引用了A包中的TfrmBaseForm的单元.
下面是主程序的主界面中的一个按钮的OnClick代码:问题出在 myBase := frm As TfrmBaseForm;一句,请精通DELPHI的大大帮帮忙啊!
procedure TfrmMain.Button1Click(Sender: TObject);
VAR
   handlePack:THandle ;
   AClass: TPersistentClass; 
   ClassName:string;
   frm:TForm ; myBase:TfrmBaseForm ; //{TfrmBaseForm在一个运行时包A中}
begin
   handlePack := LoadPackage('Myform.bpl');//在MyForm包中有Tfrmbaseform1=Class(TfrmBaseForm)
   ClassName := 'Tfrmbaseform1';
   if handlePack > 0 then
   begin
      AClass := GetClass(ClassName);      if AClass=nil then exit;
      frm := TComponentClass(AClass).Create(Application) as TForm;      myBase := frm As TfrmBaseForm;//这句为什么要报错啊?Invalid class typecast,如果没有这句,下句的窗体可正常显示出来      myBase.ShowModal ;
   end;
end;

解决方案 »

  1.   

    TfrmBaseForm 的类型定义和运行包中的一致吗?
      

  2.   

    myBase := TfrmBaseForm(frm);
      

  3.   

    你代码相当于 frm := TfrmMain.Create as TForm
    frm 是 TfrmMain 的实例,你想把它 as 成 TfrmBaseForm 当然要报错了
      

  4.   

    TO: TfrmBaseForm 的类型定义和运行包中的一致吗?
    本来TfrmBaseForm就是只在同一个包中定义的,并没有第二份,只不过在主程序中引用和B包(即MyForm.bpl)中引用而已,因此不存在一不一致的问题TO:  myBase := TfrmBaseForm(frm);
    这种改法与之前的 myBase := frm as TfrmBaseForm只不过是写法不同而已,都是类型强制转换,没有效果,也是不行的TO:  你代码相当于 frm := TfrmMain.Create as TForm 
    frm 是 TfrmMain 的实例,你想把它 as 成 TfrmBaseForm 当然要报错了
    怎么会相当于frm := TfrmMain.create as TForm呢?下面我都讲了,如果没有 MyBase := frm As TfrmBaseForm这一句,frm.showmodal是可以显示出正常的结果的,因此你没有看清上面的代码的意思各位大大帮帮忙啊,俺已经在这个问题上耗了2天了
      

  5.   

     還有就是你 RegisterClass  是怎麼注冊的?? 應該就是二個包不對應,沒編譯,這些裏查原因吧
      

  6.   

    myBase没有初始化过吧?
    LZ添加一句myBase:=TfrmBaseForm.Create(nil);
    看看行不~
      

  7.   

    如果RegisterClass没有在包里注册,根本它就Create不出来,getClass就出错啦
      

  8.   

    楼主只理解了代码级类型定义的一致性,实际上Delphi当中还有一个运行期类型一致性,每个Class都会有一个基址,如果不是使用的共享包的话,第一个模块(不管是.exe还是.bpl或者.dll)都会各自为自己重新组件了一个运行期类型,从而导致在多个模块之间进行数据交换时程序员很容易将代码级类型相同的两个实例进行混用,而实际上进行类型转换时在不同模块之间进行运行期类型检查时就可能会导致失败。
      

  9.   

    包需要进行动态联编而已,把父类包列在REQUIRED列表中即可