Форум: "Начинающим";
Текущий архив: 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