Перейти к содержанию
  • Регистрация
  • 0
Steepe_Hare

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

Вопрос

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

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

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

 

Snap1.jpg

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


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

Рекомендуемые сообщения

  • 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
1 минуту назад, Steepe_Hare сказал:

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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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
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.

 

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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

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

×
×
  • Создать...