Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Byte в OleVariant


_Anton ©   (2005-07-21 14:23:00) 

Как правильно преобразовать из массива Byte в OleVariant?
(необходимо записать данные в тег XML)
делал много и по-разному - string(H: byte) режет строку на нуле


isasa   (2005-07-21 16:31:00) [1]

Было но не пошло.
В конце концов, отработает идея упаковки массива байтов в массив вариант.
Накладные расходы большие, но работает ка часы


_Anton   (2005-07-21 16:23:00) [2]

!!!
есть же стандартное решение - и именно так всегда и делают
в таких случаях :

BinToHex(PCHAR(pSign_Buf),Sign_Buf_Array, dwSignLen);

и кода - две строчки :)

Всем спасибо.


isasa   (2005-07-21 16:14:00) [3]

Пропустил

type
ParComponent = ^TrComponent;


isasa   (2005-07-21 16:10:00) [4]

Живой премер.
На стороне клиента

........................

function DynArrayToVar(var buf; dataLen: cardinal): variant;
var p : pointer;
begin
 Result:=VarArrayCreate([0, dataLen], varByte);
 p:=VarArrayLock(Result);
 move(buf, p^, dataLen);
 VarArrayUnlock(Result);
end;

.........................
Вызвваем метод интерф.

propInterf.Components:=DynArrayToVar(Data.Comp,
                           (high(Data.Comp)-low(Data.Comp)+1)*sizeof(rComponent));

......................
где
Data.Comp стр-ра типа

type
 rComponent = record
   id : integer;
   Xi,
   dXi : double;
 end;
 TrComponent = array of rComponent;

На стороне сервера (IDL)
...............

   property Components: OleVariant write Set_Components;

..................

прием структуры

procedure TautoFLClass.Set_Components(value: OleVariant);
var pArr : ParComponent;
   dataLen : Cardinal;
   i : integer;
begin
 dataLen:=VarArrayHighBound(Value, VarArrayDimCount(Value));
 i:=dataLen div SizeOf(rComponent);
 SetLength(Fks, i);
 SetLength(FXi, i);
 SetLength(FdXi, i);
 pArr:=VarArrayLock(Value);
 for i:=low(Fks) to high(Fks) do begin
   Fks[i]:=pArr^[i].id;
   FXi[i]:=pArr^[i].Xi*0.01;
   FdXi[i]:=pArr^[i].dXi;
 end;
 VarArrayUnLock(Value);
end;


Digitman   (2005-07-21 15:50:00) [5]


> в двоичном виде - строка больше не считывается


какого ж шута ты хранишь строковые данные в виде массива байт ?
кой-какие элементы которого, видимо, являются терминирующими символами при преобразовании вида string(Sign_Buf) ?

обычная AnsiString чем не удалась ? в кач-ве источника данных для последующего преобразования ?


_Anton   (2005-07-21 15:46:00) [6]

тут проблема в том, что надо записать буфер данных в XML тег
и всё;
просто при преобразовании att.value := string(Sign_Buf)
в тег иногда записывается не весь буфер - подозреваю, что проблема как раз в этом преобразовании (после какого-то символа
в двоичном виде - строка больше не считывается)


Digitman   (2005-07-21 15:34:00) [7]

сошлись на офиц.документ, утверждающий что олей-вариантная переменная, которая должна выступать в кач-ве правой части выражения присвоения св-ва att.value, обязана хранить данные такого-то типа


_Anton   (2005-07-21 15:25:00) [8]

у меня буфер Byte:  
    Sign_Buf:             PBYTE;
    SignLen :             DWORD;

SignLen :=512;
GetMem(Sign_Buf, SignLen);

и тег XML:
    att: IXMLDOMAttribute;

att.value := ???

Есть ли что-то конкретное в Delphi для этого??


REA   (2005-07-21 14:35:00) [9]

DynArrayToVariant еще


Digitman   (2005-07-21 14:31:00) [10]

v: OleVariant;
ba: TByteArray;

..

v := VarArrayCreate([LoIndex, HiIndex], varByte);
for i:= LoIndex to HiIndex do
v[i] := ba[i];

сойдет ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо