Главная страница
    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.009 c
2-1145914797
Slinne
2006-04-25 01:39
2006.05.14
Помогите написать простенькую процедуру (Delphi).


2-1145436953
Александр123123
2006-04-19 12:55
2006.05.14
создание класса


2-1145856478
makar
2006-04-24 09:27
2006.05.14
Вывод данных через Application.MessageBox


2-1145769990
Александр123123
2006-04-23 09:26
2006.05.14
Как в цикле прообежаться по свойствам компонента


2-1145769671
Akudza
2006-04-23 09:21
2006.05.14
Функция bintoint





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