0

Delphi 2006 で .net で動作するアルゴリズムを実装する必要があります

基本的に、次の手順を実行する必要があります。

  1. XML を作成し、XSD に対して検証する
  2. XML 文字列を UTF-8 でエンコードされたバイト配列にシリアル化し、zip で圧縮します
  3. 圧縮された情報は、base256 形式を使用してバイト配列に再度格納する必要があります
  4. このバイト配列から Datamatrix 2D BarCode を使用して画像を作成し、この画像をレポートに配置します

ステップ 1 では、問題なく動作する NativeXML ライブラリを使用して XML を作成します。このライブラリにはメソッド SaveToBinaryFile が存在しますが、正常に動作しません。私のテストでは、この関数を使用してバイナリ ファイルを作成しました。私のZipコンポーネントは、メモリからの文字列またはバイト配列を含まないファイルでのみ機能するため、バイナリファイルを使用することを余儀なくされました。

このバイナリ ファイルを Zip コンポーネントで圧縮し、この圧縮ファイルを BLOB ファイルに読み込みました。DataMatrix イメージを作成する必要がある時点で、この BLOB ファイルを ansistring にロードし、イメージを作成します。

多くのテストの結果、自分の XML をバイナリ ファイルに保存するときに問題があることがわかりました。ここで、xml (utf-8) 文字列をバイナリ ファイルに保存する別の方法を見つける必要があります。私の英語でごめんなさい。誰でも私を助けることができますか?

4

1 に答える 1

0
    procedure CreateXMLBarcodeș
    var
     BinarySize: Integer;
     InputString: utf8string;
     StringAsBytes: array of Byte;
     F : FIle of Byte;
     pTemp : Pointer;


    begin
     InputString := '';
     ADoc := TNativeXml.CreateName(rootName);
     try
       ... //create the XML
       InputString := ADoc.WriteToLocalString; //utf8string
       if InputString > '' then begin
          //serialize the XML string to array of bytes
          BinarySize := (Length(InputString) + 1) * SizeOf(Char);
          SetLength(StringAsBytes, BinarySize);
          Move(InputString[1], StringAsBytes[0], BinarySize);
          //save the array of bytes to file
          AssignFile( F, xmlFilename );
          Rewrite(F);
          try
           BinarySize := Length( StringAsBytes );
           pTemp := @StringAsBytes[0];
           BlockWrite(F, pTemp^, BinarySize );
          finally
           CloseFile( F );
          end;
       end;
       finally
        ADoc.Free;
       end;
     end

    ...
    //in other procedure:
         DataSet1XMLBarCode.LoadFromFile(CreateXMLBarcode);
    ...

    //when I want to create the report
    //create the DataMatrix image
    procedure xyz(Sender: TfrxReportComponent);
    var  AWidth, AHeight: Integer;
     function GetStringFromBlob: AnsiString;
     var BlobStream: TStream;
     begin
      Result := '';
      DataSet.Open;
      BlobStream := DataSet1.
                       CreateBlobStream(DataSet1XMLBarCode, bmRead);
      try
       SetLength(Result, BlobStream.Size);
       BlobStream.Position := 0;
       BlobStream.Read(Result[1], BlobStream.Size);
      finally
       BlobStream.Free;
      end;
      DataSet.Close;
     end;
    begin
     Barcode2D_DataMatrixEcc2001.Locked := True;
     Barcode2D_DataMatrixEcc2001.Barcode := GetStringFromBlob;
     Barcode2D_DataMatrixEcc2001.Module := 1;
     Barcode2D_DataMatrixEcc2001.DrawToSize(AWidth, AHeight);
     with TfrxPictureView(frxReport1.FindObject('Picture1')).Picture.Bitmap do
     begin
      Width := AWidth;
      Height := AHeight;
      Barcode2D_DataMatrixEcc2001.DrawTo(Canvas, 0, 0);
     end;
     Barcode2D_DataMatrixEcc2001.Locked := False;
    end;

    //the code was 'çopied'and adapted from the internet
于 2012-07-03T11:10:13.697 に答える