0

ソープ呼び出しの配列を初期化または作成しようとしています:

Array_Of_ProductIdentifierClinicalType = array of ProductIdentifierClinicalType;

これは私がそれを初期化しようとしている方法です:

Product[0].IdentifierType := Array_Of_ProductIdentifierClinicalType.Create();

アプリケーションを実行すると、次のエラーが表示されます: Access Violation at address...

ここに画像の説明を入力

問題は次のとおりです。このソープ コールを初期化する方法は??

ありがとうございました!!!! WSDL インポートを実行できます: http://axelcarreras.dyndns.biz:3434/WSAlchemy.wsdl

procedure TFrmMain.Button16Click(Sender: TObject);
Var
  ExcludeExpiradas: String;
  Serv: AlchemyServiceSoap;
  req: AlchemyClinical;
  element: AlchemyClinicalRequest;
  Prescribed: PrescribedType;
  //Prescribing: Prescribing
  Prescribing: PrescribedType;
  alc: AlchemyIdentifierType;
  D: TXSDate;
  Counter: Integer;
  ProductStr: AlchemyIdentifierClinicalType;


begin

  With DM do
  begin
    ExcludeExpiradas := ' and (' + chr(39) +  DateToStr(Date) + chr(39) + ' < (FECHARECETA + 180)) ';
    CDSRx_Procesadas.Close;
    CDSRx_Procesadas.CommandText := 'SELECT * ' +
    ' FROM RX_PROCESADAS WHERE ' +
    ' (NUMERORECETA IS NOT NULL AND CANTIDAD_DISPONIBLE > 0)' +
     ExcludeExpiradas +
    ' and NumeroCliente = ' + CDSPacientesNumeroCliente.asString +
    ' Order by NumeroReceta';
    //ShowMessage(CDSRx_Procesadas.CommandText);
    CDSRx_Procesadas.Open;

    ProductStr := AlchemyIdentifierClinicalType.Create;
    With ProductStr do
    begin
      Identifier := 1;
    end;

    element := AlchemyClinicalRequest.Create;
    //Prescribed := PrescribedType.Create;
    With element do
    begin
      With Prescribed do
      begin
        Counter := 0;
        while not CDSRx_Procesadas.eof do
        begin
          Product := Array_Of_ProductIdentifierClinicalType.Create();
          With Product[0] do
          begin
            IdentifierType := ProductIdentifierTypeEnum.NDC9;
            Identifier := Copy(DM.CDSInventarioNDC.Value, 1, 9);
          end;
          Counter := Counter + 1;
          CDSRx_Procesadas.Next;
        end;
      end;
      With Prescribing do
      begin
        Counter := 0;
        Product[0].IdentifierType := ProductIdentifierTypeEnum.AlchemyProductID;
        Product[0].Identifier := Copy(DM.CDSInventarioNDC.Value, 1, 9);
        Counter := Counter + 1;
      end;
      With PatientDemographics do
      begin
        while not CDSAlergies.Eof do
        begin
          Allergy.AllergySubstanceClass[0].Identifier := CDSAlergiesNOALERGIA.Value;
          CDSAlergies.Next;
        end;
        if CDSPacientesSEXO.Value = 1 then
          Gender := GenderTypeEnum.Male
        else
          Gender := GenderTypeEnum.Female;

        D := TXSDate.Create;
        D.AsDate := CDSPacientesFECHANACIMIENTO.AsDateTime;
        DateOfBirth := D;
      end;
      With RequestedOperations do
      begin
        DrugToDrug := True;
        //DuplicateTherapy
        Allergy := True;

        With WarningLabels do
        begin
          Request := True;
          LanguageCode := 'en-US';
          MaxLines := 5;
          CharsPerLine := 24;
        end;
        With DoseScreening do
        begin
          Request := True;
        end;
        AdverseReactions.Request := True;
      end;
      IgnorePrescribed := False;
      IncludeConsumerNotes := True;
      IncludeProfessionalNotes := True;
    end;
  end;
end;*
4

1 に答える 1

2

質問のこのコード行が正確であると仮定すると、次のようになります。

Array_Of_ProductIdentifierClinicalType = array of ProductIdentifierClinicalType;

次に問題はここにあります:

Product := Array_Of_ProductIdentifierClinicalType.Create();

これは動的配列コンストラクターです。コンストラクターへのパラメーターの数に等しい長さの動的配列を作成します。次に、配列の各要素を、渡されたパラメーターに順番に割り当てます。

を使用した例を考えてみましょうTBytes = array of Byte

Bytes := TBytes.Create(1, 2, 3);

これBytesは、長さが3で、値が1、2、および3の配列になるように初期化されます。

それでは、コードをもう一度見てみましょう。これは初期化Productされて長さ0の配列になります。したがって、これにアクセスProduct[0]すると、配列のインデックスが範囲外であるため、ランタイムエラーが発生します。

この問題を解決するには、配列が十分な要素を持つように初期化されていることを確認する必要があります。1つのオプションは、確かに動的配列コンストラクターを使用することです。もう1つはを使用することSetLengthです。Delphiの動的配列についてのあなたの理解は不十分だと思います。ドキュメントを参照することをお勧めします。

于 2012-12-17T21:39:16.303 に答える