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;


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


Rouse_   (2009-06-04 23:10:00) [21]


> кстати - это имеет какой-то физический смысл (присваивание)
> ? А то я не первый раз встречаю.

Ну, к примеру, для переносимости код в различные ответвления паскалевидных компилеров - вдруг у кого глобальные переменные не инициализируются?


Игорь Шевченко   (2009-06-04 18:40:00) [22]


> var
>  FInfo: TfrmInfo = nil;


кстати - это имеет какой-то физический смысл (присваивание) ? А то я не первый раз встречаю.


Юрий Зотов   (2009-06-04 18:34:00) [23]

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

> чтобы в других местах кода было меньше

Причем, тривиального. Это раз.

И чтобы в других местах этот тривиальный код не забыть. Это два.


clickmaker   (2009-06-04 18:06:00) [24]

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

чтобы в других местах кода было меньше


Dennis I. Komarov   (2009-06-04 17:52:00) [25]


> Вмдимо, с целью создания единственного экземпляра.

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


Юрий Зотов   (2009-06-04 17:48:00) [26]

> Dennis I. Komarov ©   (04.06.09 17:43) [8]

Вмдимо, с целью создания единственного экземпляра.


Dennis I. Komarov   (2009-06-04 17:43:00) [27]


> А мне не нравится проверка if FInfo = nil внутри, я бы вынес...

Хотя тогда и функция не нужна :)
А с какой целью она вообще?


Dennis I. Komarov   (2009-06-04 17:16:00) [28]


> function Info(): TfrmInfo;
> begin
>  if FInfo = nil
>  then FInfo := TfrmInfo.Create(nil);
>  result := FInfo;
> end;

А мне не нравится проверка if FInfo = nil внутри, я бы вынес...


Юрий Зотов   (2009-06-04 17:12:00) [29]

Строго говоря, форма TfrmInfo должна быть выполнена, как синглтон. Но если проект не слишком крупный, не слишком ответственный и делается в одиночку, то можно оставить и так.


b/@.   (2009-06-04 17:09:00) [30]


> Юрий Зотов ©   (04.06.09 17:06) [4]
> Уберите рекурсию в Info и будет нормально.

Простите - просто опечатка вышла :( конечно же правильно вот так:

if FInfo = nil


Юрий Зотов   (2009-06-04 17:06:00) [31]

Уберите рекурсию в Info и будет нормально.


b/@.   (2009-06-04 16:32:00) [32]

Если можно еще один вопрос:

Данная форма вызывается как Info.Show();

implementation

var
 FInfo: TfrmInfo = nil;

function Info(): TfrmInfo;
begin
 if Info = nil
 then FInfo := TfrmInfo.Create(nil);
 result := FInfo;
end;


А в каком месте лучше всего очищать FInfo ?

Сейчас это сделано так:

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


b/@.   (2009-06-04 16:18:00) [33]

Спасибо.
Получается просто отложенный вызов Free();
Насколько я понимаю, это чтобы не возникало AV в дальнейшем.


Palladin   (2009-06-04 16:13:00) [34]

может. только не Free, а Release


Страницы:   1 2

Наверх

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