Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизПомогите разобраться с массивом типа OleVariant Найти похожие ветки
← →
tolianb © (2006-09-22 03:24) [0]Имеется массив (array of OleVariant), заполняемый и создаваемый (VarArrayCreate([0,Count],varDouble);)во время одной процедуры. При попытке использования данного массива из другой процедуры выдает ошибку (как я понял - отсутствия массива),
массив объявлен в разделе var самого юнита. т.е. не как переменная процедуры (MarkPoint:array of olevariant;) Подскажите пожалуйста, в чем может быть проблема или другой способ решения даннной задачи:
Заполнение массива в ходе одной процедуры, и использование данных из него в ходе другой.
← →
ЮЮ © (2006-09-22 04:08) [1]Имеется массив (array of OleVariant), заполняемый и создаваемый VarArrayCreate
Т.е. работаешь с матрицей MarkPoint? Или полагал работать с ветором MarkPoint?
заполнение и создание лучше показать кодом. С динамическими массивами надо быть предельно аккуратным, особенн при снятой галке Range Checking
← →
tolianb © (2006-09-22 04:22) [2]Вот здесь я объявляю массив
var
Form1: TForm1;
path:string;
MarkPoint:array of olevariant;
MarkPointCount:integer;
implementation
Вот эта процедура заполняет массив
procedure TForm1.BitBtn4Click(Sender: TObject);
var
i,c:integer;
Point:IAcadPoint;
SSet:IAcadSelectionSet;
p:OleVariant;
begin
P:=VarArrayCreate([0, 2], varDouble);
SSet:=acadapp.ActiveDocument.SelectionSets.Add("Selection");
Sset.SelectOnScreen(EmptyParam,EmptyParam);
MarkPoint:=VarArrayCreate([0,SSet.Count],varDouble);
c:=0;
for i:=0 to SSet.Count-1 do
begin
//Form1.Memo1.Lines.Add(SSet.Item(i).EntityName);
if SSet.Item(i).EntityName="AcDbPoint" then
begin
point:=SSet.Item(i) as iAcadPoint;
MarkPoint[i]:=point.Coordinates;
Form1.Memo1.Lines.Add(FloatToStr(MarkPoint[i][0])+" "+FloatToStr(MarkPoint[i][1])+" "+FloatToStr(MarkPoint[i][2]));
//point.Erase;
c:=c+1;
end;
end;
MarkPointCount:=c+1;
Form1.Memo1.Lines.Add(IntToStr(c));
Вот в этой процедуре я пытаюсь добраться до массива
procedure AltMark (x,y:double; var z:double);
var
x1,y1,z1,x2,y2,z2,x3,y3,z3:double;
a,b,c,d,minr1,minr2,minr3:double;
i:integer;
ur_pl:string;
begin
Ошибка возникает при попытке обращения к данным в массиве, например:
Form1.Memo1.Lines.Add(FloatToStr(MarkPoint[1][0]));
...
end;
← →
tolianb © (2006-09-22 04:22) [3]Вот здесь я объявляю массив
var
Form1: TForm1;
path:string;
MarkPoint:array of olevariant;
MarkPointCount:integer;
implementation
Вот эта процедура заполняет массив
procedure TForm1.BitBtn4Click(Sender: TObject);
var
i,c:integer;
Point:IAcadPoint;
SSet:IAcadSelectionSet;
p:OleVariant;
begin
P:=VarArrayCreate([0, 2], varDouble);
SSet:=acadapp.ActiveDocument.SelectionSets.Add("Selection");
Sset.SelectOnScreen(EmptyParam,EmptyParam);
MarkPoint:=VarArrayCreate([0,SSet.Count],varDouble);
c:=0;
for i:=0 to SSet.Count-1 do
begin
//Form1.Memo1.Lines.Add(SSet.Item(i).EntityName);
if SSet.Item(i).EntityName="AcDbPoint" then
begin
point:=SSet.Item(i) as iAcadPoint;
MarkPoint[i]:=point.Coordinates;
Form1.Memo1.Lines.Add(FloatToStr(MarkPoint[i][0])+" "+FloatToStr(MarkPoint[i][1])+" "+FloatToStr(MarkPoint[i][2]));
//point.Erase;
c:=c+1;
end;
end;
MarkPointCount:=c+1;
Form1.Memo1.Lines.Add(IntToStr(c));
Вот в этой процедуре я пытаюсь добраться до массива
procedure AltMark (x,y:double; var z:double);
var
x1,y1,z1,x2,y2,z2,x3,y3,z3:double;
a,b,c,d,minr1,minr2,minr3:double;
i:integer;
ur_pl:string;
begin
Ошибка возникает при попытке обращения к данным в массиве, например:
Form1.Memo1.Lines.Add(FloatToStr(MarkPoint[1][0]));
...
end;
← →
ЮЮ © (2006-09-22 04:42) [4]Coordinates тоже VarArray?
MarkPoint:=VarArrayCreate([0,SSet.Count],varDouble);
MarkPoints должен быть не array of olevariant, а [Ole]Variant
Или, если он array of olevariant, то длину следует устанавливать так:
SetLength(MarkPoint, SSet.Count);
← →
tolianb © (2006-09-22 04:57) [5]Да Coordinates определяются как :OleVariant; например:
BP:= VarArrayCreate([0, 2], varDouble);
(Прога работает с AutoCAD 2006, это координаты x,y,z - соответственно BP[0], BP[1],BP[2])
Массив MarkPoint представляет собой массив таких значений. - массив координат отдельных точек на чертеже. Опытным путем определено, что при чтении массива из второй процедуры он оказывается пустым (по крайней мере создается такое впечатление - пишет Invalid Argument). Если вставлять инструкцию типа Form1.Memo1.Lines.Add(FloatToStr(MarkPoint[1][0])); или любую другую при работе с данным массивом в процедуре заполнения массива (после его заполнения) все работает отлично например:
Form1.Memo1.Lines.Add(FloatToStr(MarkPoint[i][0])+" "+FloatToStr(MarkPoint[i][1])+" "+FloatToStr(MarkPoint[i][2])); - т.е. тоже самое но ошибок не выдает
← →
ЮЮ © (2006-09-22 05:11) [6]Похоже, MarkPoint должен быть не array of OleVariant, а массив массивов:
MarkPoint: olevariant;
MarkPoint := VarArrayCreate([0, 2], varvariant);
← →
ЮЮ © (2006-09-22 05:12) [7]сорри
MarkPoint := VarArrayCreate([0,SSet.Count],varVariant);
← →
tolianb © (2006-09-22 05:20) [8]Спасибо, работает. Ну я и затупил блин.
Тогда почему нормально работало при чтении данных из массива в процедуре в которой происходит его заполнение???????????
← →
ЮЮ © (2006-09-22 05:25) [9]потому что
1) array of - чисто Дельфийская конструкция
2) не "очень" запорол (или не обращался к запоротой) память, а Range Checking отключена
← →
tolianb © (2006-09-22 05:27) [10]Еще раз спасибо.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.047 c