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 回答