奇怪的问题!?!??!如果在窗体上放上一个TXMLDocument控件的话,调用Button4Click,在FreeAndNil(m_RC)代码发生一个AV异常,其他两个按钮的相同事件不会发生异常(???);如果不放TXMLDocoment控件的话就不会出现异常;不知道原因所在,请各位大虾出手相助!以下是Unit的全部代码。
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, xmldom, XMLIntf, StdCtrls, oxmldom, XMLDoc,
  msxmldom;type
  IFirstLay = interface
    ['{57B90895-4969-4AD5-B1BB-FAB4BD3FC0EB}']
    function GetYourName : string;
  end;type
  ISecondLay = interface
    ['{6FB655A3-4805-402A-87C4-F9BD6BADAF05}']
    function GetMyName : string;
  end;type
  IThirdLay = interface
    ['{6FB655A3-4805-402A-87C4-F9BD6BADAF05}']
    function GetOtherName : string;
  end;type
  TRealClass = class(TComponent,ISecondLay,IThirdLay,IFirstLay)
  public
    function GetOtherName : string;
    function GetYourName :string;
    function GetMyName : string;
  end;type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    XMLDocument1: TXMLDocument; //问题出现行
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
{ TRealClass }function TRealClass.GetMyName: string;
begin
  Result := 'AAA';
end;function TRealClass.GetOtherName: string;
begin
  Result := 'CCC';
end;function TRealClass.GetYourName: string;
begin
  Result := 'BBB';
end;procedure TForm1.Button3Click(Sender: TObject);
var
  m_First : IThirdLay;
  m_RC    : TRealClass;
begin
  m_RC    := TRealClass.Create(nil);
  m_First := IThirdLay(m_RC);
  ShowMessage(m_First.GetOtherName);
  FreeAndNil(m_RC);
end;procedure TForm1.Button4Click(Sender: TObject);
var
  m_First : ISecondLay;
  m_RC    : TRealClass;
begin
  m_RC    := TRealClass.Create(nil);
  m_First := ISecondLay(m_RC);
  ShowMessage(m_First.GetMyName);
  FreeAndNil(m_RC);
end;procedure TForm1.Button5Click(Sender: TObject);
var
  m_First : IFirstLay;
  m_RC    : TRealClass;
begin
  m_RC    := TRealClass.Create(nil);
  m_First := IFirstLay(m_RC);
  ShowMessage(m_First.GetYourName);
  FreeAndNil(m_RC);end;end.

解决方案 »

  1.   

    代码比较简单,就是自己定义了三个Interface,然后通过定义一个继承类来实现这三个接口的方法,然后定义了三个按钮来调用三个接口的实现;现在问题是: 如果在窗体上不放TXMLDocument控件的话,调用三个按钮下的方法都不会出错;但如果在窗体上添加了TXMLDocument控件的话,调用  TRealClass = class(TComponent,ISecondLay{调用其的实现就在释放的时候就会发送一个异常},IThirdLay,IFirstLay) ,不知道原因所在,请各位dx出手!