Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.12;
Скачать: CL | DM;

Вниз

Динамический массив классов   Найти похожие ветки 

 
Злой!!!   (2002-08-29 19:03) [0]

Уважаемый All!
Помогите чайнику разобраться. Есть у меня класс TSmeta, нужно работать с несколькими экземплярами этого класса, но сколько их будет не знаю. Я объявляю массив указателей:

smeta: array of ^TSmeta;

Потом, при добавлении нового элемента пишу:

tmp:=Length(smeta)+1;
SetLength(smeta,tmp);
GetMem(smeta[tmp-1],SizeOf(TSmeta));
smeta[tmp-1]^.Discription:=LabeledEdit1.Text;CODE>

Вроде как все нормально работает. Записываю результат в сроку стриггрида:

Form1.StringGridSmeta.Cells[1,i+1]:=smeta[i]^.Discription;

ругается - "Asccess violation...", причем даже если добавлять любую строку :((
С индексами все нормально, 10 раз проверял. Если убрать добавление нового элемента массива, то любую строку в грид пишет. Выделять память с помощью new пробовал, результат тот же. Фантазия закончилась, чего делать не знаю.

Подскажите плз, что не так делаю, заранее спасибо!


 
Skier ©   (2002-08-29 19:12) [1]

>Злой!!!
1)smeta: array of TSmeta;
2) нужно создавать объекты (экземпляры класса TSmeta) и обязательно их потом уничтожать

соответственно :


var
ASmeta : TSmeta;
begin
//..............
ASmeta := TSmeta.Create(...);
try
//здесь работаешь с объектов ASmeta
finally
FreeAndNil(ASmeta);
end; //try
//..............

3) Form1.StringGridSmeta.Cells[1,i+1]:=smeta[i].Discription


 
Skier ©   (2002-08-29 19:19) [2]

>Злой!!!
И ещё : лучше используй не дин. массив для
своей цели а классы TList или TObjectList
(или их потомки)...


 
Юрий Зотов ©   (2002-08-29 20:28) [3]

> Вроде как все нормально работает

Это только "вроде как". На самом деле дела плохи.

var
Smeta: array of TSmeta; // Не надо указателей.

Добавление нового элемента:

SetLength(Smeta, Length(Smeta) + 1); // И GetMem не нужно.
Smeta[High(Smeta)] := TSmeta.Create; // А вот это нужно.
Smeta[High(Smeta)].Description := LabeledEdit1.Text;

Запись в StringGrid:
Form1.StringGridSmeta.Cells[1, i + 1] := Smeta[i].Description;

Уничтожение i-го элемента:
Smeta[i].Free;

Уничтожение самого массива (после уничтожения всех элементов):
Smeta := nil;


 
Злой!!!   (2002-08-30 11:18) [4]

Всем бАльшое спасибо!
Последний вариант получился.
Обджектлисты обязательно помучаю.



Страницы: 1 вся ветка

Текущий архив: 2002.09.12;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
3-35625
michael_b
2002-08-22 08:01
2002.09.12
Можно ли так сделать что бы при соедиении с ib бд анализировалис


1-35796
Nikolai_S
2002-08-30 11:19
2002.09.12
Как удалить из динамического массива елемент по индексу?


1-35677
Старик
2002-09-02 11:55
2002.09.12
DLL


1-35772
Yaro
2002-08-30 09:47
2002.09.12
What is fu...i...n Frame


14-35868
Samokiller
2002-08-15 00:06
2002.09.12
Всем кто мешкает в Украине посвящается…