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

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

Как передать array of record [Delphi, Windows]


SupKlo ©   (2005-09-23 10:13:00) 

Как передать array of record с сервера на клиента


urdolphin   (2005-09-25 20:46:00) [1]

Живите проще, господа! Зачем что-то рассчитывать? Ситаем Delphi X - Руководство разработчика (Стив Тейксера, Ксавье Пачеко). Там все подробненько описано (только не про DCOM :((( )


isasa   (2005-09-23 10:40:00) [2]

FXi[i]:=pArr^[i].Xi*0.01; =>FXi[i]:=pArr^[i].Xi;


isasa   (2005-09-23 10:36:00) [3]

На клиенте имеем

type
...
 rComponent = record
   id : integer;
   Xi : double;
   dXi : double;
 end;
 TrComponent = array of rComponent;
...
var
...
 Comp : TrComponent;
...                    

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(Comp, (high(Comp)-low(Comp)+1)*sizeof(rComponent));


Сервер

 TautoFLClass = class(TAutoObject)
...
 protected
   Fks : array of integer;
   FXi : array of double;
   FdXi : array of double;
...
   procedure Set_Components(value : OleVariant); safecall;
...
 end;

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;


Наверх

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