![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив классов [D6, WinXP]
Злой!!! © (2002-08-29 19:03:00)Уважаемый 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 пробовал, результат тот же. Фантазия закончилась, чего делать не знаю.
Подскажите плз, что не так делаю, заранее спасибо!
Злой!!! (2002-08-30 11:18:00) [1]Всем бАльшое спасибо!
Последний вариант получился.
Обджектлисты обязательно помучаю.
Юрий Зотов (2002-08-29 20:28:00) [2]> Вроде как все нормально работает
Это только "вроде как". На самом деле дела плохи.
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;
Skier (2002-08-29 19:19:00) [3]>Злой!!!
И ещё : лучше используй не дин. массив для
своей цели а классы TList или TObjectList
(или их потомки)...
Skier (2002-08-29 19:12:00) [4]>Злой!!!
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