Размер компонентов на разных Widget [Решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Размер компонентов на разных Widget [Решено]

Сообщение lordgray » 18.11.2017 16:02:46

Здравствуйте!
Проблема такая: есть форма, на ней масса TEdit. Под Windows, все помещается, а вот под Linux (GTK2), TEdit имеет отступы от текста где-то по 6-8 пикселей, в результате чего, компоненты очень высокие, и на форму не помещаются! Возможно ли где-то в программе эти отступы уменьшить? Компоненты создаются динамически, AutoSize := True.
Lazarus 1.8RC5 x64, на предыдущих версиях была та же проблема.
Последний раз редактировалось lordgray 19.11.2017 15:02:27, всего редактировалось 1 раз.
lordgray
новенький
 
Сообщения: 60
Зарегистрирован: 10.10.2010 00:19:11

Re: Размер компонентов на разных Widget

Сообщение Лекс Айрин » 18.11.2017 17:49:28

lordgray, используй авторазмер для компонент/форм и редактор привязок для них же.
Если динамически, то это делается примерно так


Код: Выделить всё
...
BottonSelected:=2;//переключаемся на вкладку теги
   //и отключаем кнопку "теги"
   TagsView.Enabled:=false;
   //показываем кнопки
   AddItems:=TButton.Create(FTools);
   AddItems.AnchorParallel(AkLeft, 0, FTools);
   AddItems.AnchorParallel(akRight,0,FTools);
   AddItems.AnchorToNeighbour(AkTop,0,SymbolView);
   AddItems.OnClick:=@TagsAddItems;
   AddItems.Caption:=rsAddTagToList;
   AddItems.Parent:=FTools;
   //
   DeleteItems:=TButton.Create(FTools);
   DeleteItems.AnchorParallel(AkLeft, 0, FTools);
   DeleteItems.AnchorParallel(AkRight, 0, FTools);
   DeleteItems.AnchorToNeighbour(AkTop,0,AddItems);
   DeleteItems.OnClick:=@TagsDeleteItems;
   DeleteItems.Caption:=rsRemoveTagFromList;
   DeleteItems.Parent:=FTools;
   //... и поля ввода тегов
   StartTags:=TEdit.Create(FTools);
   StartTags.AnchorParallel(AkLeft, 0, FTools);     
...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Размер компонентов на разных Widget

Сообщение kosteek » 18.11.2017 18:11:29

Я указывал для Edit'а размер шрифта вручную.
kosteek
постоялец
 
Сообщения: 203
Зарегистрирован: 24.07.2008 14:57:09
Откуда: Украина, г.Славянск

Re: Размер компонентов на разных Widget

Сообщение Лекс Айрин » 18.11.2017 18:24:52

kosteek, я хотел так сделать, то тут есть пару засад:
1. Шрифта на который ты рассчитываешь может и не быть в системе
2. При заданном размере надписи могут быть тупо неразличимы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Размер компонентов на разных Widget

Сообщение pupsik » 18.11.2017 20:51:11

kosteek для старта.
Проблема такая: есть форма, на ней масса TEdit
возможно стоит пересмотреть логику. Т.е.: обязательно Edit?


п.с.
Лекс Айрин а таскать с "собой" эти "засады" не пробовали? И динамически подгружать.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Размер компонентов на разных Widget

Сообщение lordgray » 19.11.2017 13:20:38

to Лекс Айрин:
Я и так использую авторазмер с привязками. Проблема не в том, что что-то ВЫЛАЗИТ за пределы контейнера, а в том, что результирующая форма не помещается на экран по высоте. Я наоборот, склоняюсь к тому, чтоб отказаться от автоматической высоты и назначать ее программно, дабы зависеть от "темы" операционки поминимуму.

to Kosteek
Указать размер шрифта в ручную - не выход. Допустим, поставлю 12px, для кого то это мелко, кому то крупно, но в любом случае, "оформление темы" добавит отступы к этому шрифту, например по 8 px, и компоненты будут излишне большими, не по 12+4 на рамку=16, а по 12+8+8=28!

to pupsik
Может и стоит пересмотреть логику, но мне фантазии не хватает. По задаче - редактируется от 10 до 30 различных значений, в основном цифровых, но они очень разные: некоторые целые, некоторые с различным кол-вом знаков после запятой. Т.е. просто DBGrid поставить нельзя. Можно компоненты расположить в 3-4 колонки, но это по логике не очень удобно/наглядно, т.к. многие значения парные - мин./макс. температура, мин./макс. коэффициент усиления, ...
Проекту 8 лет, но новых идей дизайна нет :(

Неужели никто виджеты не копал? Я сунулся туда, в поисках, как размер определяется, но вообще не понял, как оно устроено.

Для наглядности прикрепляю скриншот окна.
Дома Win7 и монитор 24", проблем нет, а вот на работе Debian 9 и монитор 19" (1366*768) и беда, появляется скроллер в окне, приходится таскать туда-сюда
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray
новенький
 
Сообщения: 60
Зарегистрирован: 10.10.2010 00:19:11

Re: Размер компонентов на разных Widget

Сообщение vitaly_l » 19.11.2017 13:42:15

lordgray писал(а):Я наоборот, склоняюсь к тому, чтоб отказаться от автоматической высоты и назначать ее программно, дабы зависеть от "темы" операционки поминимуму.

Я бы Вам не советовал это делать, но если нужно, то это можно отключить в параметрах проекта, на самой первой странице.
lordgray писал(а):Указать размер шрифта в ручную - не выход.

Размер шрифта вычисляется автоматом в соответствии с установленными на машине DPI. Если масштабирование DPI отключить в проекте, то на многих машинах с большим разрешением ваши формы будут очень крохотными.

lordgray писал(а):Я сунулся туда, в поисках, как размер определяется, но вообще не понял, как оно устроено.

Размер DPI устанавливается в системе и система масштабирует формы и всё что на них (ИМХО).

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

Добавлено спустя 66 минут 66 секунд:
PS: лично я пользуюсь дополнительными панелями, на которые кладу контролы с align := allClient; тогда они автоматом подстраиваются под заданный размер формы. Соответственно здесь же можно вычислить высоту шрифта по высоте контрола. :roll: Но возможно это не корректно.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер компонентов на разных Widget

Сообщение lordgray » 19.11.2017 14:20:01

vitaly_l писал(а):Размер шрифта вычисляется автоматом в соответствии с установленными на машине DPI. Если масштабирование DPI отключить в проекте, то на многих машинах с большим разрешением ваши формы будут очень крохотными.

Отключать масштабирование я не хочу, т.к. часто сталкиваюсь с тем, что люди просят сделать все крупнее на компьютерах (я не о своей программе, а вообще). И если какая-то программа не поддерживает масштабирование (например 1с 7.7), то беда. По этому, ставить в такое положение своих пользователей, я не хочу.

Но, как-то же компонент вычисляет свою высоту? Понятное дело, он отталкивается от высоты шрифта, + толщина рамки + какой то зазор между рамкой и текстом. Вот этот зазор и хочу уменьшить, это бы решило мою проблему. Под Windows, там через WinAPI получаются все эти толщины, зазоры, ... А вот в Linux, я без понятия как. Да и как компоненты устроены с учетом виджетов, я не понял. Очень подозреваю, что за эти отступы, отвечает непосредственно виджетсет, но это не один модуль и не 10 строчек, где искать, не понятно. Да и может я ошибаюсь, и не виджет отвечает, а какая нибудь настройка темы операционки.

Похоже,придется все таки, убить день или неделю, на раскопки исходников. Авось найду. А может, какое другое решение меня осенит.
lordgray
новенький
 
Сообщения: 60
Зарегистрирован: 10.10.2010 00:19:11

Re: Размер компонентов на разных Widget

Сообщение vitaly_l » 19.11.2017 14:30:05

lordgray писал(а):убить день или неделю

На скрине, у Вас всё нормально. Те зазоры, на которые Вы указали, можно убрать принудительно сократив высоту формы. Но при этом, элементы должны автомасштабироваться по высоте. Соответственно Вам осталось вычислить закономерность при различных DPI и принудительно указывать высоту формы, т.к. по ширине у Вас всё ОК.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер компонентов на разных Widget

Сообщение lordgray » 19.11.2017 15:01:18

Да по ширине понятно, что все ОК, а вот по высоте - видите справа скроллер? Если я форму сделаю еще меньше, ну скроллер вырастит.
Начал рыться в исходниках, уже пролез по 4-м модулям... Много чего нашел, но еще не разобрался, что когда вызывается и что на что влияет. НО! Наткнулся на BorderStyle, и подумал, а почему бы и не поиграться? Сделал так:
Код: Выделить всё
      {$ifdef Linux}
      E.BorderStyle := bsNone;
      {$endif}

и результат на скриншоте. Конечно, не так красиво, но... Я не на выставку пишу, удобство важнее. А будет время, пороюсь, может решу по другому. В конце концов, под Linux пользователей на 2 порядка меньше, чем под Windows.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray
новенький
 
Сообщения: 60
Зарегистрирован: 10.10.2010 00:19:11

Re: Размер компонентов на разных Widget [Решено]

Сообщение vitaly_l » 19.11.2017 15:37:44

lordgray писал(а): Конечно, не так красиво, но... Я не на выставку пишу

Не могу сдержаться (не бейте сапогами), поэтому всё же дам художественный совет. Сделайте все edit - одной ширины и прилепите их к правому краю. И всё станет ровно и цельно. Кроме того, можно прижать лейблы к edit с правым выравниванием.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер компонентов на разных Widget [Решено]

Сообщение lordgray » 19.11.2017 15:55:07

vitaly_l писал(а):
lordgray писал(а): Конечно, не так красиво, но... Я не на выставку пишу

Не могу сдержаться, всё же дам художественный совет

Я ЗА конструктивную критику.

При разработке формы, была такая мысль, сделать все Edit одной ширины, но:
1) Label'ы локализуются из файлов локализации, т.е. невозможно предугадать ширину текста, надо ориентироваться на самый широкий. Конечно, программно пройтись по всем, и найти самый широкий, не проблема, но:
2) Есть Edit, где цифры доходят до 64000000000, т.е. довольно широкий, но при этом лабел у него заведомо узкий, хоть на каком языке.
В итоге, самый широкий лабел + самый широкий Эдит, форму придется растянуть очень существенно. А расчет на то, что рядом с этой формой открывается PDF файл. Тогда он будет очень мелким, или нужен второй монитор, или постоянно переключаться между приложениями.

Куда не кинь, всюду клин :(

Но за участие и совет, спасибо! Может еще будут какие предложения? С удовольствием вылушаю.

Добавлено спустя 1 час 1 минуту 51 секунду:
И так, докопал до следующего: при создании наследников WinControl, для определения изначального размера, вызывается
Код: Выделить всё
procedure gtk_widget_size_request(widget:PGtkWidget; requisition:PGtkRequisition); cdecl; external gtklib;

Т.е. в моем случае, берется из библиотеки Gtk2 (libgtk-x11-2.0.so)
Чтобы изменить ситуацию, можно перекрыть в protected у наследников TWinControl
Код: Выделить всё
    procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override;


Все, на этом и остановлюсь. Все равно, у меня Edit с несколькими перекрытыми методами, еще один, жизнь не осложнит.

Код: Выделить всё
procedure TMyDBEdit.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
begin
  inherited CalculatePreferredSize(PreferredWidth, PreferredHeight, WithThemeSpace);
  {т.к. у TEdit нет Canvas, и чтоб не заморачиваться с "Создан/Не создан" Handle компонента, взял TextHeight главной формы.
   Может и не совсем по феншую, но работает так, как я хотел}
  PreferredHeight := Application.MainForm.Canvas.TextHeight('9,9') + 8;
end;

Спасибо всем участвовавшим :D
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray
новенький
 
Сообщения: 60
Зарегистрирован: 10.10.2010 00:19:11

Re: Размер компонентов на разных Widget [Решено]

Сообщение Лекс Айрин » 20.11.2017 09:20:51

Лекс Айрин писал(а):Лекс Айрин а таскать с "собой" эти "засады" не пробовали? И динамически подгружать.

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

Добавлено спустя 3 минуты 57 секунд:
lordgray писал(а):1) Label'ы локализуются из файлов локализации, т.е. невозможно предугадать ширину текста, надо ориентироваться на самый широкий. Конечно, программно пройтись по всем, и найти самый широкий, не проблема, но:
2) Есть Edit, где цифры доходят до 64000000000, т.е. довольно широкий, но при этом лабел у него заведомо узкий, хоть на каком языке.


Для этого есть рамки (панели), которыми можно окаймлять группы компонент.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru