![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вариантный массив [D7, WinXP]
Pirog © (2009-07-25 15:05:00)Как создать двумерный вариантный массив, если заранее неизвестна его размерность?
Anatoly Podgoretsky (2009-07-26 22:11:00) [1]> Pirog (26.07.2009 21:25:20) [20]
Да он мало чего знает про СОМ и варианты., путает Бабеля с Гегелем.
Pirog (2009-07-26 21:25:00) [2]
> Может всё-таки nil?
ошибку даёт твой nil
TIF (2009-07-26 20:56:00) [3]> ArrayData:=null;
null? o_O
Может всё-таки nil?
Pirog (2009-07-26 16:12:00) [4]еще вопрос правильно ли делаю в конце кодинга?
ArrayData:=null;
Pirog (2009-07-26 11:44:00) [5]
> TUser © (26.07.09 10:34) [15]
>
> Вычислять индекс каждый раз. примерно так
что то не совсем понял это......:(
Pirog (2009-07-26 11:43:00) [6]
> Юрий Зотов © (26.07.09 09:41) [12]
>
> Может быть, в 2 прохода? На первом проходе сравниваем строки,
> запоминаем индексы неповторяющихся строк и определяем их
> количество. Потом создаем массив и заполняем его вторым
> проходом.
Спасибо за инфо....код получился страшноватый ))
SL1:=TStringList.Create;
SL2:=TStringList.Create;
//1 проход ортносительно массива из StringGrid
for i:=1 to RowCount1 do
begin
S1:='';
for j:=1 to ColCount1 do
begin
S1:=S1+ArrayData1[i,j];
end;
for l:=1 to RowCount2 do
begin
S2:='';
for m:=1 to ColCount2 do
begin
S2:=S2+ArrayData2[l,m];
end;
SL1.Add(S2); //çàïîìèíàåì ñòðîêè ìàññèâà èç excel â SL1
end;
b:=False;
for k:=0 to SL1.Count-1 do
begin
if (S1=SL1.Strings[k]) then b:=true;
end;
SL1.Clear;
if not b then begin
// запоминаем индексы не повторяющихся строк в SL2
SL2.Add(IntToStr(i));
end;
end;
RowCount3:=SL2.Count-1;//определяем их количество
ColCount3:=ColCount1;//всегда постоянно
ArrayData3 := VarArrayCreate([1, RowCount3, 1, ColCount3], varVariant);
//2 проход
for i:=1 to RowCount3 do //èäåì ïî SL2
begin
for j:=1 to ColCount3 do
begin
ArrayData3[i, j]:=ArrayData1[StrToInt(SL2.Strings[i]), j]
end;
end;
SL1.Free;
SL2.Free;
TUser (2009-07-26 10:34:00) [7]Вычислять индекс каждый раз. примерно так
TVarArray= class
FData: array of variant;
FDiment: integer; // размерность
FCounts: array of integer; // размеры по каждой из "осей"
function Data (Indexes: array of integer): variant;
function TVarArray.Data (Indexes: array of integer): variant;
var i, j: integer;
begin
j := Indexes[0];
for i := 1 to FDiment - 1 do
inc (j, FCounts[i-1] * Indexes[i]);
result := FData [j];
end;
Anatoly Podgoretsky (2009-07-26 10:19:00) [8]> Pirog (26.07.2009 01:22:11) [11]
Не говоря уже о том, что третий вариантный массив не нужен, можно обойтись обойтись признаком в массивах 1 и 2
Anatoly Podgoretsky (2009-07-26 10:17:00) [9]> Pirog (26.07.2009 01:22:11) [11]
Разрядность исзвестна в момент занесени данных в ArrayData3
Юрий Зотов (2009-07-26 09:41:00) [10]Может быть, в 2 прохода? На первом проходе сравниваем строки, запоминаем индексы неповторяющихся строк и определяем их количество. Потом создаем массив и заполняем его вторым проходом.
Pirog (2009-07-26 01:22:00) [11]
> turbouser © (26.07.09 00:29) [10]
звестна :-(
>
> ПлакалЪ Весь. ©
))короче так..... в 1 и 2 размерность известна
1) загружаю данные в массив из excel
ArrayData2 := VarArrayCreate([1, RowCount2, 1, ColCount2], varVariant);
2) загружаю данные в массив из Grid
ArrayData1:= VarArrayCreate([1, RowCount1, 1, ColCount1], varVariant);
3) Сравниваю строки в этих массивах получаю в массив ArrayData3 не повторяющееся строки. Только как объявить или создать этот массив не пойму размерность то неизвестна на момент получения
turbouser (2009-07-26 00:29:00) [12]
> Pirog (26.07.09 00:04) [9]
> нужно вывести эти данные в OleVariant размерность которых
> неизвестна :-(
ПлакалЪ Весь. ©
Pirog (2009-07-26 00:04:00) [13]
> palva © (25.07.09 18:12) [7]
>
> Все же вариантный массив это не массив вариантов, а массив,
> который хранится в вариантной переменной. Чтобы в COM можно
> было с ним работать.
>
абсолютно верно, работаю с excel. После проверки на дупликаты данных программы и данных в excel нужно вывести эти данные в OleVariant размерность которых неизвестна :-(
Anatoly Podgoretsky (2009-07-25 18:27:00) [14]> palva (25.07.2009 18:12:07) [7]
Но автор пока молчит, но видимо это так.
palva (2009-07-25 18:12:00) [15]Все же вариантный массив это не массив вариантов, а массив, который хранится в вариантной переменной. Чтобы в COM можно было с ним работать.
sniknik (2009-07-25 17:38:00) [16]> Я уже ни в чем не уверен :)
и правильно, создание не есть объявление...
и кстати
> SetLength(X,1);
> SetLength(X[0],1);
заменяется на SetLength(X,1,1);
D7 уже так поддерживает (раньше вроде нет).
turbouser (2009-07-25 16:37:00) [17]
> Anatoly Podgoretsky © (25.07.09 16:35) [4]
Я уже ни в чем не уверен :)
Anatoly Podgoretsky (2009-07-25 16:35:00) [18]
> turbouser © (25.07.09 16:18) [1]
А ты уверен, что ему нужен array of variant, а не вариантный массив?
Anatoly Podgoretsky (2009-07-25 16:34:00) [19]Нельзя создать, на момент создания размерность должна быть известна.
topS (2009-07-25 16:28:00) [20]
> Как создать двумерный вариантный массив, если заранее неизвестна
> его размерность?
наверное объявить?
точно также как любой динамический массив. справка разжевывает для начинающих