![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли объекту уничтожить самого себя ? [D7, XP]
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