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

Вниз

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

 
Злой!!!   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.01 c
1-35664
Nebuchadnezzar
2002-08-30 15:25
2002.09.12
TActionManager


3-35535
RDA
2002-08-21 10:17
2002.09.12
События


7-35924
Max2000
2002-07-03 11:02
2002.09.12
Принтер!!!!!


4-35967
v2k
2002-07-19 19:11
2002.09.12
кто знает


3-35586
michael_b
2002-08-21 22:23
2002.09.12
подскажите какой-нибудь реальный(не учебный) пример по работе IB





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский