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

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

16.06.2017, 15:40. Показов 4918. Ответов 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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 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
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru