Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Cha1000000
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 204
Записей в блоге: 1
#1

"Резиновая вёрстка" в С++ Builder. Как организовать пропорциональное изменение дизайна окон и их компонентов - C++ Builder

19.06.2017, 12:43. Просмотров 430. Ответов 8
Метки нет (Все метки)

Всем добрый день!
Возник вопрос, который, думаю, многим, особенно начинающим разработчикам, будет полезен и интересен.
Как в билдере 5,6 следует делать, так называемый, "резиновый" дизайн окон и компонентов внутри них?
Т.е. каким свойствам компонентов (контроллов), какие значения следует задавать, что бы при изменении размера окна (или разворачивании во весь экран и возвращении в исходное состояние), размеры этих контроллов и их положение в окне изменялись равномерно и пропорционально?
Пожалуйста все советы, материалы, статьи и, конечно же, образцы проектов с реализацией этого вопроса (по возможности), размещайте в этой теме. Товарищи коллеги, делимся информацией, мнениями, обсуждаем варианты...
Всем заранее спасибо за участие!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2017, 12:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос "Резиновая вёрстка" в С++ Builder. Как организовать пропорциональное изменение дизайна окон и их компонентов (C++ Builder):

Вывести количество дней "К" и суммарный пробег "S" С++ Builder XE4 (визуальный режим) - C++ Builder
доброй ночи, уважаемые программисты, студенты-отличники, успевающие школьники, а также все любители программирования. помогите, пожалуйста,...

Как сделать окно "поверх всех окон"... - C++ Builder
Как сделать так, чтобы окно содавалось поверх других окон?

Организовать тест с ответами "А" или "Б" - C++ Builder
Здравствуйте, подскажите пожалуйста, мне нужно сделать тест,чтобы ответ выводился по большему количеству выбранных ответов "А" или...

Как в C++ Builder 6 в строке символ \ "превратить" в \\ - C++ Builder
Столкнулся с одной проблемой: Мне надо копировать файл из той папки, где находится приложение функция CopyFile понимает только пути...

Аналог "#region" и "#endregion" в C++ Builder - C++ Builder
Подскажите пожалуйста, есть ли аналог #region и #endregion в C++ Builder? P.S. Регион используется в Delphi и C# для сворачивания...

Как запретить удаление\изменение элементов ":" в поле Edit1 - C++ Builder
Всем привет. проблема вот в чем необходимо запретить удаление элементов ":" в поле Edit, причем что бы остальные елементы, можно было бы...

8
Почтальон
Модератор
565 / 504 / 91
Регистрация: 22.03.2015
Сообщений: 3,544
Завершенные тесты: 1
19.06.2017, 13:14 #2
Делается это масштабированием в обработчике формы - при изменении размеров. Вычисляется коэффициент, с помощью которого "масштабируются" остальные элементы формы.
0
Cha1000000
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 204
Записей в блоге: 1
19.06.2017, 14:27  [ТС] #3
Цитата Сообщение от Почтальон Посмотреть сообщение
Делается это масштабированием в обработчике формы
Вот с этого места, как говорится, по подробнее. Если можно примеры кода?
В свою очередь приведу пример своей попытки поступить, предлагаемым вами способом. Пока что в нём что-то не учтено, что-то не доработано, ибо при масштабировании с каждым разом изменения размера окна и возвращения в исходное состояние, контроллы "плывут" по форме (кажется, "уплывая" в левую часть окна).
Может как раз вы и на основе моего кода, не приводя, запрошенные выше примеры, сможете поправить, что не так и получится неплохой(наглядный) пример, заявленному вами способу?

Кратко о том, что я пытался сделать:
В окне программы имеется несколько Эдитов и Комбобоксов. Задача: собственно настроить их пропорциональное изменение ширины при увеличении/уменьшении размера окна.
Собственно код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Tfm_Nastroi *fm_Nastroi;
int DefWith;
float K=1, K1=1;//коэф-ты пропорц. размеров окна
//---------------------------------------------------------------------------
void __fastcall Tfm_Nastroi::FormCreate(TObject *Sender)
{
   int i = 0;
   //Запоминаем ширину окна в его начальном состоянии
   DefWith = fm_Nastroi->Width;
}
//---------------------------------------------------------------------------
void __fastcall Tfm_Nastroi::FormResize(TObject *Sender)
{
   if (this->Width > DefWith)//При увеличении размеров окна
   {
      K = this->Width/static_cast<float>(DefWith);
      K1 = K;
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TComboBox" ) )
           static_cast<TComboBox*>( this->Components[i] )->Width = K * static_cast<TComboBox*>( this->Components[i] )->Width;
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TEdit" ) )
           static_cast<TEdit*>( this->Components[i] )->Width = K * static_cast<TEdit*>( this->Components[i] )->Width;
   }
   if (this->Width == DefWith) //При возврате размеров окна
   {
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TComboBox" ) )
           static_cast<TComboBox*>( this->Components[i] )->Width = static_cast<TComboBox*>( this->Components[i] )->Width/K1;
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TEdit" ) )
           static_cast<TEdit*>( this->Components[i] )->Width = static_cast<TEdit*>( this->Components[i] )->Width/K1;
   }
}
//---------------------------------------------------------------------------
0
TFullControl
312 / 310 / 137
Регистрация: 20.10.2016
Сообщений: 1,004
19.06.2017, 16:32 #4
Цитата Сообщение от Почтальон Посмотреть сообщение
Вычисляется коэффициент, с помощью которого "масштабируются" остальные элементы формы.
Это еще зачем? Речь о резиновой форме, а не о пропорциональном масштабировании формы.Cha1000000, Используйте свойство Align, Anchors и обрабатывайте OnResize формы, при необходимости.
0
Cha1000000
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 204
Записей в блоге: 1
19.06.2017, 16:44  [ТС] #5
Цитата Сообщение от TFullControl Посмотреть сообщение
Речь о резиновой форме, а не о пропорциональном масштабировании формы
Обсуждению этого варианта в этой теме так же допустим
о и лишним не будет. ;-)
Цитата Сообщение от TFullControl Посмотреть сообщение
Используйте свойство Align, Anchors
Да, эти свойства, я тоже периодически использую в дизайне окна. Однако в данном случае, почему-то их применение не помогает. Если задать привязку к левой стороне, то элементы ввода при увеличении размера окна, да, расширяются тоже, и при возврате в дефолтное состояние окна, остаются на своих начальных местах и всё, вроде бы нормально, но при развороте окна в полный экран, эти элементы не размещаются в окне равномерно пропорционально изменению его размера. а остаются как бы прижатыми к левой стороне, лишь изменив ширину. При попытке привязать к правой стороне, если сейчас мне не изменяет память, тоже ничего дельного не произошло. А при привязке и к левой и к правой, их слишком сильно "размазывает" по окну... Такие широкие элементы ввода мне не нужны в данном окне...
0
TFullControl
312 / 310 / 137
Регистрация: 20.10.2016
Сообщений: 1,004
19.06.2017, 16:57 #6
Цитата Сообщение от Cha1000000 Посмотреть сообщение
Если задать привязку к левой стороне,
Привязывайте ко всем сторонам, тогда он жестко привяжется к каждой из сторон. Так же есть свойство Margins это отступы которые работают при использовании Align но надо не забывать задавать AlignWithMargins = true, а если с масштабом играться хотите, то лучше запретить пользователю масштабировать окно мышкой и сделать что-то типа ползунка в офисе, и привязать его к ScaleBy().
0
Cha1000000
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 204
Записей в блоге: 1
20.06.2017, 11:07  [ТС] #7
Цитата Сообщение от TFullControl Посмотреть сообщение
Привязывайте ко всем сторонам
тогда контролы (например при разворачивании во весь экран) "размазывает" по окну и они становятся слишком здоровым. Хотя попробую еще поиграться, учитывая вашу подсказку:
Цитата Сообщение от TFullControl Посмотреть сообщение
надо не забывать задавать AlignWithMargins = true
Добавлено через 16 часов 28 минут
Цитата Сообщение от TFullControl Посмотреть сообщение
Так же есть свойство Margins это отступы которые работают при использовании Align
Эмм... А вы это о каком билдере говорите? На 6м посмотрел, свойство Align увидал только у самой формы, а Margin у кнопок, но у Эдитов и Комбобоксов ни того не другого не обнаружил...
0
Cha1000000
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 204
Записей в блоге: 1
20.06.2017, 12:45  [ТС] #8
В общем набросал тестовый пример формы с компонентами, которые хотелось бы пропорционально расширять и сужать. На ней можно посмотреть проблемы, о которых я писал выше. Проект на Builder 6.
0
Вложения
Тип файла: zip TestProp.zip (786.6 Кб, 5 просмотров)
Cha1000000
2 / 2 / 1
Регистрация: 04.06.2015
Сообщений: 204
Записей в блоге: 1
29.06.2017, 11:19  [ТС] #9
Всем добрый день, коллеги!
Пара слов от автора темы.
Данная тема, была мною создана, не только лишь с целью получить ответы на собственный вопрос(ы), но и в качестве полезной другим (особенно начинающим) программистам, у кого могли (могут) возникнуть подобные ситуации и вопросы.
А по сему помимо моей просьбы (в первом сообщении) делиться мнениями, предложениями, примерами исходников и т.п. я и сам поделюсь (и постараюсь далее делиться, по мере поступления) решением одной задачи, так называемого, "резинового дизайна". Дело в том, что в поисках примеров или какого-то решения этой задачи (описание далее), во всевозможных темах, коем-либо образом возможно связанных с (хотя бы подобной) задачей, я так ничего дельного и не нашел. По этому считаю не лишним поделиться своим решением. Кстати, кто посчитает, что этот способ не особо "красивый" и костыльный, милости прошу внести свои предложения по более оптимальному решению задачи.

