• 0
Steepe_Hare

Окно "Настройки"

Вопросы

Интересно, а как было создано окно Options в Embarcadeo RAD Studio?

Понятно, что слева TTreeView, а справа TPanel с компонентами. Но что происходит при выделении узла в дереве?
Все компоненты, лежащие на панели, удаляются и динамически создаются новые?
Если так, то как проектировали расположение в desigh-time?

Сначала экспериментировали, кидая их на форму, затем (когда согласовали их расположение) записывали их порядок и позицию и в процедуре смены узла в дереве восстанавливали всё это?

 

Snap1.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 ответ на этот вопрос

  • 0

Я бы сделал правую часть на фреймах.
А левая часть заполнялась бы автоматом наименованиями фреймов, которые зарегистрировались в окне настроек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 минут назад, kami сказал:

Я бы сделал правую часть на фреймах.
А левая часть заполнялась бы автоматом наименованиями фреймов, которые зарегистрировались в окне настроек.

а в чем преимущество фреймов над панельками?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
6 минут назад, Steepe_Hare сказал:

а в чем преимущество фреймов над панельками?

1. Фреймы просто создавать динамически, в рантайме. Панельки с содержимым обычно накидывают на саму форму. С учетом кучи пунктов опций - получается гигантская каша, в которой без 100 грамм не разберешься.

2. Каждый фрейм - в отдельном модуле. Очень просто искать, редактировать, править функционал и при необходимости - удалять. В отличие опять-таки от этих панелек. Только не надо сами фреймы кидать на форму, как это делается с другими визуальными компонентами!

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 минуты назад, Steepe_Hare сказал:

а в чем преимущество фреймов над панельками?

фрейм = отдельный модуль, в который будет отрабатывать логику работы именно с этим фреймом. не захламляется код основного модуля

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В общем, получается отличненькая такая структура. Стройная, без кучи навесного и лишнего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 минут назад, kami сказал:

1. Фреймы просто создавать динамически, в рантайме. Панельки с содержимым обычно накидывают на саму форму. С учетом кучи пунктов опций - получается гигантская каша, в которой без 100 грамм не разберешься.

2. Каждый фрейм - в отдельном модуле. Очень просто искать, редактировать, при необходимости - удалять. В отличие опять-таки от этих панелек. Только не надо сами фреймы кидать на форму, как это делается с другими визуальными компонентами!

"Панельки с содержимым обычно накидывают на саму форму. С учетом кучи пунктов опций - получается гигантская каша, в которой без 100 грамм не разберешьс"

а что мешает в ран-тайме удалять с панельки компоненты и добавлять туда. Не вижу разницы с фреймом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Только что, Steepe_Hare сказал:

что мешает в ран-тайме удалять с панельки компоненты и добавлять туда. Не вижу разницы с фреймом

хм... ну сравните:
 

lbOptionCaption:=TLabel.Create(Panel);

lbOptionCaption.Parent:=Panel;

lbOptionCaption.Text:='some option';

cbOption1:=TCheckBox.Create(Panel);

cbOption1.OnChecked:=....

cbOption1.Caption:='asdfasdf';

...

с этим:
 

< накидали контролов на фрейм>

fr:=TOptionsFrame.Create(Panel);

fr.Parent:=Panel;

И ВСЁ! Весь функционал реализуется внутри модуля фрейма. НЕЗАВИСИМО от всего остального.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Нет, конечно вы можете сделать свой компонент на основе панели, в нем реализовать нужный функционал, зарегистрировать его в IDE,.. но зачем переусложнять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, Steepe_Hare сказал:

А Embarcadero всё-таки TPanel в окне Options использует ;-)

Кто вам такое сказал?

Может, этот Panel лежит на фрейме? Или наоборот - любой фрейм ложится на этот Panel. Я бы так и сделал: TreeView.Align = alLeft, Panel.Align = alClient. И на панельку в рантайме ложатся все фреймы. По необходимости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 минут назад, Brovin Yaroslav сказал:

Там не все так просто в Options ;-)

так загадочно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Steepe_Hare сказал:

так загадочно

Когда я заглядывал туда, там было не так, как вы написали. А при условии, что можно свои мастера писать и страницы с настройками. То понятно, что там ничего не зашито :)

Если бы был бы код сейчас под рукой, я бы вам расшифровал. Но обычно, для таких сложных настроек используют фреймы + механизмы для регистрации своих страничек настроек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

MouseHook в правой части TPanel показывает.

А зачем страничку настройки еще регистрировать??

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 минуты назад, Steepe_Hare сказал:

MouseHook в правой части TPanel показывает.

А зачем страничку настройки еще регистрировать??

Вы делаете систему плагинов. У вашего плагина есть ряд настроек. Все настройки в вашей системе находятся в одном месте. Вам нужно сделать так, чтобы любой плагин мог свои настройки показать в этом окне. Вопрос, как бы вы тогда сделали окно настроек, если вы не знаете, какие настройки там будут?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, Brovin Yaroslav сказал:

Вопрос, как бы вы тогда сделали окно настроек, если вы не знаете, какие настройки там будут?

 

45 минут назад, kami сказал:

фреймов, которые зарегистрировались в окне настроек.

Да! Я знал, что мыслю в нужном направлении :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, kami сказал:

хм... ну сравните:
 


lbOptionCaption:=TLabel.Create(Panel);

lbOptionCaption.Parent:=Panel;

lbOptionCaption.Text:='some option';

cbOption1:=TCheckBox.Create(Panel);

cbOption1.OnChecked:=....

cbOption1.Caption:='asdfasdf';

...

с этим:
 


< накидали контролов на фрейм>

fr:=TOptionsFrame.Create(Panel);

fr.Parent:=Panel;

И ВСЁ! Весь функционал реализуется внутри модуля фрейма. НЕЗАВИСИМО от всего остального.

fr сделать глобальной переменной и при щелчке на узле дерева:

  if (fr <> nil) then
    fr.Free;
  fr := TOptionsFrame.Create(Panel);
  fr.Parent := Panel;

 

Так норм?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

глобальные переменные желательно не использовать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
12 минут назад, wamaco сказал:

глобальные переменные желательно не использовать

а как убить предыдущий фрейм, чтобы освободить память?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

использовать приватную переменную "текущий фрейм"

или - проходить по всем детям Panel и убивать их.

Про глобальные переменные забудьте!

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Steepe_Hare сказал:

if (fr <> nil) then
    fr.Free;

1. как уже отметили fr - это поле формы

2. вместо fr.free нужно freeAndNil(fr);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, Steepe_Hare сказал:

if (fr <> nil) then
    fr.Free;

излишне. Достаточно fr.Free;

А вот на мобильных платформах это ничего не даст. Там нужно fr.Release; и вот в таком случае проверка на nil будет уместна.

Да и на десктопе тоже, для универсализации.

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 минут назад, kami сказал:

излишне. Достаточно fr.Free;

А вот на мобильных платформах это ничего не даст. Там нужно fr.Release; и вот в таком случае проверка на nil будет уместна.

Да и на десктопе тоже, для универсализации.

читал, что под Андроидом нужно DisposeOf делать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
8 часов назад, Steepe_Hare сказал:

читал, что под Андроидом нужно DisposeOf делать

Я думаю, что это выдернутая из контекста фраза, которая врезалась вам в память.

DisposeOf можно делать где угодно, а не обязательно под андроидом. Также где угодно можно вызывать напрямую деструктор, т.е. myObject.Destroy

Но лучше использовать Release / Free (FreeAndNil).

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, kami сказал:

Также где угодно можно вызывать напрямую деструктор, т.е. myObject.Destroy

Ярослав говорил

P.S. Никогда не вызывайте деструктор напрямую, вызовом метода Destroy.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу