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

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

Можно ли объекту уничтожить самого себя ? [D7, XP]


Страницы:   1 2

b/@. ©   (2009-06-04 16:12:00) 

К примеру есть форма, которая должна создаваться, а по событию от таймера уничтожаться:

 TfrmInfo = class(TForm)
   Timer: TTimer;
...

procedure T_Splash.FormCreate(Sender: TObject);
begin
// выделяются ресурсы
...
 Timer.Enabled := true;
end;

procedure TfrmInfo.FormDestroy(Sender: TObject);
begin
// тут уничтожаются выделенные ресурсы  
end;

procedure TfrmInfo.TimerTimer(Sender: TObject);
begin
 Free();
end;


Корректно ли так уничтожать форму ?


b/@.   (2009-06-09 15:39:00) [1]


> Игорь Шевченко ©   (09.06.09 12:03) [33]

Когда переходил с бейсика на паскаль то ужасало, что нужно описывать каждую переменную, а то что их еще и инициализировать нужно казалось вообще кошмаром...


Игорь Шевченко   (2009-06-09 12:03:00) [2]

b/@. ©   (09.06.09 11:44) [27]


> Ведь во всех книжках по паскалю пишут что любая переменная
> должна быть явно инициализирована...


а среда, когда генерирует переменную, не инициализирует ее. Наверное там тех книжек не читали :)


Ins   (2009-06-09 12:02:00) [3]


> Может будет, а может и нет, если сильно повезёт.


Нет. Не будет фигни гарантированно. Я в [23] все описал. String - это финализируемый тип. (Если конечно речь о Delphi, а не о Паскале)


Ins   (2009-06-09 12:00:00) [4]


> каким образом можно уничтожать изнутри ?


Если гарантируешь, что после этого момента не будет никакого обращения к уничтоженному экземпляру, то можно просто Free. Обращение к экземпляру - это обращение к полям, вызов виртуальных, динамических методов. Вызвать статический метод, который внутри себя к Self не обращается, можно даже с уничтоженным объектом. Ну, а если не гарантируешь, то несколько сложнее, но тоже можно.


Ega23   (2009-06-09 11:56:00) [5]

Кое-что можно опустить, например инициализацию полей в объекте, там изначально FillChar(0) идёт. Т.е. все указатели - nil, числа - 0, Bool - False и т.п.

А вот уже тут:

function Foo() : string;
var
 s : string;
 i : Integer;
begin
 for i:=155 to 160 do
   s := ss + Chr(i);
 Result := s;
end;


возможнобудет фигня полная.
Может будет, а может и нет, если сильно повезёт.


b/@.   (2009-06-09 11:54:00) [6]

А объекты других типов, которые наследованы не от TCustomFormа от других классов каким образом можно уничтожать изнутри ?
И даже те у которых нету обработчиков событий ?


Ega23   (2009-06-09 11:52:00) [7]


> Ведь во всех книжках по паскалю пишут что любая переменная
> должна быть явно инициализирована...


Правильно пишут.


b/@.   (2009-06-09 11:44:00) [8]

var
FInfo: TfrmInfo = nil;

Это я написал без умысла, просто не знал что можно забить на это и не инициализировать :(
Ведь во всех книжках по паскалю пишут что любая переменная должна быть явно инициализирована...


Rouse_   (2009-06-05 19:09:00) [9]


> Много ли паскалевидных компайлеров имеющих представления
> о TForm.FormDestroy ?

Это был ответ на вопрос, о физическом смысле присвоения, а не подача для начала дискуссии о компиляторах :)


ANB   (2009-06-05 13:25:00) [10]


> иногда выдает. когда какой-нибудь правоверный инициализирует,
>  а 20-ю строчками кода ниже присваивает значение.

А нафига 2 раза инициализить ? Правильно выдает.


Игорь Шевченко   (2009-06-05 12:25:00) [11]


> Кстати, хинта на начальное присвоение компилятор не выдает


иногда выдает. когда какой-нибудь правоверный инициализирует, а 20-ю строчками кода ниже присваивает значение.


Ins   (2009-06-05 12:18:00) [12]


> Инициализяться точно поля объектов. Насчет локальных переменных
> я бы так строго не утверждал, так как, не буду утверждать
> точно, но кажись нарывался на редко проявляемую ошибку с
> мусором в неинициализенной явно переменной.


Инициализируются:
- Глобальные переменные (размещены сегменте данных исполняемого модуля, куда компилятор записывает нужные значения), за исключением тех случаев, когда оптимизатор делает их локальными.
- Поля объектов (инициализируются в TObject.InitInstance)
- Локальные переменные финализируемых типов - длинные строки, динмассивы, интерфейсы, варианты (компилятор специально для них вставляет код инициализации)

Не инициализируются:
- Локальные переменные типов, не перечисленных выше. Содержат содержащийся в стеке мусор


ANB   (2009-06-05 12:01:00) [13]


> Сам же себе и противоречишь.
> Не было бы фичей, больше бы было шишек, и больше бы читали
> хелп. Иначе откуда бы знали, что (и как, и когда) иницализируется,
>  а что нет.
> :)

Инициализить переменные в коде - правила хорошего тона. Если компилятор сам их инициализит - - вот пусть его оптимизатор "ненужный" код сам и выкидывает.
Кстати, хинта на начальное присвоение компилятор не выдает. А если его забыть - вполне можно огрести предупреждение.
Инициализяться точно поля объектов. Насчет локальных переменных я бы так строго не утверждал, так как, не буду утверждать точно, но кажись нарывался на редко проявляемую ошибку с мусором в неинициализенной явно переменной.


Ega23   (2009-06-05 10:22:00) [14]


> Это понятно, для чего выносить в отдельную процедуру (функцию)
> тривиальный код?


Паттерн "Синглтон".


Германн   (2009-06-05 01:58:00) [15]


> Фичи тут абсолютно не причем.
>
> С другой стороны, знаю, что локальные строковые переменные
> инициализируются пустой строкой, а все равно, если надо
> что-то накапливать, сначала строку инициализирую пустой
> :)

Сам же себе и противоречишь.
Не было бы фичей, больше бы было шишек, и больше бы читали хелп. Иначе откуда бы знали, что (и как, и когда) иницализируется, а что нет.
:)

Может я не правильно употребил термин "фича"?


Игорь Шевченко   (2009-06-05 01:40:00) [16]

@!!ex ©   (05.06.09 00:39) [16]


> Это хорошая привычка. ИМХО.


Хорошая привычка - знать инструмент, с которым работаешь. Это даже не ИМХО.


> Но большинство не знает.


Проблемы индейцев шерифа не волнуют :)

Германн ©   (05.06.09 01:31) [18]


> А я так вообще почти в первый раз.


Я не в первый, но каждый разу удивляюсь, и когда есть возможность спросить - спрашиваю. Ответы получаю самые разные.
Фичи тут абсолютно не причем.

С другой стороны, знаю, что локальные строковые переменные инициализируются пустой строкой, а все равно, если надо что-то накапливать, сначала строку инициализирую пустой :)
Ну вот код мне такой понятнее.


Германн   (2009-06-05 01:31:00) [17]


> Игорь Шевченко ©   (04.06.09 18:40) [13]
>
>
> > var
> >  FInfo: TfrmInfo = nil;
>
>
> кстати - это имеет какой-то физический смысл (присваивание)
> ? А то я не первый раз встречаю.
>

А я так вообще почти в первый раз. "Новомодные фичи" непонятно для чего сделанные.
Таких в Дельфи, на мой скус слишком много.


Германн   (2009-06-05 01:26:00) [18]


> меньше шишокбыло бы...

А это что за звери?
:)


@!!ex   (2009-06-05 00:39:00) [19]

> [13] Игорь Шевченко ©   (04.06.09 18:40)
> кстати - это имеет какой-то физический смысл (присваивание)
> ? А то я не первый раз встречаю.

Это хорошая привычка. ИМХО.
Лет 5 назад по своей неопытности и наивному предположению(все инициализируется 0) получил критическую ошибку в C++ проекте.
Понятно, что если знать, то этой проблемы легко избежать. Но большинство не знает.
Сейчас я вполне четко осознаю что будет с переменными в С++ или в дельфи и пишу соответствующе. Но это опыт и швабры.
Не полагался бы на компилятор изнчально - меньше шишок было бы...


Игорь Шевченко   (2009-06-04 23:46:00) [20]

Rouse_ ©   (04.06.09 23:10) [14]

Много ли паскалевидных компайлеров имеющих представления о TForm.FormDestroy ?

Lazarus и FreePascal переменные инициализует также, как Delphi


Страницы:   1 2

Наверх

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