Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться с массивом типа 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.048 c
3-1155229904
serko
2006-08-10 21:11
2006.10.08
Выбор по дате!


6-1147707573
dmitrlast
2006-05-15 19:39
2006.10.08
Запуск библиотеки клиентом в локальной сети


3-1155189999
Stanislav
2006-08-10 10:06
2006.10.08
Размер содержимого Blob поля


8-1141762634
Yr2
2006-03-07 23:17
2006.10.08
Включение звуковой карты в режиме простого усилителя звука


15-1158433811
DillerXX
2006-09-16 23:10
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский