![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Все строки функции выполнятся? [D7, WinXP]
alex-drob © (2005-06-04 23:51:00)Если в функции написать
Icon:=TIcon.Create;
Icon.Handle:=ExtractIcon(Handle,PChar(ini.ReadString(TS.Items[i],'Icon','')),0);
Result:=Icon;
Icon.Free;
Последняя строка выполнится или нет?
icWasya (2005-06-06 10:25:00) [1]Abessalom (05.06.05 04:41) [11]
>Есть ... количество функций , результатом выполнения которых является объект, созданный внутри такой функции. Примеров можно найти много, NewItem, NewMenu
Как правило, объекты, созданные внутри таких функций, сразу же попадают в какой нибудь список, ответственный за время жизни этих объектов
alex-drob (2005-06-05 17:26:00) [2]
> DrPass © (05.06.05 02:32) [10]
Вопрос не именно в этой функции, я привел просто пример. Меня интересует если чтото создать в функции, то потом как удалить.
> begin...end © (05.06.05 10:20) [15]
Спасибо! Попробую.
begin...end (2005-06-05 10:20:00) [3]> alex-drob
Функция:
function CreateMyIcon: TIcon;
begin
Result := TIcon.Create;
try
Result.Handle := ExtractIcon(...)
except
Result.Free;
raise
end
end.
Использование:
var
Icon: TIcon;
begin
Icon := CreateMyIcon;
try
// Использование Icon
finally
Icon.Free
end
end.
Abessalom (2005-06-05 10:10:00) [4]
> злобная танька (05.06.05 10:03) [13]
:)
Пусть еще.) Гото новхере)
злобная танька (2005-06-05 10:03:00) [5]
> Abessalom (05.06.05 04:54) [12]
ну, goto ещё :)
Abessalom (2005-06-05 04:54:00) [6]
> Abessalom (05.06.05 04:41) [11]
Если конечно за аргументы принять то, что функция, похоже, не получает аргументов, и наверняка вызывается один раз... тогда да, лучше именно так.
По сути вопроса: все строки функции всегда выполняются, вплоть до завершения (end), выхода (Exit) или возникновения исключения. Оптимизатор также может чуть "подрезать" ваш код, если он по смыслу пуст.
Abessalom (2005-06-05 04:41:00) [7]
> DrPass © (05.06.05 02:32) [10]
..зря этот код в функцию засунул...
Есть неопределенное количество функций (Ворланд), результатом выполнения которых является объект, созданный внутри такой функции. Примеров можно найти много, NewItem, NewMenu... Не вижу аргументов...
DrPass (2005-06-05 02:32:00) [8]На самом деле ты вообще зря этот код в функцию засунул. Где тебе надо иконку использовать, там и пиши
Icon:=TIcon.Create;
Icon.Handle:=ExtractIcon(Handle,PChar(ini.ReadString(TS.Items[i],'Icon','')),0);
А уже после того, как использовал - Icon.Free
lookin (2005-06-05 02:31:00) [9]MyIcon.Free
alex-drob (2005-06-05 01:25:00) [10]А как?
lookin (2005-06-05 01:21:00) [11]А не проще Result после применеия уничтожать?
alex-drob (2005-06-05 01:15:00) [12]Последняя строка выполняется, но функция возвращает Result только по оканчании выполнения последней строки. Возникает ошибка, я понимаю что это из за того что icon уже уничтожен. Можно ли как нибудь уничтожить объект после выполнения функции.
Германн (2005-06-05 00:14:00) [13]Последняя строка выполнится гарантировано только, если включить ее в try...finally.
alex-drob (2005-06-05 00:11:00) [14]Спасибо!
lookin (2005-06-05 00:08:00) [15]Ну, как мне кажется, функция завершается все-таки по окончании ее описания, т.е. до End
alex-drob (2005-06-05 00:03:00) [16]Я просто не знаю когда функция завершается,когда до End доходит или result
lookin (2005-06-04 23:58:00) [17]А почему нет?