Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите разобраться с массивом типа OleVariant [D7]


tolianb ©   (2006-09-22 03:24:00) 

Имеется массив  (array of OleVariant), заполняемый и создаваемый (VarArrayCreate([0,Count],varDouble);)во время одной процедуры. При попытке использования данного массива из другой процедуры выдает ошибку (как я понял - отсутствия массива),
массив объявлен в разделе var самого юнита. т.е. не как переменная процедуры (MarkPoint:array of olevariant;) Подскажите пожалуйста, в чем может быть проблема или другой способ решения даннной задачи:
Заполнение массива в ходе одной процедуры, и использование данных из него в ходе другой.


tolianb   (2006-09-22 05:27:00) [1]

Еще раз спасибо.


ЮЮ   (2006-09-22 05:25:00) [2]

потому что
1) array of  - чисто Дельфийская конструкция
2) не "очень" запорол (или не обращался к запоротой) память, а  Range Checking отключена


tolianb   (2006-09-22 05:20:00) [3]

Спасибо, работает. Ну я и затупил блин.
Тогда почему нормально работало при чтении данных из массива в процедуре в которой происходит его заполнение???????????


ЮЮ   (2006-09-22 05:12:00) [4]

сорри
MarkPoint := VarArrayCreate([0,SSet.Count],varVariant);


ЮЮ   (2006-09-22 05:11:00) [5]

Похоже,  MarkPoint должен быть не array of  OleVariant, а массив массивов:

MarkPoint: olevariant;

MarkPoint := VarArrayCreate([0, 2], varvariant);


tolianb   (2006-09-22 04:57:00) [6]

Да 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 04:42:00) [7]

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:22:00) [8]

Вот здесь я объявляю массив
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:00) [9]

Вот здесь я объявляю массив
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:08:00) [10]

Имеется массив  (array of OleVariant), заполняемый и создаваемый  VarArrayCreate

Т.е. работаешь с матрицей MarkPoint? Или полагал работать с ветором  MarkPoint?

заполнение и создание лучше показать кодом. С динамическими массивами надо быть предельно аккуратным, особенн при снятой галке Range Checking


Наверх

Титульная страница Поиск, карта сайта Написать письмо