Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Область видимости объектов [D5, Win2k]


voodoo_alex ©   (2002-06-07 12:07:00) 

Народ вот такая возникла ситуация:
Есть 2 объекта TResultSet и TResultSetList.
У второго есть поле SetList : TList и метод Add

procedure TResultSetList.Add;
begin
CurrentRow := SetList.Add(TResultList.Create);
end;

в программе есть следующие строки:
.....
var
MainResultSetList : TResultSetList;
....
....
MainResultSetList.Add;
Name1 := EditName1.Text;
....

После первой команды MainResultSetList.SetList.Items[0]^ - указывает на нормальный новосозданный объект класса TResultSet.

После вырполнения следующей строчки (неважно какая, лишь бы там Этот MainResultSetList.SetList.Items[0]^ не использовался) по адресу где новосозданный объект лежал пишется куча мусора. Я так понял что как бы объект вышел из области видимости и дельфи его бабахнул. Ну а как тогда быть в такой ситуации ???

Помогите пожалуйста, вторую ночь не сплю ;(((


voodoo_alex   (2002-06-07 14:11:00) [1]

я не терялся а спрашивал правильный способ, но на будушее учту ;)
а вобще подсказали делать TResultSetList = class(TObjectList)
вот такой способ и буду реализовать ;)
Спасиб ;)


Digitman   (2002-06-07 13:17:00) [2]

Раз не так выразился, будь любезен прокомментировать это :

>>в программе есть следующие строки:
>>.....
>>var
>> MainResultSetList : TResultSetList;


Программа - штука растяжимая, и в данном случае время жизни переменной MainResultSetList напрямую зависит от того, ГДЕ "в программе есть следующие строки".
Посему приводи по возможности полный код (полные описания всех подпрограмм, использующих эту переменную), если теряешься в понимании происходящего


voodoo_alex   (2002-06-07 12:51:00) [3]

я просто не так выразылся, имел в виду время жизни конечно


Digitman   (2002-06-07 12:35:00) [4]

>voodoo_alex

Между терминами "область видимости" идентификатора и "время жизни" объекта/переменной (см. "Делфи его бабахнул") нет ничего общего.

см. Anatoly Podgoretsky © (07.06.02 12:27)


Anatoly Podgoretsky   (2002-06-07 12:27:00) [5]

DВ приведенном коде нет ошибок, ошибка не в приведенном коде


voodoo_alex   (2002-06-07 12:25:00) [6]

То есть

Add:
T := New(TResultSet);
T.Create;
SetList.Add(T)

destructor:
for i := 0 to (SetList.Count-1) do
Dispose(SetList.Items[i]);

Я правильно понял ?


AFROLOV   (2002-06-07 12:12:00) [7]

надо не через var - объект создается в стеке. При выходе из области видимости объект будет удален или это может еще раньше сделать оптимизатор.
Такие веши надо делать через new и dispose.


Наверх

Титульная страница Поиск, карта сайта Написать письмо