Интерфейсы в кларионовских приложениях

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

По eip я тему закрыл, но все таки вспомню историю из практики. Когда все начиналось, переводили довольно приличную оптовку с 1с77. В 1с77 редактирование строк в накладных можно было только через eip, пользователи привыкли, и я реально беспокоился, что будет негативное восприятие. Тогда уже было разработан механизм, связывающий колонки в броузе с полями формы, но это все таки другой подход. А люди там маньячили по поводу скорости обслуживания покупателей и защиты от ошибок. Проходит время, тишина. Я, честно говоря, был удивлен. Подождал еще немного времени и задал вопрос старшему оператору. Говорит, да нет, все нормально, нам так даже лучше. Раньше в спешке иногда операторы ошибались, не в той строке изменения делали. А тут все сразу видно.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

Вот такая идея. Разные control шаблоны могут включать в себя наборы контролов. В шаблонах задаются размеры контролов и их расположение относительно друг друга. Когда мы вставляем control шаблон в окно, то все сразу размещается нужным образом. Однако потом контролы уже живут своей жизнью. Их можно свободно перемещать. В кларином дизайнере окон при перемещение групп выделенных контролов может накапливаться погрешность и относительное расположение контролов искажается. Искажение может также возникать при выравнивании относительно других контролов. Хорошей практикой является применение сетки, но вручную делать все очень экстенсивно.
Помочь тут может генерация control шаблонами кода, который автоматически корректирует расположение связанных контролов отсительно друг друга. Попробовал применить эту методику. Эффект получился значительный. Сразу все стандартные блоки контролов выравнялись и стали идентичными в разных окнах.
Для пояснения идеи пример для простого control шаблона календаря из ШВС. Он прилепляется к полю ввода даты. Чтобы расположение кнопки не менялось относительно поля ввода, вставляется корректирующий код в точку вставки %ResizerRoutineCode, 'SZDM'. В ресайзере Струменского это место после отработки ресайза.

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

#CONTROL(CalendarLookup,'Вызов календаря'),WINDOW,MULTI
                     CONTROLS
                       BUTTON('...'),AT(,,12,12),FONT('MS Sans Serif',,8,FONT:Regular),USE(?LookupCalendar),TIP('Календарь')
                     END
#BOXED('Настройка календаря')
  #PROMPT('Заголовок окна:',@S25),%CalendarHeader,DEFAULT('Календарь')
  #PROMPT('Начальная дата:',@S30),%StartCalendarField,REQ
  #PROMPT('Целевая переменная:',FIELD),%CalendarField,REQ
#ENDBOXED
#ATSTART
  #DECLARE(%CalendarLookupControl)
  #FOR(%Control),WHERE(%ControlInstance = %ActiveTemplateInstance)
    #SET(%CalendarLookupControl,%Control)
  #ENDFOR
#ENDAT
#AT(%ControlEventHandling,%CalendarLookupControl,'Accepted')
  #IF(SUB(%CalendarHeader,1,1)='!')
    #SET(%ValueConstruct,SUB(%CalendarHeader,2,LEN(%CalendarHeader)-1))
%CalendarField = Calendar(%ValueConstruct,%StartCalendarField)
  #ELSE
%CalendarField = Calendar('%CalendarHeader',%StartCalendarField)
  #ENDIF
DISPLAY()
#ENDAT
#!
#AT(%WindowEventHandling,'AlertKey')
  if Keycode()=F4key
     if focus()=?%CalendarField and %CalendarLookupControl{PROP:DISABLE}=False
        post(event:accepted,%CalendarLookupControl)
     end
  end
#ENDAT
#!
#AT(%ResizerRoutineCode, 'SZDM')
   %CalendarLookupControl{PROP:xPos} = ?%CalendarField{PROP:xPos} + ?%CalendarField{PROP:width} + 2
   %CalendarLookupControl{PROP:yPos} = ?%CalendarField{PROP:yPos} - 1
#ENDAT
#!
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Интерфейсы в кларионовских приложениях

Сообщение kreator »

finsoftrz писал(а): 14 Август 2020, 19:54 Хотел еще по ходу спросить. А Вы ресайзите выпадающие списки? То есть при одном разрешении монитора (размере экрана) в видимой части выпадающего списка надо размещать одно количество строк, на другом другое.
Я нет. Привык ставить десять строк. Мониторы как правило сейчас FHD (даже 1600х900 - уходящая натура), стараюсь делать под этот размер.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

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

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

  loop loc:i=1 to lastfield()      !выравниваем промпты
     if loc:i{prop:type} = CREATE:Prompt
        if sub(loc:i{prop:text},len(clip(loc:i{prop:text})),1)<>':'
           cycle
        end
        if ((loc:i+1){prop:type} <> CREATE:ENTRY) and ((loc:i+1){prop:type} <> CREATE:list)
           cycle
        end
        if (0 + (loc:i+1){PROP:yPos}) < (loc:i{PROP:yPos} + loc:i{PROP:height})  !промпт слева
           loc:i{PROP:RIGHT} = 1
           loc:i{PROP:xPos} = (loc:i+1){PROP:xPos} - loc:i{PROP:width} - 2
           if loc:i{PROP:HEIGHT} > (loc:i+1){PROP:HEIGHT}
              loc:i{PROP:yPos} = (loc:i+1){PROP:yPos} + (loc:i+1){PROP:HEIGHT} - loc:i{PROP:HEIGHT} + 1
           else
              loc:i{PROP:yPos} = (loc:i+1){PROP:yPos} + (loc:i+1){PROP:HEIGHT} - loc:i{PROP:HEIGHT}
           end
        else  !промпт сверху
           loc:i{PROP:LEFT} = 1
           loc:i{PROP:yPos} = (loc:i+1){PROP:yPos} - loc:i{PROP:height}
           loc:i{PROP:xPos} = (loc:i+1){PROP:xPos}
        end
     end
  end

