Главная страница
    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.48 MB
Время: 0.047 c
15-1158216592
Vlad Oshin
2006-09-14 10:49
2006.10.08
хотите нет а расскажу


2-1158566667
непонимающий
2006-09-18 12:04
2006.10.08
динамические массивы


11-1134842022
nester
2005-12-17 20:53
2006.10.08
KOL и x64


15-1158163659
OSokin
2006-09-13 20:07
2006.10.08
День Программиста


2-1158735720
kyn66
2006-09-20 11:02
2006.10.08
Как проверить значение полей при вводе добавлении записи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский