【问题标题】:Delphi Enums in Different Units不同单位的 Delphi 枚举
【发布时间】:2017-01-17 10:14:32
【问题描述】:

所以我正在使用 Delphi 使用 SOAP 服务,但很难设置枚举的值。下面是枚举声明:

Extension = (pdf, xls, txt, xlsx, docx, doc, xml, png, jpg, gif);

这在您导入 WSDL 后在 Delphi 导入的单元中声明。 现在我的应用正在使用这个单元,我尝试了以下选项,但无济于事。

选项 1:(不编译。未声明的标识符:'pdf')

uses SOAPAPI_Unit
type
   Extension = SOAPAPI_Unit.Extension;
....
procedure TForm1.Button2Click(Sender: TObject);
var
   Ext : Extension;
begin
   Document.Extension := pdf;
end;

选项 2:(编译,但我收到服务器错误提示未设置对象引用)

uses SOAPAPI_Unit

....
procedure TForm1.Button2Click(Sender: TObject);
var
   Ext : SOAPAPI_Unit.Extension;
begin
   Document.Extension := Ext(0);
end;

选项 3(在主 .pas 文件中重新声明 Enum,但随后我得到不兼容的类型:'SOAPAPI_Unit.Extension' 和 'formMain.Extension')

uses SOAPAPI_Unit
type
   Extension = (pdf, xls, txt, xlsx, docx, doc, xml, png, jpg, gif);
....
procedure TForm1.Button2Click(Sender: TObject);
var
   Ext : Extension;
begin
   Document.Extension := pdf;
end;

选项 4(编译,但从服务器获取对象引用未设置错误)

uses SOAPAPI_Unit
....
procedure TForm1.Button2Click(Sender: TObject);
var
   Ext : Extension;
begin
   Document.Extension := Ext.pdf;
end;

【问题讨论】:

  • 我们可以看看minimal reproducible example
  • 文档建议使用不太可能与其他标识符冲突的枚举常量名称。如果标识符在同一范围内用于其他目的,则会发生命名冲突。还要为枚举类型使用更独特的名称。
  • 我也很难相信你写的东西。我有点怀疑选项 2 和 4 是否按原样编译。如果我不得不猜测,我会想象枚举被声明为作用域枚举,并且您只需要使用该单元并引用完全作用域的值。 Document.Extension := Extension.pdfExtension 与其他内容发生冲突,然后是 `Document.Extension := SOAPAPI_Unit.Extension.pdf。尝试重新声明该类型永远不会奏效。你肯定明白为什么会这样。不要猜测。试着去理解。

标签: delphi enums


【解决方案1】:

默认情况下,WSDL-Importer 生成的代码具有活动范围的枚举。这要求任何枚举前面都有其类型。在不知道实际导入文件的情况下,我想这应该可以工作:

uses SOAPAPI_Unit
....
procedure TForm1.Button2Click(Sender: TObject);
begin
   Document.Extension := Extension.pdf;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多