Как пользоваться TFrame
Модератор: Модераторы
Как пользоваться TFrame
Как я понимаю при помощи компонента TFrame можно реализовать следующий принцип компоновки окна:
Справа формы узкая полоса с кнопками, при нажатии на любую из кнопок левая часть формы целиком заменяется (такое часто встречается в различных программах, очень удобно, логично, понятно).
Создал новый проект, создал для эксперимента 2 фрейма... что с этим делать дальше немогу понять. Помогите пожалуйста разобраться.
Справа формы узкая полоса с кнопками, при нажатии на любую из кнопок левая часть формы целиком заменяется (такое часто встречается в различных программах, очень удобно, логично, понятно).
Создал новый проект, создал для эксперимента 2 фрейма... что с этим делать дальше немогу понять. Помогите пожалуйста разобраться.
Для подобных вещей иногда проще пользоваться чем-то вроде TNotebook или TTabSheet при ShowTabs:=False; - можно ложит компоненты на разные вкладки и программно их переключать..
TFrame тоже можно использовать для этого, особенно если хочеться разделить по разным модулям функционал разных интерфейсов, или эти интерфейсы используються где-то ещё.
Дальше надо либо создавать эти фреймы программно при щелчках по кнопкам той главной формы, либо набросать их на форму заранее (на странице Standart выбрать компонент TFrame) и только менять им в зависимости от ситуации свойство Visible. Кстати этот метод ещё иногда глюкавит в Лазарусе (например после правки оригинального фрейма изменения не отображаються в том что лежит на форме, надо или пересоздавать или я не понял чего-то)...
TFrame тоже можно использовать для этого, особенно если хочеться разделить по разным модулям функционал разных интерфейсов, или эти интерфейсы используються где-то ещё.
Создал новый проект, создал для эксперимента 2 фрейма... что с этим делать дальше немогу понять. Помогите пожалуйста разобраться.
Дальше надо либо создавать эти фреймы программно при щелчках по кнопкам той главной формы, либо набросать их на форму заранее (на странице Standart выбрать компонент TFrame) и только менять им в зависимости от ситуации свойство Visible. Кстати этот метод ещё иногда глюкавит в Лазарусе (например после правки оригинального фрейма изменения не отображаються в том что лежит на форме, надо или пересоздавать или я не понял чего-то)...
Я создал два фрейма через "Файл=>Создать=>Фрейм", таким образом у меня в проекте одна форма и 2 фрейма... можно поподробнее как выводить фреймы на форму и как вообще ими управлять, я с этим вообще не знаком.
Да, но мне не нравится то что по крайней мере в виндовс невозможно полностью ликвидировать бордер компонентов TNotebook и TTabSheet.
Для подобных вещей иногда проще пользоваться чем-то вроде TNotebook или TTabSheet при ShowTabs:=False; - можно ложит компоненты на разные вкладки и программно их переключать..
Да, но мне не нравится то что по крайней мере в виндовс невозможно полностью ликвидировать бордер компонентов TNotebook и TTabSheet.
Как только вы создали фрейм, кидайте компанент на форму с палитры. Появится список доступных фреймов.qivi писал(а):Я создал два фрейма через "Файл=>Создать=>Фрейм", таким образом у меня в проекте одна форма и 2 фрейма... можно поподробнее как выводить фреймы на форму и как вообще ими управлять, я с этим вообще не знаком.
Погуглите использование фреймов в Delphi.
Вот например http://www.beluch.ru/progr/100comp/7_7.htm
Добавлено спустя 10 минут 7 секунд:
FedeX писал(а): и только менять им в зависимости от ситуации свойство Visible.
Так не хорошо получится. А если у меня их несколько десятков? Не создавать же мне их при запуске и не держать в памяти? Именно нужно программно создавать и выгружать.
Так не хорошо получится. А если у меня их несколько десятков? Не создавать же мне их при запуске и не держать в памяти? Именно нужно программно создавать и выгружать.
Я же и говорю - тут в зависимости от ситуации, мне, например, в текущем проекте важно быстро переключаться между фреймами, а на скорость загрузки содержащей их формы можно не обращать внимания, так что ваш вариант не подходит.
Вот ведь бывает так... откладываеш, откладываеш какой то интересующий тебя вопрос, ну вроде сложный, ну вроде надо на свежую голову, время подходящее, момент удачный... а как доходит до сути 15 минут и вопрос яйца выеденного не стоит...
А как создавать и управлять ими программно?
Добавлено спустя 23 часа 53 минуты 26 секунд:
Ну поделитесь пожалуйста страшной тайной!
Так не хорошо получится. А если у меня их несколько десятков? Не создавать же мне их при запуске и не держать в памяти? Именно нужно программно создавать и выгружать.
А как создавать и управлять ими программно?
Добавлено спустя 23 часа 53 минуты 26 секунд:
qivi писал(а):Так не хорошо получится. А если у меня их несколько десятков? Не создавать же мне их при запуске и не держать в памяти? Именно нужно программно создавать и выгружать.
А как создавать и управлять ими программно?
Ну поделитесь пожалуйста страшной тайной!
Код: Выделить всё
sf:=TSomeFrame.Create(MyForm);
sf.parent:=MyForm;не?
FedeX писал(а):Код: Выделить всё
sf:=TSomeFrame.Create(MyForm);
sf.parent:=MyForm;
не?
А можно поподробнее... так сказать для чайника
То есть создаю я их по прежнему в редакторе форм, а вызываю в коде... или нет? Как определяется её расположение на форме? Как её убить (что б памянь не занимала) после использования?
Последний раз редактировалось qivi 21.01.2010 17:19:00, всего редактировалось 1 раз.
а что именно не понятно/не получаеться?
Блин... я о том же подумал и тот пост подредактировал...
То есть создаю я их по прежнему в редакторе форм, а вызываю в коде... или нет? Как определяется её расположение на форме? Как её убить (что б память не занимала) после использования?
>То есть создаю я их по прежнему в редакторе форм, а вызываю в коде
да
>Как определяется её расположение на форме?
свойства Top, Left (как любой другой компонент)
>Как её убить (что б память не занимала) после использования?
тоже как любой другой компонент: методом Free
да
>Как определяется её расположение на форме?
свойства Top, Left (как любой другой компонент)
>Как её убить (что б память не занимала) после использования?
тоже как любой другой компонент: методом Free
Код: Выделить всё
sf:=TSomeFrame.Create(MyForm);
sf.parent:=MyForm;
А это её вызов? (У меня просто на работе нет лазаруса, ща до дому дойду буду эксперементировать)
>Как её убить (что б память не занимала) после использования?
тоже как любой другой компонент: методом Free
Уже неудобно спрашивать... но всё же... а как это выглядит? (не разу не пользовался)
Вот, скорее сделать чем что-то рассказывать...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
FedeX. огромное тебе спасибо за помощь, а главное наверно за терпение.
Назрел ещё один вопрос, правдо не по использованию фреймов а по принципам их работы, возможно даже по принципам работы методов языка.
После компиляции и запуска твоего примера, я отследил его процес в системном мониторе, понаблюдал за работой с памятью... получается не совсем то что я ожидал. Программа запустивщись заняла (под рукой нет реальных цифр, возьму условно) 4500 Кб, после того как я нажал кнопку "вывыести/скрыть" фрейм, следовательно отработал код:
Занятая память увеличилась до 5200 Кб, ну всё понятно фрейм загружен в память...
Повторное нажатие кнопки, отробатывает код:
Фрейм исчезает, но память по прежнему остаётся на отметки 5200!!! По существу вопроса между методом свалки на форму всех фреймов и регулирование их свойством визибле и методом програмного управления, вобщемто нет значительной разницы... уже давно заметил что точно так же происходит работа с памятью в многооконных приложениях на лазарусе...
Существует ли какой то стандартный метод, который будет убивать в памяти отроботавший модуль (окно, фрейм)? Если нет, то нет ли его в планах развития Лазарус/ФПЦ?
Назрел ещё один вопрос, правдо не по использованию фреймов а по принципам их работы, возможно даже по принципам работы методов языка.
После компиляции и запуска твоего примера, я отследил его процес в системном мониторе, понаблюдал за работой с памятью... получается не совсем то что я ожидал. Программа запустивщись заняла (под рукой нет реальных цифр, возьму условно) 4500 Кб, после того как я нажал кнопку "вывыести/скрыть" фрейм, следовательно отработал код:
Код: Выделить всё
fr:=TFrame1.Create(self);
fr.Parent:=self;Занятая память увеличилась до 5200 Кб, ну всё понятно фрейм загружен в память...
Повторное нажатие кнопки, отробатывает код:
Код: Выделить всё
FreeAndNil(fr);Фрейм исчезает, но память по прежнему остаётся на отметки 5200!!! По существу вопроса между методом свалки на форму всех фреймов и регулирование их свойством визибле и методом програмного управления, вобщемто нет значительной разницы... уже давно заметил что точно так же происходит работа с памятью в многооконных приложениях на лазарусе...
Существует ли какой то стандартный метод, который будет убивать в памяти отроботавший модуль (окно, фрейм)? Если нет, то нет ли его в планах развития Лазарус/ФПЦ?
qivi
Это не проблемы Лазаруса, это система так кеширует память. В системе есть что-то вроде определителя пиков памяти для каждого приложения, это нужно видимо для кеширования памяти для каждого приложения и следовательно ускорения его работы. В Вин7 уже не наблюдаю, но в ВинХР вроде-бы этот кеш очищался при сворачивании приложения...
Разница между способами есть и она в том, что если ты сразу создаш 100 одинаковых фреймов то у тебя памяти уйдёт на 100 одинаковых фреймов, а если ты создаш один фрейм, потом его уничтожиш и создаш второй, то он займёт память первого. В итоге твоё приложение (условно) будет требовать в сто раз меньше памяти. Другое дело если бы при кликаньи на кнопку в моей демке память всё увеличивалась и увеличивалась - это уже явная утечка памяти и о таких вещах надо сообщать в багтрекер.
Это не проблемы Лазаруса, это система так кеширует память. В системе есть что-то вроде определителя пиков памяти для каждого приложения, это нужно видимо для кеширования памяти для каждого приложения и следовательно ускорения его работы. В Вин7 уже не наблюдаю, но в ВинХР вроде-бы этот кеш очищался при сворачивании приложения...
Разница между способами есть и она в том, что если ты сразу создаш 100 одинаковых фреймов то у тебя памяти уйдёт на 100 одинаковых фреймов, а если ты создаш один фрейм, потом его уничтожиш и создаш второй, то он займёт память первого. В итоге твоё приложение (условно) будет требовать в сто раз меньше памяти. Другое дело если бы при кликаньи на кнопку в моей демке память всё увеличивалась и увеличивалась - это уже явная утечка памяти и о таких вещах надо сообщать в багтрекер.
