![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача массива вариантов в функцию
Ega23 © (2015-03-25 12:39:00)Возникла нужда в рефакторинге. И вот что-то залип.
Нужен примерно такой код:
TSomeClass = class
private
FData: Variant;
FProcessors: TObjectList<TSomeProcessor>;
public
procedure MakeDataArray();
end;
TSomeProcessor = class
....
public
procedure FillData( ???? ); virtual;
end;
const
cDataArrWidth = 17;
procedure TSomeClass.MakeDataArray() ;
begin
FData := VarArrayCreate([0, SomeCount - 1, 1, cDataArrWidth], varVariant);
for i := 0 to FProcessors.Cpunt - 1 do
FProcessors.FillData( FData ???);
end;
Суть. Собираются данные для экспорта в Excel в виде двумерного массива. Поскольку данные неоднородны (где-то строки, а где-то в той же колонке могут быть и цифры), то создаётся эта байда как массив вариантов.
Дальше есть список неких "процессоров", которые этот массив по причудливой логике заполняют. Внутри процессоров размерность массива никак не изменяется.
Так вот, собственно, каким макаром мне этот мой FData: Variant; передавать в процессоры? Попробовал как вариант - у него vartype интересный, $800C. Т.е. и varArray и varVariant разом.
Пардон за сумбур. XE4.
Ega23 (2015-03-26 09:16:00) [21]
> что оба обращения эквивалентны
procedure TForm32.Bar3(var V: Variant);
begin
V[1, 1] := 1;
end;
Работает.
procedure TForm32.Bar3(var V: Variant);
begin
V[1][1] := 1;
end;
E2064 Left side cannot be assigned to
KilkennyCat (2015-03-26 03:19:00) [22]любопытно.
по крайней мере, здесь http://docwiki.embarcadero.com/RADStudio/XE6/en/Structured_Typesутверждается, что оба обращения эквивалентны
Ega23 (2015-03-26 02:34:00) [23]
> В каком случае [i][j] не годится?
В том тесте, который я наваял.
Завтра (точнее - утром... гм... после 10, короче) код выложу.
Германн (2015-03-26 01:42:00) [24]
> Ega23 © (25.03.15 16:09) [3]
>
>
> > А разве это не одно и то же?
>
>
> не совсем.
>
Почему не совсем? В каком случае [i][j] не годится?
Ega23 (2015-03-25 16:09:00) [25]
> А разве это не одно и то же?
не совсем.
Германн (2015-03-25 13:40:00) [26]
> Тупанул, обращался к двумерному массиву через [i][j], вместо
> [i, j]
А разве это не одно и то же?
Ega23 (2015-03-25 13:08:00) [27]Вопрос снят. Тупанул, обращался к двумерному массиву через [i][j], вместо [i, j]
А передавать надо так:
TSomeProcessor = class
....
public
procedure FillData(var Data: Variant); virtual;
end;