Announcement

Collapse
No announcement yet.

Dyn Array of Record to OleVariant

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dyn Array of Record to OleVariant

    Hallo,
    kann mir jemand sagen wie ich ein dynamisches Array eines Records in einen OleVariant kopiere?

  • #2
    Hallo,

    wie sieht das Gebilde an einem Beispiel aus

    Comment


    • #3
      Beispiel:

      TItemData = record
      ItemName :String[200];
      StartTimeouble;
      EndTime ouble;
      _Unit :String[10];
      ItemText :String[200];
      end;

      var
      ItemData: Array of TItemData;
      SendData: OleVariant;

      SetLength(ItemData,2);
      //Array füllen
      SendData:=DynArrayRecordToVariant(ItemData)

      Comment


      • #4
        Juhu ... selbst gefunden...

        aber vielleicht kann man das auch schlanker machen???

        type
        TItemData = record
        ItemName :String[200];
        StartTimeouble;
        EndTime ouble;
        _Unit :String[10];
        ItemText :String[30];
        end;

        procedure MoveDataToVarArray(const Source; var Dest; len, start:Integer);
        var
        S, D: PChar;
        I: Integer;
        begin
        S := PChar(@Source);
        D := PChar(@Dest);
        for I := 0 to len-1 do
        D[start+I] := S[I];
        end;

        function ArrayRecordToVariant(const Rec: Array of TItemData): OleVariant;
        var
        Count:Integer;
        Size :Integer;
        VSize:Integer;
        P,VP :PChar;
        n :Integer;
        begin
        Count:=High(Rec);
        Size :=SizeOf(Rec[0]);
        VSize:=Size*(Count+1);
        GetMem(P,VSize);
        for n:=0 to Count do
        MoveDataToVarArray(Rec[n], P^, Size, n*Size);
        Result:=VarArrayCreate([0,VSize-1],varByte);
        VP:=VarArrayLock(Result);
        try
        Move(P^,VP^,VSize);
        finally
        VarArrayUnlock(Result);
        end;
        FreeMem(P);
        end;

        procedure MoveDataFromVarArray(var Dest; const Source; len, start:Integer);
        var
        S, D: PChar;
        I: Integer;
        begin
        S := PChar(@Source);
        D := PChar(@Dest);
        for I := 0 to len-1 do
        D[I] := S[start+I];
        end;

        procedure VariantToArrayRecord(const V: OleVariant;var Data: Array of TItemData);
        var
        Size :Integer;
        VSize:Integer;
        P,VP :PChar;
        n :Integer;
        begin
        VSize:=VarArrayHighBound(V,1)+1;
        Size:=SizeOf(TItemData);
        GetMem(P,VSize);
        VP:=VarArrayLock(V);
        try
        Move(VP^,P^,VSize);
        finally
        VarArrayUnlock(V);
        end;
        for n:=0 to High(Data) do
        MoveDataFromVarArray(Data[n], P^, Size, n*Size);
        FreeMem(P);
        end;

        procedure BtnToOLEVariantandBack(Sender: TObject);
        const
        Len = 5;
        var
        ItemData1,ItemData2: Array of TItemData;
        OV: OLEVariant;
        Size: Integer;
        begin
        SetLength(ItemData1,Len);
        // füllen des Arrays ....
        OV:=ArrayRecordToVariant(ItemData);
        Size:=(VarArrayHighBound(OV,1)+1) div SizeOf(TItemData);
        SetLength(ItemData2,Size);
        VariantToArrayRecord(OV,ItemData2);
        end

        Comment

        Working...
        X