如何将Delphi OleVariant内容转储到文件中?

我有一个多层应用程序,这些应用程序使用OleVariant变量通过自定义通信框架跨线发送和接收数据。通常,此OleVariant变量的内容来自TClientdataset.Data(当然,它是OleVariant类型的)。我怀疑通信框架会更改此OleVariant变量的内容,因此我想在发送和接收数据之前转储该变量的内容。我使用代码:

TmpOrder: OleVariant;
Tmp: TStringList;

Tmp:=TStringList.Create;
try
  Tmp.LoadFromFile('D:\test.txt');
  Tmp.Add('---');
  Tmp.Add(TmpOrder);
  Tmp.SaveToFile('D:\test.txt');
finally
  Tmp.Free;
end;

但是文件的内容是没有意义的。例如,文件的以下内容可以表示TClientdataset.Data的内容:

---
??

当然,情况有所不同。

所以-如何捕获OleVariant变量的内容。

将TClientdataset保存为XML并不是我的选择,因为通信使用的是OleVariant而不是XML。

我正在使用Unciode Delphi(Delphi 2009及更高版本)。

jlx53727 回答:如何将Delphi OleVariant内容转储到文件中?

这里有一些代码将TClientDataSet.Data转换为字符串,并执行一个测试例程。

function VariantToString(V : OleVariant) : String;
  procedure VariantToStringInner(V : OleVariant; var AString : String);
  var
    IsArray : Boolean;
    DimCount : Integer;
    i : Integer;
  begin
    IsArray := VarIsArray(V);

    if not IsArray then begin
      //  Handle the case where V is not an array
      if (VarIsEmpty(V) or VarIsNull(V)) then begin
        AString := AString + ' ';
        exit;
      end
      else
        AString := AString + VarToStr(V);
    end
    else begin
      //  V is an array,so first we need to know how many dimensions it has
      DimCount := VarArrayDimCount(V);

      //  For TClientDataSet.Data the answer AFAIK should be 1
      //  so we'll process only dimension 1
      Assert(DimCount = 1);

      //  Recurse into this proc so that we handle the cases where V[i] is an array
      //  and where it isn't
      for i := VarArrayLowBound(V,1) to VarArrayHighBound(V,1) do begin
        VariantToStringInner(V[i],AString);
      end;
    end;
  end;

begin
  Result := '';
  VariantToStringInner(V,Result);
end;

procedure TForm1.TestVarToStr;
var
  V : OleVariant;
  S : String;
begin
  V := 'hello world';
  S := VariantToString(V) + #13#10;

  V := CDS1.Data;
  S := S + VariantToString(V);
  Memo1.Lines.Text := S;
end;

很显然,如果要将结果保存到文件中,只需调用Memo1.Lines.SaveToFile()

我得到的结果是

  

你好世界   15025224189100024000502000300020202736840100010783856684898069207308065117116111105110990468971161014060000067811710998101114401000004789710910110730001058773688472202020058697108117101107300010587736884722020200201067726578716995767971401300600010000000400020000000400020600400058512697389720600100011091000450

保存为XML的相同CDS数据如下:

<?xml version="1.0" standalone="yes"?>  
<DATAPACKET Version="2.0">
<METADATA>
  <FIELDS>
    <FIELD attrname="ID" fieldtype="i4" SUBTYPE="Autoinc"/><FIELD   attrname="Date" fieldtype="date"/>
    <FIELD attrname="Number" fieldtype="i4"/><FIELD attrname="Name" fieldtype="string" WIDTH="20"/><FIELD attrname="Value" fieldtype="string" WIDTH="20"/>
  </FIELDS>
  <PARAMS CHANGE_LOG="1 0 4 2 0 4" AUTOINCVALUE="3"/>
</METADATA>
<ROWDATA>
  <ROW RowState="4" ID="1" Name="Name1"/><ROW RowState="4" ID="2" Name="Name2" Value="AC"/>
</ROWDATA>
</DATAPACKET>
本文链接:https://www.f2er.com/3137696.html

大家都在问