Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Как передать в функцию массив записей использия 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;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.013 c
15-1145346985
Сайбель Алексей
2006-04-18 11:56
2006.05.14
Difference Algorithm and Its Variations


3-1142926431
Jane
2006-03-21 10:33
2006.05.14
Использование в коннектах через BDE user name заданных кириллицей


15-1145462574
Piter
2006-04-19 20:02
2006.05.14
Нужна программка, которая максимально нагружает диск :)


15-1145438911
foll
2006-04-19 13:28
2006.05.14
плагиат


2-1146121093
IntruderLab
2006-04-27 10:58
2006.05.14
TIdFTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский