如此错误提示?

tombaby 2002-11-25 09:17:03
单步调试程序,出现如下错误提示:
'variant does not reference an automation object'
什么意思?是哪里出错了?请哪位大侠指点一二!
...全文
75 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
befree 2002-11-27
  • 打赏
  • 举报
回复
delphi的internetexpress里面有tXMLBroker和tInetXPageProducer
internet 里面有tXMLDocument
为什么还要重新加载ole库
microsoft xml里面也没有IXMLElement;
tombaby 2002-11-27
  • 打赏
  • 举报
回复
to befree:
在DELHI5.0里面想把一个xml文件里的记录放到二维表里,只是一层的程序不用web application,而且xml的文档元素是自己定义的.此种情况下txmlbroker怎么用.
befree 2002-11-26
  • 打赏
  • 举报
回复
提供者的错误
tombaby 2002-11-26
  • 打赏
  • 举报
回复
to befree:
如果你用的系统是WIN2K的话,到DELPHI中在PROJECT菜单选中IMPORT TYPE LIBRARY,然后会出来一堆列表找到MICROSOFT XML的合适版本选个合适的输出目录确定即可然后在工程中可以把导出的TLB文件加进来.
befree 2002-11-26
  • 打赏
  • 举报
回复
没有你的MSXML2_TLB库
befree 2002-11-26
  • 打赏
  • 举报
回复
delphi封装的对象是automation object
如果是对象接口返回错误,可能delphi并不知道原始错误码
转换时就会发生这样类似错误
我看看你的代码再说
tombaby 2002-11-26
  • 打赏
  • 举报
回复
to:befree
"提供者的错误"?????我不能明白你的意思,能不能讲清楚一点.先谢过.
tombaby 2002-11-25
  • 打赏
  • 举报
回复
试写的源码如下(不完整):
unit XMLDOC;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ADOdb,DB,MSXML2_TLB;


type
TDBType=(dbOracle,dbSQLServer,dbDBaseIII,dbAccess2k,dbTxtfile);
TActive=(true,false);


TXMLDOC = class(TComponent)
private
{ Private declarations }
//----------private data fields-----------------

FXMLrootelement:IXMLElement2;
//FXMLinterface:IXMLDocument2;
FXMLfile:string;
FXMLfilepath:string;
FXMLDocument: IXMLDocument2;
FDBtype: TDBType;
FXMLfilesize: string;
FIXMLDocument: IXMLDocument2;
FXMLcollumns: integer;
FActive: TActive;
FXMLrows: integer;

//------------property methode------------------
procedure setxmldocument(const Value: IXMLDocument2);
procedure setxmlfile(const Value: string);
procedure setxmlrootelement(const Value: IXMLElement2);
procedure setdbtype(const Value: TDBType);
procedure setactive(const Value: TActive);
function mapfieldtype(str:string):TFieldtype;
procedure setxmlfilepath(const Value: string);
protected
{ Protected declarations }
public
{ Public declarations }
FXMLdataset:TADODataset;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure loadxmlfile(filename:string);
procedure inidataset;

published
{ Published declarations }
//-------------------property-------------------
property xmldocument: IXMLDocument2 read FIXMLDocument write setxmldocument;
property xmlrootelement: IXMLElement2 read FXMLrootelement write setxmlrootelement;
property xmlfile: string read FXMLfile write setxmlfile;
property xmlfilepath: string read FXMLfilepath write setxmlfilepath;
property dbtype: TDBtype read FDBtype write setdbtype;
property xmlfilesize:string read FXMLfilesize;
property xmlcollumns:integer read FXMLcollumns;
property xmlrows:integer read FXMLrows;
property active:TActive read FActive write setactive;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [TXMLDOC]);
end;

{ TXMLDOC }

constructor TXMLDOC.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
//----add your code here ------
FXMLdataset:=TADODataset.Create(self);
FXMLdataset.Close;
FXMLdocument:=CoXMLDocument.Create;



end;

destructor TXMLDOC.Destroy;
begin
//---- add your code here ------
with FXMLdataset do
begin
Close;
Free;
end;

FXMLdocument:=nil;

inherited;
end;

procedure TXMLDOC.inidataset;
var
fieldname:string;
fieldtype:TFieldtype;
fieldwidth:integer;
required:boolean;
temp:string;
tempface:array of IXMLElement2;
tmpface:IXMLElement2;
i,j:integer;
begin
setlength(tempface,FXMLcollumns);
for i:=0 to FXMLcollumns-1 do
begin
tempface[i]:=(FXMLrootelement.children.item(i,NULL)) as IXMLElement2;
fieldname:=tempface[i].getAttribute('name').asstring;
required:=tempface[i].getAttribute('required').asboolean;
fieldwidth:=tempface[i].getAttribute('width').asinteger;
temp:=tempface[i].getAttribute('datatype').asstring;
fieldtype:=mapfieldtype(temp);
FXMLdataset.FieldDefs.Add(fieldname,fieldtype,fieldwidth, required);
end;

for j:=0 to FXMLrows-1 do
begin
for i:=0 to FXMLcollumns-1 do
begin
tmpface:=(tempface[i].children.item(j,NULL)) as IXMLElement2;
FXMLdataset.append;
FXMLdataset.fields[i].value:=tmpface.getAttribute('value');
end;
end;

end;

procedure TXMLDOC.loadxmlfile(filename: string);
var
tmpface:IXMLElement2;
str:widestring;
begin
FXMLfile:=filename;
FXMLdocument.Set_url(filename);
FXMLdocument.Get_root(FXMLrootelement);
FDBtype:=FXMLrootelement.getAttribute('dbtype').asstring;
FXMLdocument.Get_fileSize(str);
FXMLfilesize:=widechartostring(pwidechar(str));
FXMLcollumns:=FXMLrootelement.children.Get_length;
tmpface:=(FXMLrootelement.children.item(0,NULL)) as IXMLElement2;
FXMLrows:=tmpface.children.Get_length;

end;

function TXMLDOC.mapfieldtype(str: string): TFieldtype;
begin
if uppercase(trim(str))='FTUNKNOWN' then
result:=ftUnknown
else if uppercase(trim(str))='FTSTRING' then
result:=ftString
else if uppercase(trim(str))='FTSMALLINT' then
result:=ftSmallint
else if uppercase(trim(str))='FTINTEGER' then
result:=ftInteger
else if uppercase(trim(str))='FTWORD' then
result:=ftWord
else if uppercase(trim(str))='FTBOOLEAN' then
result:=ftBoolean
else if uppercase(trim(str))='FTFLOAT' then
result:=ftFloat
else if uppercase(trim(str))='FTCURRENCY' then
result:=ftCurrency
else if uppercase(trim(str))='FTBCD' then
result:=ftBCD
else if uppercase(trim(str))='FTDATE' then
result:=ftDate
else if uppercase(trim(str))='FTTIME' then
result:=ftTime
else if uppercase(trim(str))='FTDATETIME' then
result:=ftDateTime
else if uppercase(trim(str))='FTBYTES' then
result:=ftBytes
else if uppercase(trim(str))='FTVARBYTES' then
result:=ftVarBytes
else if uppercase(trim(str))='FTAUTOINC' then
result:=ftAutoInc
else if uppercase(trim(str))='FTBLOB' then
result:=ftBlob
else if uppercase(trim(str))='FTMEMO' then
result:=ftMemo
else if uppercase(trim(str))='FTGRAPHIC' then
result:=ftGraphic
else if uppercase(trim(str))='FTFMTMEMO' then
result:=ftFmtMemo
else if uppercase(trim(str))='FTPARADOXOLE' then
result:=ftParadoxOle
else if uppercase(trim(str))='FTDBASEOLE' then
result:=ftDBaseOle
else if uppercase(trim(str))='FTTYPEDBINARY' then
result:=ftTypedBinary
else if uppercase(trim(str))='FTCURSOR' then
result:=ftCursor
else if uppercase(trim(str))='FTFIXEDCHAR' then
result:=ftFixedChar
else if uppercase(trim(str))='FTWIDESTRING' then
result:=ftWideString
else if uppercase(trim(str))='FTLARGEINT' then
result:=ftLargeint
else if uppercase(trim(str))='FTADT' then
result:=ftADT
else if uppercase(trim(str))='FTARRAY' then
result:=ftArray
else if uppercase(trim(str))='FTREFERENCE' then
result:=ftReference
else if uppercase(trim(str))='FTDATASET' then
result:=ftDataSet
else if uppercase(trim(str))='FTORABLOB' then
result:=ftOraBlob
else if uppercase(trim(str))='FTORACLOB' then
result:=ftOraClob
else if uppercase(trim(str))='FTVARIANT' then
result:=ftVariant
else if uppercase(trim(str))='FTINTERFACE' then
result:=ftInterface
else if uppercase(trim(str))='FTIDISPATCH' then
result:=ftIDispatch
else if uppercase(trim(str))='FTGUID' then
result:=ftGuid
else
result:=ftString;

end;

procedure TXMLDOC.setactive(const Value: TActive);
begin
FActive := Value;
end;

procedure TXMLDOC.setdbtype(const Value: TDBtype);
begin
FDBtype := Value;
end;

procedure TXMLDOC.setxmldocument(const Value: IXMLDocument2);
begin
FIXMLDocument := Value;
end;

procedure TXMLDOC.setxmlfile(const Value: string);
begin
FXMLfile := Value;
end;

procedure TXMLDOC.setxmlfilepath(const Value: string);
begin
FXMLfilepath := Value;
end;

procedure TXMLDOC.setxmlrootelement(const Value: IXMLElement2);
begin
FXMLrootelement := Value;
end;



end.
stanely 2002-11-25
  • 打赏
  • 举报
回复
看了你这些,我的头脑已经混沌了。。。

UP!!
tombaby 2002-11-25
  • 打赏
  • 举报
回复
TO:STANELY
我自己写了一个测试用的VCL控件,VCL里面包含了一个TADODATASET类型的公有变里还有一个MSXML2的接口其中有IXMLDOCUMENT2,IXMLELEMENT2接口类型和其它一些属性都是STRING类型一个公有的方法LOADXMLFILE(STR:STRING)接收一个文件路径生成IXMLDOCUMENT和IXMLELEMENT2.结果程序运行到LOADXMLFILE时报以上错误.
stanely 2002-11-25
  • 打赏
  • 举报
回复
"变量不能引用一个自动对象"

那条语句是啥?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