1

Тема: C++ та форми і фрейми

Добридень.
Е задача по переведенню кода із Delphi на C++Builder.
Як правильно створювати та видаляти форми/фрейми ?

TForm* form = new TForm1();
....
delete form;

чи через розумні вказівники

std::unique_ptr<TForm*> form(new TForm1);
........


чи потрібно видалення?

delete form;

Теж саме і по фреймах?

І таке питання  - якщо є декілька  фреймів і в них буде один батьківський об'єкт - чи потрібно видаляти
фрейм, який вже не використовується?

TFrame* frame1 = new TFrame1();
frame1->Parent = Panel1;
.....
delete frame1;
TFrame* frame2 = new TFrame2();
frame2->Parent = Panel1;

Дякую

2

Re: C++ та форми і фрейми

antarey написав:

Добридень.
Е задача по переведенню кода із Delphi на C++Builder.

Якщо паралельно буде конвертація VCL -> FMX, то ок. Якщо міняється лише мова, то це даремна витрата часу.

antarey написав:

Як правильно створювати та видаляти форми/фрейми ?

TForm* form = new TForm1();
....
delete form;

Отак і правильно. Розумні вказівники не раджу, бо у VCL є свої власні механізми керування пам'яттю. Якщо їх поєднати з усілякими хитрими вказівниками, то можна отримати багато дуже цікавих багів.

antarey написав:

І таке питання  - якщо є декілька  фреймів і в них буде один батьківський об'єкт - чи потрібно видаляти
фрейм, який вже не використовується?

TFrame* frame1 = new TFrame1();
frame1->Parent = Panel1;
.....
delete frame1;
TFrame* frame2 = new TFrame2();
frame2->Parent = Panel1;

Дякую

Це залежить від ваших потреб. Якщо на фреймах немає нічого важкого, а лише кілька кнопок і чекбоксів, то видаляти немає сенсу. В будь-якому випадку, коли ви будете видаляти Panel1, він сам видалить усі дочірні фрейми, які ще лишились.

Подякували: antarey1

3

Re: C++ та форми і фрейми

Вітаю на форумі.

antarey написав:

Е задача по переведенню кода із Delphi на C++Builder.

Це виглядає не дуже адекватно. Є крива бібліотека (VCL) під Delphi (мову). Є її використання з мовою C++ (C++ Builder). Вам треба перекласти код на Delphi у C++, але не позбутися кривої бібліотеки, орієнтованої на Delphi. У чому сенс? C++ Builder, до речі, вміє і з Delphi працювати, можете просто додати файли в проєкт.
Можете пояснити, як така задача виникла?

antarey написав:

Як правильно створювати та видаляти форми/фрейми ?

Так, як зручно особисто вам.
Якщо задача саме перекласти - то це Create/Release=>new/...Release+delete. Використовувати одразу delete на об'єктах не радять, бо Release чекає на завершення всіх процесів, пов'язаних з дочірніми елементами, а delete видаляє одразу.
Звісно, можна позбутися delete за допомогою розумних вказівників, але тоді буде купа проблем із вказівниками в бібліотечних функціях: наприклад, форми видаляють всі свої елементи при видаленні, розумні вказівники намагатимуться зробити те саме.
І unique_ptr - це досить специфічна ситуація, коли об'єкт належить тільки одному батьківському об'єкту, але при цьому не може бути його елементом, загалом краще shared_ptr використовувати.

antarey написав:

- чи потрібно видаляти фрейм, який вже не використовується?

Загалом так, але це може зробити і батьківський фрейм. Конкретно в цьому коді ви видаляєте компонент фрейму, і при цьому він і припиняє використовуватися.

Подякували: leofun01, antarey2

4

Re: C++ та форми і фрейми

Torbins написав:

Якщо паралельно буде конвертація VCL -> FMX

Так, буде конвертація на FMX.
Для FMX логіка така ж?

5

Re: C++ та форми і фрейми

Для FMX якраз Release не потрібен, але це все одно мастурбація.

6

Re: C++ та форми і фрейми

В сенсі переробляти код?

7

Re: C++ та форми і фрейми

У сенсі з Delphi на Builder.

8

Re: C++ та форми і фрейми

antarey написав:

Так, буде конвертація на FMX.
Для FMX логіка така ж?

Так.

koala написав:

Для FMX якраз Release не потрібен, але це все одно мастурбація.

В принципі, як варіант глибокого рефакторінгу, може бути.

9

Re: C++ та форми і фрейми

Останнє питання.
Батьківський контрол для фрейма в динаміці краще TFrame чи якась панелька?

10

Re: C++ та форми і фрейми

Залежить від того, чи потрібна вам рамка довкола дочірнього фрейма. Якщо потрібна - то панелька, в іншому випадку можна фрейм, або взагалі прямо на форму класти.