|
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
|
||||||
Рассчитать ширину колонок с учетом ScrollBar в StringGrid на всю ширину StringGrid20.09.2014, 22:27. Показов 7808. Ответов 7
Метки нет (Все метки)
Здравствуйте,
Требуется в StringGrid-ах автоматически рассчитать ширину колонок - что бы не было горизонтальной полосы прокрутки и не было справа не используемого места (то есть, занять всю ширину StringGrid-а). В рассматриваемом примере StringGrid-ы одинаковые, но в одном есть ScrollBar (строки не вмещаются все), в другом - ScrollBar отсутствует. Как работать со ScrollBar-ом уже объяснялось в теме Как обратиться к ScrollBar в StringGrid?. Вроде бы все делаю по инструкции, но почему-то в одном случае ScrollBar учитывается, в другом - нет (во второй таблице справа от колонки с заголовком Col_5 - пустое место). Такое ощущение, что какой-то важный момент упустил ![]() Картинка того, что получилась в итоге - ниже, во вложении. Так же и полностью весь проект во вложении. Оба StringGrid требуется обработать в одном цикле. По факту - у меня в разрабатываемом проекте StringGrid-ов несколько больше двух и требуется как-то автоматизировать процесс расчета ширины колонок для каждого StringGrid-а, в зависимости от того, есть или нет у него ScrollBar. Может быть есть другой, более правильный, способ как достигнуть результата - буду признателен если мне его расскажут.
0
|
||||||
| 20.09.2014, 22:27 | |
|
Ответы с готовыми решениями:
7
Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
ScrollBar и StringGrid |
|
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
|
|||||||
| 21.09.2014, 07:59 | |||||||
1
|
|||||||
|
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
|
||
| 21.09.2014, 10:34 [ТС] | ||
|
0
|
||
|
844 / 739 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
|
|
| 21.09.2014, 11:42 | |
|
il-ir,
Аа ну понятно, тебе значит нужно взять не ширину StringGrid-а а клиентскую область ширины StringGrid-а и поделить ее на кл-во колонок и со строками сделать тоже самое. Вобщем тебе нужно придумать формулу если не лень, если лень поджди мож кто и придумает напишет.
0
|
|
|
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
|
||||||
| 21.09.2014, 12:00 [ТС] | ||||||
|
Сделал с предложенной NIKOLAYY, идеей - использовать StringGrid1.ClientWidth.
код (проект с обновленным кодом - во вложении):
но при условии, что для StringGrid, где мало строк, установлено свойство ScrollBars = ssNone.Если же в обоих StringGrid-ах свойство ScrollBars = ssVertical, то почему-то ClientWidth вычисляется не правильно (скорее всего, вычисляется правильно, только не так как мне надо ): несмотря на то, что в StringGrid-е скролбар отсутствует, параметр ClientWidth рассчитывается так, словно скролбар должен быть.В моем исходном коде (в самом первом сообщении) - та же самая фигня: если у таблицы, где мало строк, заранее установить свойство ScrollBars = ssNone - все работает как надо. Посему, вопрос может быть несколько изменен: как при создании таблицы определить, должен быть ScrollBars или нет. Или это не правильный путь? Ниже на картинке приводятся параметры, полученные при создании формы и после того, как форма уже создана (получены нажатием на кнопку "Загрузить параметры") - в ситуации, когда у обоих StringGrid-ов при создании свойство ScrollBars = ssVertical. Линией подчеркнуто различие в свойствах ClientWidth. Можно попробовать, используя свойство RowCount, узнать сколько всего строк должно быть. Далее, рассчитать, строки все влезут или нет (свойства ClientHeight, RowHeights и GridLineWidth). и соответственно, перед расчетом ширины колонок установить свойство ScrollBars = ssVertical (если все строки не вмещаются) и ScrollBars = ssNone (если все строки поместились в StringGrid-е)... Или этот путь - неправильный и ведет в никуда?
0
|
||||||
|
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
|
|||||||
| 21.09.2014, 12:58 [ТС] | |||||||
|
Вопрос только в том, есть ли путь Полностью код решения приведу тут, вдруг кому еще потребуется? Может быть кто-нибудь предложит другой вариант получения требуемого результата - буду благодарен. Полностью проект - в приложении. Решение:
0
|
|||||||
|
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
|
||||||
| 22.09.2014, 18:48 [ТС] | ||||||
|
опять требуется помощь форумчан...
Еще одно изменение (дополнение) предложенного выше решения. У меня заголовок таблицы форматируется в несколько строк, если не вмещается по ширине. И произошел ляпсус, когда в некоторых ситуациях вертикального скроллбара по расчету быть не должно было, но он нагло появлялся ![]() Если использовать форматирование, когда в ячейке текст будет отображаться в несколько строк (как это сделать, решение предложено в частности в теме Форматирование текста в несколько строк в StringGrid), то может получиться не совсем то, что требовалось. Как я вычислил, проблема в том, что при обработке процедуры TForm1.FormCreate заголовок еще не форматируется в несколько строк и высота строки с заголовком не меняется (так как по событию OnDrawCell процедуры StringGrid1DrawCell и StringGrid2DrawCell выполняются ПОСЛЕ процедуры FormCreate). А после того, как мы в FormCreate рассчитали ширину столбцов (например, с учетом отсутствия вертикального скроллбара), то изменение высоты строки с заголовком может инициировать появление этого самого скроллбара - и часть последней ячейки окажется за видимым полем. В примере количество строк в StringGrid2 подобрано таким образом, что если заголовок в одну строку отображать, то вертикальный скроллбар не нужен. Если форматировать заголовок, что бы текст в заголовке отображался целиком в несколько строк - то вертикальный скроллбар требуется. Что бы избежать такой неприятной загогулины, пришлось несколько изменить код процедуры FormCreate: 1. Значения ячеек заголовка таблицы устанавливаются ДО расчета ширины колонок. 2. Вместо банального оператора K := TSG.RowHeights[0]; пришлось вычислять высоту для каждой ячейки заголовка (в каждой ячейке нулевой строки). Но почему-то, несмотря на то, что делаю вроде по инструкции, не работает так как надо ![]() Картинка той фигни, что получилось - ниже, во вложении. В идеале, в StringGrid2 ширина столбцов должна рассчитываться исходя из посыла, что вертикальный скроллбар есть. Но почему-то, при расчете ширины столбцов таблицы считается, что вертикального скроллбара не должно быть ... ![]() Полный текст проекта так же во вложении. Что-то я, похоже, пропустил - вот и не работает как надо ![]() Код процедуры FormCreate:
0
|
||||||
|
47 / 27 / 8
Регистрация: 11.05.2010
Сообщений: 169
|
||||||
| 23.09.2014, 13:10 [ТС] | ||||||
|
УРА!!! я победил эту ситуацию
![]() так как у нас сейчас чуть больше, чем половина четвертого утра, то подробно напишу уже днем - ошибка смешная, но неприятная. немножко пришлось но я ее нашел ![]() Добавлено через 12 часов 29 минут решение оказалось очень простое. У меня ширина первой колонки устанавливается в коде программы абсолютным значением (не зависимо от ширины StringGrid'а), ширина остальных колонок вычислялась в зависимость от ширины StringGrid'а. Соответственно, требовалось установить ширину этой первой колонки, а затем измерять высоту строки с заголовком. Я же сначала измерил высоту строки, а затем изменил ширину колонки - что в свою очередь повлекло возможное увеличение высоты строки, так как ширина колонки уменьшилась. исправленный код процедуры (полностью проект можно скачать в моем сообщении - только в проекте заменить текст процедуры TForm1.FormCreate на приведенный ниже).
0
|
||||||
| 23.09.2014, 13:10 | |
|
Помогаю со студенческими работами здесь
8
Stringgrid и его ScrollBar
Непонятки с шириной колонок у StringGrid
Закрашивает не всю ячейку StringGrid Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|