Видимо у вас какая-то старая версия, вот у вас и не выходит.
Не выходит оно - у ВАС. Просто вы, походу, не понимаете что такое "повторное использование кода".
Мне легко это показать на примере, который вы же и приводили и который лежит у вас в репозитории:
А именно вот этот:
// листинг 1
TFormHipparcos* FormHipparcos;
FormHipparcos = new TFormHipparcos(this);
try {
FormHipparcos->ShowModal();
} __finally
{
FormHipparcos->Free();
}
этот код - чисто абракадабровский, ибо в стандарте языка нет __finally
Портируемая версия, которая делает аналогично, выглядит так,
если делать ее правильно// листинг 2
TFormHipparcos* FormHipparcos = 0; // инициализация указателя обязательна для аккуратного кода!
try
{
FormHipparcos = new TFormHipparcos(this); // new вызываем внутри try
FormHipparcos->ShowModal();
FormHipparcos->Free();
}
catch ( std::bad_alloc& )
{
throw; // нет тут очистки ибо new не отработал
}
catch ( ... ) // очистка только если new и конструктор прошел правильно
{
FormHipparcos->Free();
throw;
}
Как видно - там стоит thow - это функциональный аналог того, что написано у вас - блок try не ловит исключения в вашем коде, поэтому тут мы их и перебрасываем коль поймали.
А повторное использование кода - это то, что аналогичный сценарий, как в листинге 1 у вас используется в
нескольких обработчиках: код идентичен с точностью до типов.
В конце 90-х на С++ я бы тупо использовал препроцессор:
// листинг 3
#define DO_FORM (T,pThis) T* ptrT = 0; \
try \
{ \
ptrT = new T(pThis); \
ptrT->ShowModal(); \
ptrT->Free(); \
} \
catch ( std::bad_alloc& ) \
{ \
throw; \
} \
catch ( ... ) \
{ \
ptrT->Free(); \
throw; \
}
и тогда обработчики форм выглядели бы так:
// листинг 4
SomeForm::SomeHandler ( SomeParams )
{
DO_FORM (FormHipparcos,this)
}
// ... сколько угодно типовых обработчиков
SomeForm::SomeHandlerN ( SomeParams )
{
DO_FORM (FormClassN,this)
}
все! в обработчике одна строчка и повторное использование кода.
Копи-пастом я бы не занимался.
Можно возразить, что это нехорошо для С++, макросы использовать. Но уже средства C++
2003 позволяют сделать шаблонный класс чтобы сделать вот так:
// листинг 5
SomeForm::SomeHandler ( SomeParams )
{
TFormProcessor<SomeForm,FormHipparcos>(this).Do();
}
// ... сколько угодно типовых обработчиков
SomeForm::SomeHandlerN ( SomeParams )
{
TFormProcessor<SomeForm,FormClassN>(this).Do();
}
Одна строчка!
Ну или хотя бы так
// листинг 6
SomeForm::SomeHandler ( SomeParams )
{
TFormProcessor<SomeForm,FormHipparcos> aProcessor(this);
aProcessor.Do()
}
Дельфи имеет дженерики ? - да, имеет.
Он позволят сделать повторное использование кода в стиле листинг 6 - да, позволяет.
Вы это используете ? - нет, вы копи-пастите.
И к слову - про try _finally что у вас: в реале блок try в целом не ловит никаких исключений и _finally работает перед закрытием приложения - так как только на его уровне есть перехват исключений. Вы мне можете возразить "у меня ничего не падает"
Ну так с "у меня ничего не падает" без потри общности можно написать для хобби проекта еще проще, а именно вот так
// листинг 7
SomeForm::SomeHandler ( SomeParams )
{
TFormHipparcos* FormHipparcos = new TFormHipparcos(this);
FormHipparcos->ShowModal();
FormHipparcos->Free();
}
и скорее всего у вас ровно также "ничего падать не будет"
