Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
ВнизВариантный массив Найти похожие ветки
← →
Pirog (2009-07-25 15:05) [0]Как создать двумерный вариантный массив, если заранее неизвестна его размерность?
← →
turbouser © (2009-07-25 16:18) [1]var
X :array of array of variant;
begin
SetLength(X,1);
SetLength(X[0],1);
← →
topS (2009-07-25 16:28) [2]
> Как создать двумерный вариантный массив, если заранее неизвестна
> его размерность?
наверное объявить?
точно также как любой динамический массив. справка разжевывает для начинающих
← →
Anatoly Podgoretsky © (2009-07-25 16:34) [3]Нельзя создать, на момент создания размерность должна быть известна.
← →
Anatoly Podgoretsky © (2009-07-25 16:35) [4]
> turbouser © (25.07.09 16:18) [1]
А ты уверен, что ему нужен array of variant, а не вариантный массив?
← →
turbouser © (2009-07-25 16:37) [5]
> Anatoly Podgoretsky © (25.07.09 16:35) [4]
Я уже ни в чем не уверен :)
← →
sniknik © (2009-07-25 17:38) [6]> Я уже ни в чем не уверен :)
и правильно, создание не есть объявление...
и кстати
> SetLength(X,1);
> SetLength(X[0],1);
заменяется на SetLength(X,1,1);
D7 уже так поддерживает (раньше вроде нет).
← →
palva © (2009-07-25 18:12) [7]Все же вариантный массив это не массив вариантов, а массив, который хранится в вариантной переменной. Чтобы в COM можно было с ним работать.
← →
Anatoly Podgoretsky © (2009-07-25 18:27) [8]> palva (25.07.2009 18:12:07) [7]
Но автор пока молчит, но видимо это так.
← →
Pirog (2009-07-26 00:04) [9]
> palva © (25.07.09 18:12) [7]
>
> Все же вариантный массив это не массив вариантов, а массив,
> который хранится в вариантной переменной. Чтобы в COM можно
> было с ним работать.
>
абсолютно верно, работаю с excel. После проверки на дупликаты данных программы и данных в excel нужно вывести эти данные в OleVariant размерность которых неизвестна :-(
← →
turbouser © (2009-07-26 00:29) [10]
> Pirog (26.07.09 00:04) [9]
> нужно вывести эти данные в OleVariant размерность которых
> неизвестна :-(
ПлакалЪ Весь. ©
← →
Pirog (2009-07-26 01:22) [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 не повторяющееся строки. Только как объявить или создать этот массив не пойму размерность то неизвестна на момент получения
← →
Юрий Зотов © (2009-07-26 09:41) [12]Может быть, в 2 прохода? На первом проходе сравниваем строки, запоминаем индексы неповторяющихся строк и определяем их количество. Потом создаем массив и заполняем его вторым проходом.
← →
Anatoly Podgoretsky © (2009-07-26 10:17) [13]> Pirog (26.07.2009 01:22:11) [11]
Разрядность исзвестна в момент занесени данных в ArrayData3
← →
Anatoly Podgoretsky © (2009-07-26 10:19) [14]> Pirog (26.07.2009 01:22:11) [11]
Не говоря уже о том, что третий вариантный массив не нужен, можно обойтись обойтись признаком в массивах 1 и 2
← →
TUser © (2009-07-26 10:34) [15]Вычислять индекс каждый раз. примерно так
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;
← →
Pirog (2009-07-26 11:43) [16]
> Юрий Зотов © (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;
← →
Pirog (2009-07-26 11:44) [17]
> TUser © (26.07.09 10:34) [15]
>
> Вычислять индекс каждый раз. примерно так
что то не совсем понял это......:(
← →
Pirog (2009-07-26 16:12) [18]еще вопрос правильно ли делаю в конце кодинга?
ArrayData:=null;
← →
TIF © (2009-07-26 20:56) [19]> ArrayData:=null;
null? o_O
Может всё-таки nil?
← →
Pirog (2009-07-26 21:25) [20]
> Может всё-таки nil?
ошибку даёт твой nil
← →
Anatoly Podgoretsky © (2009-07-26 22:11) [21]> Pirog (26.07.2009 21:25:20) [20]
Да он мало чего знает про СОМ и варианты., путает Бабеля с Гегелем.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c