С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1

Задать изменение ширины всем элементам ввода окна, при изменении ширины самого окна

16.06.2017, 15:40. Показов 4829. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Товарищи коллеги!
Подскажите, а как подобным образом, задать изменение ширины всем элементам ввода окна, при изменении ширины самого окна?
Пробовал сделать так:
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
int DefWith;//начальный размер
float K=1, K1=1;//коэф-ты соотношения размеров
//---------------------------------------------------------------------------
void __fastcall Tfm_Nastroi::FormResize(TObject *Sender)
{
   if (this->Width > DefWith)//Увеличение ширины окна
   {
      K = this->Width/DefWith;
      K1 = K;
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TComboBox" ) )
           static_cast<TButton*>( this->Components[i] )->Width = K * static_cast<TButton*>( this->Components[i] )->Width;
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TEdit" ) )
           static_cast<TButton*>( this->Components[i] )->Width = K * static_cast<TButton*>( this->Components[i] )->Width;
   }
   if (this->Width == DefWith) //Возврат размера окна в исходное состояние
   {
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TComboBox" ) )
           static_cast<TButton*>( this->Components[i] )->Width = static_cast<TButton*>( this->Components[i] )->Width/K1;
      for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TEdit" ) )
           static_cast<TButton*>( this->Components[i] )->Width = static_cast<TButton*>( this->Components[i] )->Width/K1;
   }
}
//---------------------------------------------------------------------------
void __fastcall Tfm_Nastroi::FormCreate(TObject *Sender)
{
   DefWith = fm_Nastroi->Width;
}
//---------------------------------------------------------------------------
Результат:
Когда нажимаю кнопку окна "Развернуть", элементы пропорционально расширяются и сдвигаются друг относительно друга по ширине корректно и равномерно.
Но вот при возвращении в исходное состояние окан, они почему-то в свои прежние позиции не становятся, а наезжают друг на друга.

Подскажите, что я возможно забыл задать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2017, 15:40
Ответы с готовыми решениями:

Автоматическое изменение ширины столбца в DBGrid при изменении ширины формы
Подскажите как реализовать или дайте условие автоматического изменение ширины столбца в DBGrid при изменении ширины формы.

Изменение размера картинки при уменьшении ширины окна
Вот пример кода. При уменьшении размера окна появляется скролл снизу и если его подвинуть, изображение залезает под фиксированый блок...

Изменение ширины окна влево
Всем привет) Мне необходимо сделать так, чтобы при наведении форма меняла размер, но не вправо, как это сейчас, а влево, как это можно...

47
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
16.06.2017, 16:08
Скорее всего проблема - в том, что деление:
C++
8
      K = this->Width/DefWith;
- целочисленное, и погрешность, которая возникает при обратном целочисленном делении (при возврате формы к ее исходному размеру) и приводит к подобному результату. Все-таки делить лучше
C++
1
      K = this->Width/static_cast<float>(DefWith);
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,010
17.06.2017, 15:00
А использование свойства Anchors объектов разве не решает проблему?
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
17.06.2017, 15:09  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Все-таки делить лучше
C++Выделить код
1
* * * K = this->Width/static_cast<float>(DefWith);
Давайте разберём. Переменная К и так типа float. this->Width, как и DefWith, если я не ошибаюсь, возвращают значение в int (т.е. целочисленным, без точности после запятой), так? Т.е. при таком делении двух переменных типа int, переменная К так же не получит точного значения от деления и погрешность останется потеряна? Кажется сам спросил, сам и ответил...
Тогда в таком случае, вы предлагаете привести с помощью static_cast<float> переменную DefWith к типу float, а что же тогда с this->Width? Почему его тоже не нужно привести к float?

Попутный вопрос #1: до, буквально, вчерашнего дня не видел и не пользовался конструкцией static_cast<...>, подскажите, в каких случаях её следует применять и чем она отличается от обычного приведения типов вида "(желаемый_тип)Переменная"?

Попутный вопрос #2: тоже толком сам еще не пользовался (за исключением участков кода, взятых в свои проекты из источников в сети), но частенько видел в примерах, приводимых людьми, конструкцию цикла foreach. Сам с ней пока толком еще не разобрался и не привык, но что-то мне подсказывает, что с помощью неё можно как-то оптимизировать вот такие места:
C++
1
2
for( int i = 0; i < this->ComponentCount; i++ )
        if ( this->Components[i]->ClassNameIs( "TComboBox" ) )
Если я не ошибаюсь, подскажите как правильно это будет выглядеть, пожалуйста?
Спасибо!

Добавлено через 6 минут
Цитата Сообщение от gunslinger Посмотреть сообщение
А использование свойства Anchors объектов разве не решает проблему?
Пробовал с ним поиграться. Если задать привязку к левой стороне, то элементы ввода при увеличении размера окна, да, расширяются тоже, и при возврате в дефолтное состояние окна, остаются на своих начальных местах и всё, вроде бы нормально, но при развороте окна в полный экран, эти элементы не размещаются в окне равномерно пропорционально изменению его размера. а остаются как бы прижатыми к левой стороне, лишь изменив ширину. При попытке привязать к правой стороне, если сейчас мне не изменяет память, тоже ничего дельного не произошло. А при привязке и к левой и к правой, их слишком сильно "размазывает" по окну... Такие широкие элементы ввода мне не нужны в данном окне...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
17.06.2017, 16:29
Цитата Сообщение от Cha1000000 Посмотреть сообщение
Почему его тоже не нужно привести к float?
Потому что достаточно перевести один операнд, тогда деление перестанет быть целочисленным.
Цитата Сообщение от Cha1000000 Посмотреть сообщение
не видел и не пользовался конструкцией static_cast<...>, подскажите, в каких случаях её следует применять и чем она отличается от обычного приведения типов вида "(желаемый_тип)Переменная"
Оператор static_cast
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
17.06.2017, 17:29  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Потому что достаточно перевести один операнд, тогда деление перестанет быть целочисленным.
Цитата Сообщение от volvo Посмотреть сообщение
Оператор static_cast
Спасибо за информацию.
А по оптимизации через foreach есть что добавить?
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
19.06.2017, 12:15  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Все-таки делить лучше
C++Выделить код
1
* * * K = this->Width/static_cast<float>(DefWith);
Добрый день! Попробовал сегодня у себя в проекте внести изменения, согласно вашему предложению. Пока всё равно "деформация не излечилась". У меня возникли вопросы, касаемо этого момента:
1. Ну допустим привели мы переменную DefWith к типу float. А объявить её при этом тоже float'ом не следует? А то она у меня интовая так-то...
2. А на счёт проверок:
C++
1
if (this->Width > DefWith)
и
C++
1
if (this->Width == DefWith)
тут нужны такие приведения типов? И если да то обе стороны сравнения или только переменную DefWith приводить надо?

Добавлено через 8 минут
3. И вот в этих местах вида:
C++
1
static_cast<TComboBox*>( this->Components[i] )->Width = K * static_cast<TComboBox*>( this->Components[i] )->Width;
static_cast<TComboBox*>( this->Components[i] )->Width при приравнивании получит значение интовое, или всё же с точностью? При отладке не видно, что получается от умножения K * static_cast<TComboBox*>( this->Components[i] )->Width.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
19.06.2017, 12:20
У меня хрустальный шар в ремонте, и как изначально расположены контролы на форме, без него мне не видно. Соответственно, воспроизвести проблему я не могу, решить без воспроизведения тоже невозможно. А отвечать просто так, может вот это поможет, а может вот так сделать - это не ко мне, ждите других.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
19.06.2017, 12:47  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
хрустальный шар в ремонте
Если прикреплю сюда проект на Builder 6ом, и соответственно укажу в каком модуле эта проблема, сможете посмотреть?
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
20.06.2017, 12:49  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
воспроизвести проблему я не могу
Ну вот, набросал тестовый пример формы с компонентами, с которыми пытаюсь провести магию. И код с предлагаемым способом масштабирования вставил. Открывается на 6ом Builder'e
Вложения
Тип файла: zip TestProp.zip (786.6 Кб, 8 просмотров)
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
20.06.2017, 21:00
Cha1000000, зачем все это шаманство с изобилием компонентов? Так никто не делает. Создайте TStringGrid, в нужные вам ячейки поместите TComboBox и т.д. А далее в OnResize формы растягивайте грид и его ячейки.
И задайте для формы свойства Constraints, чтобы ее не сжимали менее нужного размера.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
20.06.2017, 21:40  [ТС]
Цитата Сообщение от TFullControl Посмотреть сообщение
зачем все это шаманство с изобилием компонентов?
Ну это просто как образец окна с кучей компонентов, которые возможно могут быть расположены в разных местах форма, подписаны лейблами, и т.д.
Цитата Сообщение от TFullControl Посмотреть сообщение
Создайте TStringGrid, в нужные вам ячейки поместите TComboBox и т.д.
Кстати, ради интереса, завтра попробую и такой вариант проделать! Думаю так действительно будет ладнее. Только попутно вопрос, а где там в Билдере в стринггриде ячейки в виде комбобоксов выставляются? В шарпе делал такую вещь, а на билдере даже как-то не замечал эту возможность? Подскажите, дабы долго искать не пришлось
Цитата Сообщение от TFullControl Посмотреть сообщение
задайте для формы свойства Constraints
Большое спасибо за совет! Я на это свойство пока внимания не обращал и не пользовался. Обязательно попробую.
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
21.06.2017, 06:22
Цитата Сообщение от Cha1000000 Посмотреть сообщение
а где там в Билдере в стринггриде ячейки в виде комбобоксов выставляются?
Нигде, руками самому все это сделать нужно будет.
Сложного ничего нет, создаете динамически нужные объекты, привязываете их к нужным ячейкам, при необходимости уничтожаете.
Разве что будите использовать сторонние компоненты, в которых это уже реализовано.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
21.06.2017, 09:43  [ТС]
Цитата Сообщение от TFullControl Посмотреть сообщение
создаете динамически нужные объекты, привязываете их к нужным ячейкам
Можно об этом немного подробнее, или пример лучше?
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
21.06.2017, 10:34
Цитата Сообщение от Cha1000000 Посмотреть сообщение
пример
Вот минимальный, но достаточный для понимания пример. В пустой проект воткните это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TStringGrid *SG;
    TComboBox *CB;
    SG = new TStringGrid(Form1);
    SG->Parent = Form1;
    SG->Align = alClient;
    CB = new TComboBox(SG);
    CB->Parent = SG;
    CB->BoundsRect = SG->CellRect(1,1);
    CB->Items->Add("Test");
}
Добавлено через 2 минуты
C++
1
#include <Grids.hpp>
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
21.06.2017, 11:02  [ТС]
Цитата Сообщение от TFullControl Посмотреть сообщение
минимальный пример
Хорошо, спасибо, буду эксперементировать, разбираться. Возможно, по достижении нужного результата, выложу сюда получившийся проект, как для примера, вдруг кому пригодится.
Цитата Сообщение от TFullControl Посмотреть сообщение
CB->Items->Add("Test");
Кстати в ячейку 1,1 слово Тест не попало. При компиляции окно выглядит так:
Миниатюры
Задать изменение ширины всем элементам ввода окна, при изменении ширины самого окна  
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
21.06.2017, 15:41  [ТС]
По поводу "в ячейку 1,1 слово Тест не попало" ошибочка вышла. Всё там попало, просто забыл, что по умолчанию при запуске отображается ItemIndex = -1, а там пусто естественно...
Начал делать, предлагаемым вами способом. Да, достаточно удобно вставляются боксы в грид, спасибо!
Однако, заполняя Items этих боксов, при компиляции и запуске, значения в них имеются, но если выбрать комбобокс и стрелкой на клавиатуре их перещёлкивать получается, а вот по нажатию на комбобокс список не выпадает.
Кстати заметил, что при нажатии курсором мыши на такой получившийся комбобокс, перебирать элементы в нём удаётся только стрелками клавиатуры, а колёсиком мыши почему-то тоже не удаётся.
Как сделать, чтоб список таки выпадал?
На всякий случай вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   int row;
   TComboBox *CB;
 
   for (row = 1; row < Form1->sg_SecGrid->RowCount; row++)
   {
      CB = new TComboBox(Form1->sg_SecGrid);
      CB->Parent = Form1->sg_SecGrid;
      CB->DropDownCount = 3;
      CB->Style = csDropDownList;
      CB->BoundsRect = Form1->sg_SecGrid->CellRect(2,row);
      CB->Items->DelimitedText=",,";
      CB->Items->Strings[0]="Один";
      CB->Items->Strings[1]="Два";
      CB->Items->Strings[2]="Три";
      CB->ItemIndex = 0;
   }
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
21.06.2017, 16:10
Цитата Сообщение от Cha1000000 Посмотреть сообщение
по нажатию на комбобокс список не выпадает.
По нажатию чем? Все выпадает!
Цитата Сообщение от Cha1000000 Посмотреть сообщение
перебирать элементы в нём удаётся только стрелками клавиатуры, а колёсиком мыши почему-то тоже не удаётся.
На то это и был минимальный пример, естественно его можно модернизировать до умопомрачения, обрабатывайте соответствующие события и получите то, чего нужно достичь именно вам, а этого уже кроме вас и клуба телепатов никто не знает.
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
21.06.2017, 16:58  [ТС]
Цитата Сообщение от TFullControl Посмотреть сообщение
По нажатию чем? Все выпадает!
Ну мышкой, когда на кнопку выпадения списка комбобокса ("v"), нажимаю, списокне выпадает (проект прилагаю).
Попутно 2 вопроса:
1. Установил в свойстве Anchors стринггрида привязку к левой, верхней и правой сторонам, но при развороте во весь экран, расширяется только правая граница грида, а размер ячеек при этом не меняется.
2. Решая вопрос #1 вытекает следующий вопрос: следует ли дополнительно привязать ширину ячеек к ширине соответствующих им комбобоксов? Если да, то будет ли правильна такая запись:
C++
1
CB->Width = Form1->sg_SecGrid->ColWidths[col];
Пробовал ставить в Options грида goColSizing в true, но тогда при попытке двигать границы столбцов, их ширина меняется только в шапке грида, ячейки и комбобоксы при этом размер не меняют. Надо чтоб равномерно всё сдвигалось...
Вложения
Тип файла: zip TestProp.zip (888.4 Кб, 2 просмотров)
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
21.06.2017, 17:37
Цитата Сообщение от Cha1000000 Посмотреть сообщение
Ну мышкой, когда на кнопку выпадения списка комбобокса ("v"), нажимаю, списокне выпадает (проект прилагаю).
Проект смысла качать нет, у вас Builder 6 у меня RAD Studio 10.1 Berlin.
Не впадает список только в 1 случае - если бокс пуст, если итемы существуют то все выпадает, можете даже не спорить, я так делаю постоянно.
По поводу ваших 1 и 2:
- 1: Размер ячеек не имеет отношения к размерам самого грида, для их изменения есть свои свойства (DefaultColWidth, DefaultRowHeight, RowHeights, ColWidths). В третий раз вам пишу: обрабатывайте событие OnResize, в нем и присваивайте ячейкам нужные габариты.
- 2: естественно следует за этим следить, фишка в том, что объект не помещается в ячейку, а всего лишь рисуется поверх нее, следовательно, в том же OnResize надо делать то же самое, что было сделано при размещении объекта над гридом, а именно:
C++
1
CB->BoundsRect = SG->CellRect(1,1);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.06.2017, 17:37
Помогаю со студенческими работами здесь

Изменение ширины окна консольного приложения
Доброго времени суток! Наткнулся на тему, но там как - то не особо описано.. Как же всё - таки изменить ширину консольки? Вот тут ещё...

Изменение длины и ширины окна влияет на размеры объектов
Здравствуйте коллеги по цеху, надо сделать простенький текстовый редактор, решил начать с малого, изменения длины и ширины текстового поля...

Пропорциональное изменение высоты CardView при изменении ширины
Используется RecycleView с GrigLayout. Имеется разметка для итемов: &lt;android.support.v7.widget.CardView ...

Изменение масштаба яндекс карты при изменении ширины экрана
Как сделать изменение масштаба яндекс карты при изменении ширины экрана? $this.map.setBounds( $this.branches.getBounds()); В...

Не переносится блок при уменьшении ширины окна
Блочная 2х колоночная резиновая вёрстка При уменьшении ширины окна нужно чтобы правый блок уходил вниз под левый Задал ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru