Страница 1 из 2

CREATE и размеры

Добавлено: 28 Май 2019, 14:40
Андрей
Такой вопрос - на окне расположить кнопочки сделанные программно. Высчитываю размер их по ширине окна и кол-ву столбцов, вывожу, смотрю - не вмещаются.... пересчитал - да вроде правильно, ширина кнопки д.б. 490 пикселей.
Ширину окна пока задаю фиксированно в описании
Window WINDOW('Caption'),AT(0,0,1920,1080),FONT('Arial Unicode MS',9),GRAY

создаю кнопку
L:CQControl{PROP:Width} = 490!l:XWidth

меряю экранной линейкой - 800 с лишним.... ммм... а как обеспечить заданный размер (ширину) ?

CREATE и размеры

Добавлено: 28 Май 2019, 15:33
kreator
Андрей, а зачем этот гемор? Нарвётесь на другой монитор с другими шрифтами и тю-тю. Если динамически создаёте контролы, то и вычисляйте их размеры тоже динамически. Исходя из текущего состояния окна. Есть ещё класс Resizer. К сведению.
ИМХО, переводить окно в пикселы лучше, если окно пустое. Иначе может всё уехать.

CREATE и размеры

Добавлено: 28 Май 2019, 15:55
Игорь Столяров
Андрей писал(а): 28 Май 2019, 14:40меряю экранной линейкой - 800 с лишним
Процитирую справку:

PROP:Pixels

Свойство окна, которое переключает единицы измерения линейных размеров между условными единицами и пикселами (не относится к печатным документам). После установки этого свойства все свойства и функции позиционирования (такие как GETPOSITION, SETPOSITION, MOUSEX, MOUSEY, PROP:Xpos, PROP:Ypos, PROP:Width и PROP:Height) возвращают и воспринимают координаты в пикселах, а не в условных единицах.

Пример:

Код: Выделить всё

WinView   WINDOW('MyApp'),AT(0,0,320,200),MAX,HVSCROLL,SYSTEM
     END

CODE

OPEN(WinView)
WinView{PROP:Pixels} = 1  !Изменить единицы измерения на пиксели
ACCEPT
!все свойства и функции позиционирования теперь возвращают пиксели
END

CREATE и размеры

Добавлено: 28 Май 2019, 16:54
Андрей
kreator писал(а): 28 Май 2019, 15:33Нарвётесь на другой монитор с другими шрифтами и тю-тю.
в моем специфическом случае - приложение под сенсорный киоск, наверно можно и в пикселах ? окно на весь размер, все контролы можно (и наверно нужно) сгенерировать программно, в параметрах сохраню размер, например 1920*1080 или там 1080*1920, согласно макету рассчитаю из относительных позиций абсолютные контролов при каждом обновлении. А шрифты... ммм... не думал еще - может тоже пересчитывать параметры шрифтов типа L:CQControl{PROP:FontSize}=L:CQControl{PROP:Height}/3 ?

CREATE и размеры

Добавлено: 28 Май 2019, 21:57
kreator
У нас как раз есть модуль для сенсорного киоска. Я не парюсь, сделал обычно. Класс Resizer всё растягивает. Единственно где использую prop:Pixels - на экране с проигрыванием видео. Но там кнопок самый минимум. А зачем вообще создавать динамически кнопки? Есть у меня и такой экран. Завтра на работе посмотрю как там сделано.

CREATE и размеры

Добавлено: 29 Май 2019, 10:17
kreator
kreator писал(а): 28 Май 2019, 21:57 Завтра на работе посмотрю как там сделано.
Сделано банально. Кнопки создаются динамически предопределённого размера, местоположение относительно окна в дизайнере. А в программе работает стандартный Resizer. И на данный момент не знаю сколько используется киосков и какие параметры монитора у них. Изначально просили сделать под семнашку с 1280х1024.

CREATE и размеры

Добавлено: 29 Май 2019, 12:00
Yufil
Я обычно создавал в окне невидимые прямоугольные ( box) контролы. В том месте, где будут размещаться кнопки, кладём прямоугольник и стандартным способом обеспечиваем его ресайзинг. А в конце метода Resizer.Resize определяем положение кнопок, привязанное к позиции и размерам скрытого прямоугольника.

0{ Prop:Pixels} = True
! Позиция скрытого контрола
GetPosition( ?PostionBox, X#, Y#, W#, H#)

!Дальше размещаем кнопки, привязывая их не к окну, а к боксу
ButtonWidth = W# / ButtonCount
SetPosition ( ?Button1, X# , Y#, ButtonWidth , H#)
SetPosition ( ?Button2, X# + ButtonWidth , Y#, ButtonWidth , H#)
SetPosition ( ?Button3, X# + ButtonWidth*2 , Y#, ButtonWidth , H#)

! Где-то так..
0{ Prop:Pixels } = False

CREATE и размеры

Добавлено: 31 Май 2019, 1:36
Андрей
Если можно, то в этой же теме подскажите - как опросить динамически созданные контролы - buttons ?
Пишу в TakeFieldEvent

Код: Выделить всё

Of l:FirstField To L:LastField 

If Event:Accepted 

 lqc:Id = Field()
 Get(L:q:Control,lqc:Id)
 Message(lqc:Id&' - '&lqc:Spec)
End 
Но... работает так интересно: когда позиционируюсь на любую кнопку и жму ее, то событие генерится 3-4 раза, а если эту же кнопку жать после этой серии из 3-4-х раз, то уже правильно - 1 раз на каждое нажатие. Как сделать всегда 1 ? Как объясняется такое поведение ? Мне ж надо вызвать процедуру обработки, зачем ей 3-4 раза отрабатываться...

CREATE и размеры

Добавлено: 31 Май 2019, 9:24
Yufil
1. IF Event:Accepted всегда истинно...
2. Обработаем в TakeAccepted, нафиг остальные события, в самом начале

Код: Выделить всё

    lqc:Id =  Field() 
    Get(L:q:Control,lqc:Id)
    IF ~ErrorCode() 
       !  Вот здесь обработаем наш контрол...
    END

CREATE и размеры

Добавлено: 31 Май 2019, 10:22
kreator
Андрей, если непонятно, что Юрий написал, я разжую. В классе "Window Manager" есть метод "TakeAccepted". Свою обработку нужно запихнуть в Embeds этого метода после "Else Clause". Программный код может быть другой. В зависимости от того как Вы храните динамически созданные контролы. У меня также, как у Юрия.

CREATE и размеры

Добавлено: 31 Май 2019, 14:56
Андрей
Спасибо, опрос идет.
А что, что красивостей нет для кнопок ? Подобно для GROUP inner Outer. Или ...?

CREATE и размеры

Добавлено: 31 Май 2019, 16:00
kreator
Для кнопок есть flat и transparent. Можно под кнопку группу подложить. Есть регион как замена кнопки. Есть класс ActiveImage для красивостей в современном стиле Винды. И ещё 100500 вариантов.

CREATE и размеры

Добавлено: 31 Май 2019, 16:20
kreator
Я ещё использовал вместо кнопок Option с пустой иконкой. Некий другой вид кнопки.

CREATE и размеры

Добавлено: 02 Июнь 2019, 21:40
Андрей
А вот еще одна некрасивость: в окне строятся динамически колонки в составе: кнопка и за кнопкой 2 текстовых поля. Ширина и высота(одинаковая) всех 3-х контролей вычисляется по ширине/высоте окна и количеству колонок. Для текстовых полей выбираю String, но если надпись на кнопке автоматом центрируется по вертикали и горизонтали, то для String {PROP:Center}=True центрирует только по горизонтали. Есть ли возможность центрирования по вертикали ? Entry брать ? Там центрирование двойное, но поле желательно делать Disable, а читается такое поле неважно.
Disable цветовая схема редактируется ?

CREATE и размеры

Добавлено: 03 Июнь 2019, 10:08
kreator
Андрей писал(а): 02 Июнь 2019, 21:40 Есть ли возможность центрирования по вертикали ? Entry брать ?
Либо String центрировать самому (высоту выставить default, потом вычислить координату по вертикали), либо Entry. Что в Entry не так? Есть возможность кликнуть на поле?