type
  Troomstatus = record
    wCode: Word;
    bType: byte;
    bStatus: byte;
  end;  Troominfo = record
    RoomCount: Word;
    RoomInfoSize: byte;
    aRoom: array of Troomstatus;//设置成静态数组的话转换没有问题
  end;
end;
var
vv:variant;
function RecordToVariant(roomInfo: Troominfo): OleVariant;
var
  P: Pointer;
  iByteCount: Word;
begin
  iByteCount := SizeOf(roomInfo.RoomCount) + SizeOf(roomInfo.RoomInfoSize) + roomInfo.RoomCount * roomInfo.RoomInfoSize;
  Result := VarArrayCreate([0, iByteCount - 1], varByte);
  P := VarArrayLock(Result);
  Move(roomInfo, P^, iByteCount);
  VarArrayUnlock(Result);
end;function VariantToRecord(value: olevariant): Troominfo;
var
  P: Pointer;
  iByteCount: word;
  RoomCount: byte; 
  RoomInfoSize: byte;
  i: Word;
  aa: array of char;
begin
  P := VarArrayLock(value);
{  Move(P^, result, sizeof(result.RoomCount) + sizeof(result.RoomInfoSize));
  RoomCount := result.RoomCount;
  RoomInfoSize := result.RoomInfoSize;
  iByteCount := SizeOf(result.RoomCount) + SizeOf(result.RoomInfoSize) + result.RoomCount * result.RoomInfoSize;
  //SetLength(result.aRoom, RoomCount);}
  Move(P^, result, iByteCount);
  VarArrayUnlock(value);
end;
我的函数静态数组的转换没有问题,
请问如何实现变体类型到记录类型的转换?

解决方案 »

  1.   

    什么时候,还用变体,用XML多好啊,
    这是例子,XMLDocument有很多方法的,仔细看看
    var   root,   fileXN,   xn,   cdataNode:   IXMLNode;   
      begin   
         XMLDocument := CreateOLEObject('MSXML2.DOMDocument');
          root   :=   XMLDocument.AddChild('root');   
          fileXN   :=   root.AddChild('file');   
          cdataNode   :=   XMLDocument.CreateNode('content',   ntCData);   
          xn   :=   fileXN.AddChild('content');   
          cdataNode.NodeValue   :=   'sjfsjadfjsdjfasdjfsiewuorwqiu<>><><><';   
          xn.DOMNode.appendChild(cdataNode.DOMNode);   
      end;   
      全部使用delphi自带的控件,不需要再定义系统组件