Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.048 c
15-1158383746
PSPF2003
2006-09-16 09:15
2006.10.08
.aspx приложения в Д7


1-1156940814
Alex35
2006-08-30 16:26
2006.10.08
Преобразовать вордовский документ в картинку


15-1158561725
Ega23
2006-09-18 10:42
2006.10.08
Вчера смотрел выпуск новостей


2-1158769175
vegarulez
2006-09-20 20:19
2006.10.08
Не появляется контекстная справка-выбиралка, после точки...


2-1158954375
BTR
2006-09-22 23:46
2006.10.08
RICHEDITOM