Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Все строки функции выполнятся? [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]

А почему нет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо