Главная страница
    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.009 c
3-1142861160
Спрашивающий
2006-03-20 16:26
2006.05.14
NULL в запросе


2-1145943531
barakuda
2006-04-25 09:38
2006.05.14
ВЗЯТЬ ПО МОДУЛЮ


15-1145281500
oldman
2006-04-17 17:45
2006.05.14
задачки школьникам задают...


8-1134545410
Chaser
2005-12-14 10:30
2006.05.14
Записать все происходящее на мониторе *.avi


15-1145445477
s_pavell
2006-04-19 15:17
2006.05.14
WAP шифрование





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