2017-01-17 14 views
1

私はDelphiを使用してSOAPサービスを消費していますが、列挙型の値を設定するのは難しいです。以下はenum宣言です:異なる単位のDelphi列挙型

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ファイルに列挙したが、その後、私は互換性のないタイプを取得します:「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(コンパイルが、オブジェクトrefはサーバからエラーを設定しています)

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

は、我々が見ることができる[MCVE]ください –

+0

ドキュメントは、他の識別子と衝突しそうにない列挙定数名を使用することを推奨しています。識別子が同じスコープ内の別の目的で使用されると、名前の競合が発生します。また、列挙型に対してより一意の名前を使用します。 –

+4

私はまた、あなたが書いたことを信じることが難しいと感じます。私はオプション2と4が書かれたようにコンパイルするのはちょっと懐疑的だ。私が推測しなければならないのは、enumがスコープ付き列挙型として宣言されており、ユニットを使用して完全スコープの値を参照するだけでよいということです。 'Document.Extension:= Extension.pdf'または' Extension'が何か他のものと衝突すると 'Document.Extension:= SOAPAPI_Unit.Extension.pdf。型を再宣言しようとすると、決して動作しません。確かにそれはなぜそうであるか分かります。推測しないでください。理解しようとする。 –

答えて

5

WSDL-インポータは、アクティブスコープの列挙を使用してコードを生成します。これには、その型の前にenumが必要です。実際のインポートファイルを知らなくても、私は、これはその後、動作するはず推測:

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

ありがとうございます。これは以下の私のソリューションと同様に機能します。 – Stingray

関連する問題