И так, собственно задача:

Имеем StringGrid (ну например размером: 10 колонок, на 9 строк, это не суть). В нем по одному фиксированному столбцу и строке (нулевой столбец и нулевая строка). Ширина столбцов у всех разная, задавалась в ручную в свойствах обджект инспектора грида. В свойстве Anchors грида выставлена привязка к верхнему, левому и правому краям формы.
Хотелось сделать так, чтоб при развороте окна в полноэкранный режим и сворачивании в минимальный, при такой привязке (Anchors) ширина Грида автоматически и пропорционально тоже растягивалась, однако на деле при таких действиях, ширину меняет только основная граница всего компонента StringGrid, ширина же столбцов в ней оставалась неизменной, а при увеличении ширины формы после крайнего столбца лишь добавлялось пустое белое пространство...

В общем, может через чур заморочился (хотя кода и так не много вышло), может есть и проще и "красивее" варианты решения, но тем не менее предлагаю следующий вариант решения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
float DefFmWidth; //Начальная ширина окна
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   DefFmWidth = this->Width;
}
//---------------------------------------------------------------------------
int SG_WidthCalc()//расчёт суммы "ширин" столбцов
{
   int W = 0;
   for (int i = 0; i < Form1->sg_Grid->ColCount; i++)
       W += Form1->sg_Grid->ColWidths[i];
   return W;
}
 
void __fastcall TForm1::FormResize(TObject *Sender)
{
   int i;
   if (this->Width > DefFmWidth)//При увеличении размера окна
   {
      while(SG_WidthCalc() < sg_Grid->Width)
      {
         for (i = 1; i < sg_Grid->ColCount; i++)
            sg_Grid->ColWidths[i]++;
      }
      DefFmWidth = this->Width;
   }
   if (this->Width < DefFmWidth)//При уменьшении размера окна
   {
      while(SG_WidthCalc() > sg_Grid->Width)
      {
         for (i = 1; i < sg_Grid->ColCount; i++)
            sg_Grid->ColWidths[i]--;
      }
      DefFmWidth = this->Width;
   }
}
//---------------------------------------------------------------------------
1
29.06.2017, 11:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2017, 11:19
Привет! Вот еще темы с ответами:

"Привязка" окон дочерних процессов к окну главного процесса - C++ Builder
Всем доброго дня. Вопрос знатокам. Есть VCL приложение (С++ Builder XE). В этом приложении можно открыть несколько дочерних форм...

Как в C++ Builder из кода сделать "процедуру" для дальнейшего использования этого кода? - C++ Builder
Есть код C++ Builder в котором его часть дальше будет неоднократно использоваться. Как правильно нужно преобразовать, чтобы дальше не...

Определенное расположение окон при их "причаливании" - C++ Builder
Имеется несколько окно, которые пользователь причаливает и отчаливает с панели во время работы с программой. Можно ли сделать так, чтобы...

Использование компонентов DICOMVCL - сообщение "Not an allowed type (__property TMetaClass*)" - C++ Builder
Всем привет. C++ Builder 6. Установил компоненты DICOMVCL. Открываю demo, компилю и ошибка &quot;Not an allowed type&quot; class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru