Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Вниз

Как передать в функцию массив записей использия Variant?   Найти похожие ветки 

 
Kolan ©   (2006-04-07 13:08) [0]

Здравствуйте,
 Есть запись:
 TDoublePoint = record
   X: Double;
   Y: Double;
 end;

 И есть соотв. дин. массив.:
 TDoublePointArray = array of TDoublePoint;
Мне нужно передать массив такого типа функции, которая о нем ничего не знает. Пытался сделать так:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 V: Variant;
 Arr: TDoublePointArray;
 I: Integer;
begin
 SetLength(Arr, 10);
 for I := Low(Arr) to High(Arr) do
 begin
   Arr[I].X := I;
   Arr[I].Y := I * I;
 end;
 V := Arr;
 PrintArray(TDoublePointArray(V));
end;

procedure TForm1.PrintArray(V: Variant);
var
 I: Integer;
begin
 for I := Low(TDoublePointArray(V)) to High(TDoublePointArray(V)) do
 begin
   ListBox1.Items.Add(FloatToStr(TDoublePointArray(V)[I].X) +" - "
     +FloatToStr(TDoublePointArray(V)[I].Y));
 end;

end;


Получил ошибку
[Pascal Error] Unit1.pas(48): E2003 Undeclared identifier: "_VarFromDynArray"

Из справки прочитал что:
You cannot assign an ordinary static array to a variant. Instead, create a variant array by calling either of the standard functions

Те нужно использовать вариантный массив? А как непонял ведь у меня массив записей....

Все это нужно чтобы клиент мог запросить у COM сервера такой массив..


 
Kolan ©   (2006-04-07 13:35) [1]

Вроде вот так получилось... Незнаю правильно ли.... Как еще можно?

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 V: Variant;
 Arr: TDoublePointArray;
 I, J: Integer;
begin
 SetLength(Arr, 5);
 for I:= Low(Arr) to High(Arr) do
 begin
   Arr[I].X := I;
   Arr[I].Y := I * I;
 end;
 V := VarArrayCreate([0,Length(Arr)*2 - 1],varDouble);
 J := 0;
 for I:= Low(Arr) to High(Arr) do
 begin
   V[J] := Arr[I].X;
   V[J + 1] := Arr[I].Y;
   J := J + 2;
 end;
 PrintArr(V, 0, Length(Arr)*2 - 1);
end;

procedure TForm1.PrintArr(V: Variant; Left, Right: Integer);
var
 I: Integer;
begin
 I := VarArrayLowBound(V, 1);
 while I <= VarArrayHighBound(V, 1) do
 begin
   ListBox1.Items.Add("I = " + FloatToStr(V[I]) + " - I^2 = " + FloatToStr(V[I + 1]));
   I := I + 2;
 end;

end;


 
Сергей М. ©   (2006-04-07 13:36) [2]


> Все это нужно чтобы клиент мог запросить у COM сервера такой
> массив


Посмотри как это концептуально делает сам Борланд в методах TDataBlockInterpreter.Read/WriteVariant в модуле sconnect.pas

TDataBlockInterpreter - это как раз класс для маршаллинга/демаршаллинга интерфейсных запросов.


 
Kolan ©   (2006-04-07 13:39) [3]

Уфф. Слишком сложно. Трудно понять....


 
isasa ©   (2006-04-07 13:44) [4]

Здесь передается массив double, на record сам :), готового кода по рукой нет

На стороне сервера

type
 dbuf = array of double;
 pdbuf = ^dbuf;

procedure TGases.Set_Xi(Value: OleVariant);
var p : pdbuf;
   dataLen : Cardinal;
   i : integer;
begin
 dataLen:=VarArrayHighBound(Value, VarArrayDimCount(Value));
 i:=dataLen div SizeOf(double); //FnComp:=dataLen div SizeOf(double);
 SetLength(FXi, i);
 p:=VarArrayLock(Value);
 for i:=low(FXi) to high(FXi) do  FXi[i]:=p^[i]; //move(p^, FXi, dataLen);
 VarArrayUnLock(Value);
end;

на стороне клиента

function TForm1.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;

procedure TForm1.varInterfaceClick(Sender: TObject);
var vrntNature : Variant;
...
begin
...
  vrntNature:=CreateOleObject("..."); // или через TLB !
...
  vrntNature.Xi:=DynArrayToVar(aXi, (high(aXi)-low(aXi)+1)*SizeOf(double));
...


 
isasa ©   (2006-04-07 13:47) [5]

Да, FXi в COM сервере это:
 TautoFLClass = class(TAutoObject)
...
 protected
  ...
   FXi : array of double;


 
Kolan ©   (2006-04-07 14:19) [6]

Так если я передаю параметр как-бы как var мне надо указать тип VARIANT * или просто VARIANT?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.011 c
3-1143024141
mmms
2006-03-22 13:42
2006.05.14
Можно ли из открытого ADOQuery узнать мин/макс значение


2-1145736546
maker
2006-04-23 00:09
2006.05.14
Хранение в памяти типа Extended, Real, Double, Float...


2-1146039167
dera
2006-04-26 12:12
2006.05.14
Несоответсвие форматов дат?


3-1142876984
beglec
2006-03-20 20:49
2006.05.14
Как типизированый поток записать в TMemTableEh


15-1145442582
DelphiN!
2006-04-19 14:29
2006.05.14
А M$$soft и не скрывает ... :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский