Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.02;
Скачать: CL | DM;

Вниз

Можно ли объекту уничтожить самого себя ?   Найти похожие ветки 

 
b/@. ©   (2009-06-04 16:12) [0]

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

 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;


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


 
Palladin ©   (2009-06-04 16:13) [1]

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


 
b/@. ©   (2009-06-04 16:18) [2]

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


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

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

Данная форма вызывается как 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;


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

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


 
b/@. ©   (2009-06-04 17:09) [5]


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

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

if FInfo = nil


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

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


 
Dennis I. Komarov ©   (2009-06-04 17:16) [7]


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

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


 
Dennis I. Komarov ©   (2009-06-04 17:43) [8]


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

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


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

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

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


 
Dennis I. Komarov ©   (2009-06-04 17:52) [10]


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

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


 
clickmaker ©   (2009-06-04 18:06) [11]

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

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


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

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

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

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

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


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


> var
>  FInfo: TfrmInfo = nil;


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


 
Rouse_ ©   (2009-06-04 23:10) [14]


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

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


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

Rouse_ ©   (04.06.09 23:10) [14]

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

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


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

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

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


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


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

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


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


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

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


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

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


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


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


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


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

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


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


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

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


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


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

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

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


 
Ega23 ©   (2009-06-05 10:22) [21]


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


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


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


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

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


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


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


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

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


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


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


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


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


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

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


 
Rouse_ ©   (2009-06-05 19:09) [26]


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

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


 
b/@. ©   (2009-06-09 11:44) [27]

var
FInfo: TfrmInfo = nil;

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


 
Ega23 ©   (2009-06-09 11:52) [28]


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


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


 
b/@. ©   (2009-06-09 11:54) [29]

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


 
Ega23 ©   (2009-06-09 11:56) [30]

Кое-что можно опустить, например инициализацию полей в объекте, там изначально 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;


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


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


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


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


 
Ins ©   (2009-06-09 12:02) [32]


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


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


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

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


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


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


 
b/@. ©   (2009-06-09 15:39) [34]


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.08.02;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.01 c
15-1243941074
plastic
2009-06-02 15:11
2009.08.02
Кто ни будь пробовал настраивать D2009 ???


3-1225090646
azamat
2008-10-27 09:57
2009.08.02
delphi or sql?


15-1243963640
Сергей М.
2009-06-02 21:27
2009.08.02
Google Chrome и сертификаты подлинности


15-1243743525
Filer
2009-05-31 08:18
2009.08.02
Отловить момент открытия файла


4-1213516366
TForumHelp
2008-06-15 11:52
2009.08.02
Ресурсы в EXE-файле - VersionInfo