C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

Для выравнивания границ sheet, panel, list относительно границ окна или вышестоящего контрола можно использовать простой шаблон. Код простой, шаблоны у всех разные, поэтому просто приведу скрины для пояснения.

Так выглядит шаблон в среде Clarion6.
align1.jpg
align1.jpg (54.31 КБ) 1744 просмотра
Окно до применения шаблона.
align2.jpg
align2.jpg (29.66 КБ) 1744 просмотра
Окно после применения шаблона.
align3.jpg
align3.jpg (28.61 КБ) 1744 просмотра
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

Забыл про шаблон вывода периода. На предыдущих скриншотах видно, что в отключке был, когда его размещал. :-)

После добавления в код, генерируемый этим шаблоном, автоматической корректировки размеров и положения контролов, выглядеть стало заметно лучше.
align4.jpg
align4.jpg (19.72 КБ) 1730 просмотров
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

Когда-то давно читал статью по поводу автоматизации размещения контролов в окне. Наверно, еще в 90-е было. В памяти где-то осело. Автор писал про то, что в оконных формах ввода контролы лучше группировать по смысловому признаку. Чтобы пользователю проще было выцеливать глазом нужные. Так, наверно, мы все сейчас и делаем. А дальше предлагалось использовать невидимые группы, объединяющие обычные контролы. Группы проще выравнивать относительно друг друга. А расположение контролов внутри группы можно автоматически корректировать. С этим интересно было бы поиграть.

Может, кому-то покажется, что все эти заморочки с автоматическим выравниванием не имеют смысла, можно и вручную в дизайнере окон все разместить и выравнять. Но на больших проектах вручную контролировать очень экстенсивно. У меня сейчас в основном проекте примерно 1.5 тысячи окон и 10+ тысяч контролов в них. Когда недавно попробовал там что-то поравнять, у меня шея заболела, спина заболела, в кресле вмятина появилась. :-) Треть пути прошел, больше сил не хватило. И самое ужасное, начинаешь на это обращать внимание. То в одном окне чуть-чуть съехало, то в другом. В общем, лучше сразу айду выпить. :-)
В одном проекте на кларионе видел, что люди действительно очень аккуратно пытаются отрисовывать, равнять контролы. Но если поставить рядом 2 разных окна, то все в присядку понеслись...
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Интерфейсы в кларионовских приложениях

Сообщение kreator »

finsoftrz писал(а): 21 Август 2020, 9:59 Для выравнивания границ sheet, panel, list относительно границ окна или вышестоящего контрола можно использовать простой шаблон.
Какой смысл такой странной привязки одного контрола к другому? У Вас что до применения шаблона криво, что после применения.
И да, мне, как пользователю ABC класса Resizer, все эти проблемы кажутся какими-то надуманными. В конце концов, возьмите и посмотрите как там сделано. Зачем изобретать велосипед?
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Интерфейсы в кларионовских приложениях

Сообщение RaFaeL »

finsoftrz писал(а): 21 Август 2020, 13:20 У меня сейчас в основном проекте примерно 1.5 тысячи окон и 10+ тысяч контролов в них.
Не надо так
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Интерфейсы в кларионовских приложениях

Сообщение Дед Пахом »

сейчас в тренде "Одно окно".
С уважением, ДП
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

kreator писал(а): 21 Август 2020, 16:48
finsoftrz писал(а): 21 Август 2020, 9:59 Для выравнивания границ sheet, panel, list относительно границ окна или вышестоящего контрола можно использовать простой шаблон.
Какой смысл такой странной привязки одного контрола к другому? У Вас что до применения шаблона криво, что после применения.
И да, мне, как пользователю ABC класса Resizer, все эти проблемы кажутся какими-то надуманными. В конце концов, возьмите и посмотрите как там сделано. Зачем изобретать велосипед?
kreator, речь не про ресайз. Ресайз работает относительно того положения контролов, которое Вы задали в форматере окна. Смысл сделать так, чтобы все однотипные фрагменты контролов были идентичны во всех окнах приложения, а также устранить возможные при внесении изменений в содержание окон ляпы. Посмотрите в своем приложении внимательно с мелкой сеткой, или посчитайте вручную, какие отступы у Вас между контролами в разных окнах. Скорее всего, найдете заметное расхождение.
После применения шаблона криво быть не может, так как размер выставляется точно в dlu.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

RaFaeL писал(а): 21 Август 2020, 17:10
finsoftrz писал(а): 21 Август 2020, 13:20 У меня сейчас в основном проекте примерно 1.5 тысячи окон и 10+ тысяч контролов в них.
Не надо так
А как надо? Это определяется прежде всего функциональностью приложения. У меня достаточно комплексное решение, охватывающее большой круг вопросов. Начиная от оперативного учета, контроля и планирования ресурсов и заканчивая бухгалтерским балансом. Можно, конечно, вместо одного приложения делать несколько. Это вопрос сегментации. При сегментации по видам бизнеса предпочтительнее все включать в одно приложение. На мой взгляд, конечно, это не единственная точка зрения.
Меня количество окон, в целом, не парит, нового уже мало появляется. Просто раньше совсем не обращал внимания на расположение контролов, делая на глаз. Пользователям вроде как тоже по барабану. А тут решил, что неплохо это дело систематизировать. Ну и оказалось, что вручную это делать очень трудоемко.
Кстати, я уже обдумал вариант с использованием групп. Делаем одну стандартную функцию, в которую передаем диапазон контролов и способ выравнивания. Несколько простых контрол шаблонов с размещением group для покрытия типовых случаев (ряды кнопок, блоки полей ввода и т.п.), которые размещают вызов этой функции среди прочего. Вполне кошерно должно получиться.
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Интерфейсы в кларионовских приложениях

Сообщение kreator »

Честно, не понимаю. Рисую окно в визуальном редакторе. Выравниваю все контролы сам. Если нужно похожее окно, могу скопировать из того, которое есть.
finsoftrz писал(а): 21 Август 2020, 18:05 Посмотрите в своем приложении внимательно с мелкой сеткой, или посчитайте вручную, какие отступы у Вас между контролами в разных окнах.
Я лично слежу за этой темой. Делаю одинаково.
finsoftrz писал(а): 21 Август 2020, 18:05 После применения шаблона криво быть не может, так как размер выставляется точно в dlu.
Криво. Присмотритесь. Видно невооружённым глазом. dlu может и точное, только толку?
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4566
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Интерфейсы в кларионовских приложениях

Сообщение finsoftrz »

Не одинаковое окно. Проверьте, к примеру, расстояния между кнопками в двух разных окнах. Или отступы между полями ввода по вертикали. Во всяком случае, у коллег, у которых я мог посмотреть демки приложений, разница заметна. Вы по сетке выравниваете или как? Даже если по сетке все выравняли, а потом изменили, к примеру, положение верхней или левой границы окна, положение контролов может слегка съехать. Во всяком случае, в C6 так, в C11 не проверял.
Я не говорю, что соблюдать аккуратность в дизайнере окон не надо. Автоматическое выравнивание это дополнительный инструмент, позволяющий простыми средствами стандартизировать взаимное расположение контролов в разных окнах. Я сам об этом не задумывался, попробовал, получается неплохо.
Кстати, помню в windew одно время рекламировали фишку об автоматической проверке расположения контролов. Не знаю, по какому принципу они это делали, некоторая аналогия прослеживается.

Криво Вы имеете ввиду визуальную разницу между правым и левым отступом броуза от sheet? Видимо, какой-то визуальный эффект от прорисовки границ sheet. Это можно тоже автоматически скорректировать. Все, что делается программно, точнее, чем врукопашную.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Интерфейсы в кларионовских приложениях

Сообщение RaFaeL »

finsoftrz писал(а): 21 Август 2020, 18:23 А как надо? Это определяется прежде всего функциональностью приложения.
Вот как у вас
scr2.JPG
scr2.JPG (120.67 КБ) 1696 просмотров
Сколько тут контролов, посчитайте

А вот как у нас
scr1.jpg
scr1.jpg (65.72 КБ) 1696 просмотров
scr3.JPG
scr3.JPG (67.76 КБ) 1690 просмотров
Сколько тут контролов? Один лист

Сколько действий вы делаете, чтобы добавить какую-то опцию в программу? Добавить переменную, нарисовать контрол, еще наверняка отдельно код чтобы ее сохранить, прочитать... Потом еще добавить видимо установки 4, установки 5 и т.д.
Сколько действий делаю я? Добавляю в код ровно ОДНУ строку!!! Остальное это уже обработка этого значения в нужном месте кода. Параметры могут быть абсолютно любого типа - чекбоксы, справочники, циклический выбор, календарь, часы, все что угодно

Вы скачивали нашу программу. Откройте карточку контрагента. Как думаете, сколько контролов типа browse в той форме?
А еще как думаете, справочники товаров, контрагентов, физлиц и т.п. - это разные окна?
Ответить