0

Delphi 2005 を使用して、(TForm を使用して) テスト アプリを作成し、SOAP API をテストしました。残念ながら、この API は、Delphi によって予約されているいくつかの列挙型 (アプリケーション、システム、およびターミナル) を宣言しています。SOAP ファイル (_Application、_Terminal、および _System) の列挙型の名前を変更し、OnBeforeExecute および OnAfterExecute メソッドを記述して、これらの名前が変更された列挙型を送信前と送信後に元の名前に置き換えることができました。

現在、これをより大きなプロジェクトに組み込もうとしており、この SOAP API のすべてのコードをクラス ファイル (フォームなし) に取り込みたいと考えています。テスター アプリを使用して、(ツール パレットから) THTTPRIO オブジェクトをフォームに追加し、オブジェクト インスペクターで OnBeforeExecute メソッドと OnAfterExecute メソッドを簡単に設定できました。クラス (TComponent) を使用すると、フォームで行ったようにツール パレットを使用して THTTPRIO オブジェクトを追加できません。コードを使用して THTTPRIO オブジェクトを作成しようとしましたが、エラーが発生します。

エラーが発生E2009 incompatible types: 'Parameter lists differ'し ますFEPS_HTTPRIO.OnAfterExecute := HTTPRIOAfterExecute;(以下のコードを参照)

これでエラーが発生するのにエラーが発生するのはなぜ FEPS_HTTPRIO.OnBeforeExecute := HTTPRIOBeforeExecute;ですか?また、クラス内にこれら 2 つのメソッドを実装するにはどうすればよいですか?

コードで THTTPRIO を作成する方法は次のとおりです。

unit c_MoSh;

interface

uses classes, forms, Windows, SysUtils, c_MoShAPI, InvokeRegistry, controls;

Type

  TMoSh = class(TComponent)
  private
    ...
    procedure HTTPRIOBeforeExecute(const MethodName: string;
                                    var SOAPRequest: WideString);
    procedure HTTPRIOAfterExecute(const MethodName: string;
                                    var SOAPResponse: TStream);

  ...

constructor TMoSh.Create();
begin
  FEPS_HTTPRIO := THTTPRIO.Create(self);
  FEPS_HTTPRIO.OnBeforeExecute := HTTPRIOBeforeExecute;
  FEPS_HTTPRIO.OnAfterExecute := HTTPRIOAfterExecute;       <-- Error line

end;

procedure TMosquitoShield.HTTPRIOBeforeExecute(const MethodName: string;
                                    var SOAPRequest: WideString);
var
  tmpString: TStringList;
begin

  try

    SOAPRequest := StringReplace(SOAPRequest,'<ReversalType>_Application','<ReversalType>Application',[RfReplaceAll]);
    SOAPRequest := StringReplace(SOAPRequest,'<ReversalType>_System','<ReversalType>System',[RfReplaceAll]);
    SOAPRequest := StringReplace(SOAPRequest,'<CardholderPresentCode>NotPresent2','<CardholderPresentCode>NotPresent',[RfReplaceAll]);
    SOAPRequest := StringReplace(SOAPRequest,'<DeviceInputCode>NotUsed3','<DeviceInputCode>NotUsed',[RfReplaceAll]);

  except
    on ER : ERemotableException do
      ShowMessage(ER.ClassName + ' error raised, with message : ' + ER.FaultDetail + ' :: '
                    + ER.Message);

    on E : Exception do
      ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message);
  end;

end;

procedure TMosquitoShield.HTTPRIOAfterExecute(const MethodName: string;
                                    var SOAPResponse: TStream);
var
  tmpString: TStringList;
begin

  try
    tmpString := TStringList.Create;
    SOAPResponse.Position := 0;
    tmpString.LoadFromStream(SOAPResponse);

    tmpString.Text := StringReplace(tmpString.Text,'Application','_Application',[RfReplaceAll]);
    tmpString.Text := StringReplace(tmpString.Text,'System','_System',[RfReplaceAll]);
    tmpString.Text := StringReplace(tmpString.Text,'<PASSUpdaterOption>Null','<PASSUpdaterOption>Null2',[RfReplaceAll]);
    tmpString.Text := StringReplace(tmpString.Text,'<TransactionSetupMethod>Null','<TransactionSetupMethod>Null3',[RfReplaceAll]);
    tmpString.Text := StringReplace(tmpString.Text,'<Device>Null','<Device>Null4',[RfReplaceAll]);
    tmpString.Text := StringReplace(tmpString.Text,'<ConsentCode>NotUsed','<ConsentCode>NotUsed2',[RfReplaceAll]);
    tmpString.Text := StringReplace(tmpString.Text,'<DeviceInputCode>NotUsed','<DeviceInputCode>NotUsed3',[RfReplaceAll]);

    SOAPResponse.Position := 0;
    tmpString.SaveToStream(SOAPResponse);

  except
    on ER : ERemotableException do
      ShowMessage(ER.ClassName + ' error raised, with message : ' + ER.FaultDetail + ' :: '
                    + ER.Message);

    on E : Exception do
      ShowMessage(E.ClassName + ' error raised, with message : ' + E.Message);
  end;

end;
4

1 に答える 1

4

メソッドのシグネチャは、イベント タイプのシグネチャと正確に一致する必要があります。メソッドのパラメーターのvar前を削除します。SOAPResponseHTTPRIOAfterExecute

説明する名前の競合については、コード要素(列挙メンバー、変数、型など)にユニット名をプレフィックスとして付けることで回避できます。SOAP_API.Application-SOAP列挙の場合、およびForms.ApplicationDelphiApplicationグローバルの場合。

于 2013-04-24T13:43:34.347 に答える