Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.006 c
2-1244472613
lewka
2009-06-08 18:50
2009.08.02
Работа в Word


3-1225086355
hic
2008-10-27 08:45
2009.08.02
Передача данных из сохраненного отчета FastReport в Delphi


4-1213685860
TUserClass
2008-06-17 10:57
2009.08.02
XPManifest для DLL ...


3-1225144232
Раиса
2008-10-28 00:50
2009.08.02
MySQL и SSH Tunneling - какие компоненты


4-1213199504
Dmitry S
2008-06-11 19:51
2009.08.02
Рисование в окне из другого потока





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский