Наложение объектов при докомпиляции интерфейса

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Irina_
Местный житель
Сообщения: 545
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Наложение объектов при докомпиляции интерфейса

Сообщение Irina_ »

Здравствуйте.
Возникла проблема при докомпиляциии интерфейса, а именно со свойствами добавляемых объектов. Надо определить для объектов координаты по X и Y, ширину по X и Y. При определении ориентируюсь на объекты разработчика. Но этого не всегда достаточно. Похоже, что проблема возникает из-за разного разрешения мониторов у пользователей, из-за параметра Windows.FontSize в cfg пользователя, может еще из-за чего-то. Настроила у себя положение объектов, но при подключении res пользователям, у которых размер шрифта или разрешение монитора другие, идет наложение объектов. Что можно сделать для решения этой проблемы?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Наложение объектов при докомпиляции интерфейса

Сообщение edward_K »

Есть такая проблема.
Самое правильное вычислить координаты того объекта, рядом с которым добавляете и рассчитать пропорцию к его положению при стандартных настройках. С конфигуратором таких проблем нет.
Есть сложность в том, что положение объекта будет определено после завершения cmInit. Вам придется в конце его сделать PutCommand - это поставит вашу коммаду в очередь и после отрисовки окна выполниться. Ну или cmIdle.
Естественно нужно принять меры чтобы ваше процедура сработала только раз - я обычно блокирую переменной.
Или попытаться подобрать коэффициенты и прописать их в include.
У меня они такие получились

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

 var wkoef , wkoefx :double ;
  var wfont,wfont1 :string ;
  wkoef:=1 ;
  wfont:=GetStringParameter('Windows','FontSize',0)
  wfont1:=GetStringParameter('Windows','FixedFontSize',0)
  wkoef:=0;
  wkoefx:=0;
  If EXISTTUNE('GALCOMMON.UTILS.KOEFX')
     wkoefx:=doGetTune('GALCOMMON.UTILS.KOEFX')
  If EXISTTUNE('GALCOMMON.UTILS.KOEFY')
     wkoef:=doGetTune('GALCOMMON.UTILS.KOEFY')
  
  if wkoefx=0 or wkoef=0
  { case wfont of
    '9' : { wkoef:=1.05 ;wkoefx:=1.14 ;}
    '10': { wkoef:=1.10 ;wkoefx:=1.25 ;}
    '11': { wkoef:=1.20197 ;wkoefx:=1.42015 ;}
    '8' : { wkoef:=1.00 ;wkoefx:=1.00 ;}
    else 
    { wkoef:=double(wfont)+0.0
      wkoef:=sqrt(wkoef/8.0) ;
      wkoefx:=wkoef  //  /8.0
    }
    end ;
    If EXISTTUNE('GALCOMMON.UTILS.KOEFX')
       doSetTune('GALCOMMON.UTILS.KOEFX',wkoefx)
    If EXISTTUNE('GALCOMMON.UTILS.KOEFY')
       doSetTune('GALCOMMON.UTILS.KOEFY',wkoef)
  }     
Пример

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

   
   #include cnf_koef.vpp
  cfsSetProp('butSP','Origin_X',650*wkoefx); 
   cfsSetProp('butSP','Origin_Y',130*wkoef); 

   cfsSetProp('butSP','Size_X',65*wkoefx); 
   cfsSetProp('butSP','Size_Y',20*wkoef); 
Irina_
Местный житель
Сообщения: 545
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Наложение объектов при докомпиляции интерфейса

Сообщение Irina_ »

Здравствуйте.
edward_K, большое спасибо за ответ.
Так и делаю: рассчитываю координаты стандартного объекта, рядом с которым добавляю, использую PutCommand в конце cmInit, использую переменную, чтобы считать положение стандартного объекта один раз. Но не во всех случаях это помогает. Проблема, когда объект с меткой надо вставить с учетом координаты Х и размера по Х стандартного объекта с отступом от этого объекта по горизонтали. Отступ надо рассчитывать с учетом коэф-та.
То, что проблемы с наложением нет при работе с конфигуратором, верно в том случае, если сохраненный скрипт загружается пользователю с таким же FontSize, с которым делалось конфигурирование. Я увидела это, когда у себя конфигуратором сделала изменение одного интерфейса для пользователя, сохранила в скрипт и загрузила пользователю. Надо же такому случиться: у меня FontSize=8, а у пользователя FontSize=12. Пришлось у пользователя работать с конфигуратором.
У меня есть пользователи, у которых FontSize=12. В приведенном Вами исходнике отдельно не анализируется этот размер шрифта, а по else получаем wkoef=1.2247 и wkoefx=1.2247. Подозреваю, что как минимум wkoefx здесь рассчитан неточно, учитывая то, что при увеличении размера шрифта от 8 к 11 коэф-т увеличивается, а для 12 он меньше, чем для 11. Возможно у Вас просто не было необходимости работать с этим размером.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5184
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Наложение объектов при докомпиляции интерфейса

Сообщение edward_K »

с 12 шрифтом не было необходимости.
Кроме того для универсальности в этом коде добавлена обработка 2 настроек и можно на ходу подстраивать.
Думаю вам не составит труда добавить их себе.
По поводу скриптов конфигуратора.
Я бы вам категорически не советовал держать crf файлы, тем более пользовательские.

Обычно я делаю так(при стандартных настройках)

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

1.	Включаем настройки в cfg
2.	конфигурируем интерфейс
Записываем наименование всех измененных полей и их свойств ( если в browse добавление столбца идет не последним, то придется записать и все следующие столбцы). Возможно, придется включить какие то опции для отображения полей на экране, но можно это сделать и позднее. Полезное окно – «список конфигурируемых объектов»
3.	Сохраняем cnf

4.	Из полученного файла удаляем все, что не записали по пункту 2. и сохраняем в папку cnf(контур\alter) c именем «имя_контура_имя_интерфейса.cnf». Полученный файл компилим vip-ом как обычный интерфейс. Часть свойств объектов может устанавливаться программно – тогда без “докомпиляции” не обойтись. После компиляции смотрим полученный vip_res.log – ни ошибок, ни предупреждений быть не должно. 
5.	Если часть полей добавлялось по внешнему классификатору или атрибуту, то компилить нужно на той же базе, на которой было выполнено конфигурирование или по крайней мере перекачать attrnam и exclassname.
6.	В дальнейшем полученный файл лучше подправлять руками или переносить в него блоки из файла, полученного по пункту 3.
7.	Runtime при запуске интерфейса как правило говорит о необходимости пересборки интерфейса на новых патчах
8.	Файлы с расширением crf размером больше 16 байт лучше удалять.
При компиляции cnf вставляем в конец проекта(если есть докомпиляяция этих же интерфейсов, то обязательно в тот же проект).
При таком подходе не нужно каждый раз перегружать скрипты - просто пересобираем на новом exe и все.
В 99% этого хватит для установки патчей. Иногда все таки идет сдвиг элементов в исходных элементах, идет переименоование( для сокращения этой работы как раз и удаляем лишнее).

По возможности конфигуратор лучше не использовать совсем.

Есть еще лучше способ, но он часто требует наличие исходников - OverLoadFormats , ExtendFormats
В случае последнего для скрина в добавляете только нужные поля и на свободном месте их вывод

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

<<


                    .@@@@@@@@@@@@@@
>>
Но нужно в точности повторить структуру объявления исходного элемента(что без иходников иногда сложно)
и не забыть про table.
Могут быть проблемы с TabbedSheet - но там нужно еще более аккуратней добавлять.
Irina_
Местный житель
Сообщения: 545
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Наложение объектов при докомпиляции интерфейса

Сообщение Irina_ »

edward_K, большое спасибо за советы!
Столкнувшись с конфигурированием интерфейсов, поняла, что здесь много подводных камней. Теперь понимаю Ваши советы. То, что у большинства пользователей свои cnf – это наследство. Проблема в том, что нигде нет описания что конкретно делалось и в каких интерфейсах: добавлялись объекты с нужными свойствами, скрывались объекты, переносились объекты. Некоторые cnf файлы достаточно большие и не совсем удобны для анализа изменений (особенно при скрытии объектов). Некоторым пользователям изменения интерфейсов делались, исходя из выполняемой ими работы. И сейчас понимаю, что не последнюю роль сыграли разные FontSize у пользователей. Чтобы сейчас сделать все правильно, надо потратить много времени, в т.ч. и на анализ изменений. Надеюсь все-таки заняться этим вопросом при наличии времени.
При использовании api конфигуратора столкнулась также с проблемой при добавлении новых столбцов — фактическая ширина этих столбцов не соответствовала той, что указывалась при использовании cfsCreateObject(‘Column’,…) и cfsSetProp( ...,’DefaultWidth’,... ). Поэтому по совету Den (отдельное ему СПАСИБО за помощь!) пришлось воспользоваться ExtendFormats.

P.S. Ваши советы особенно пригодились бы админу на предприятии, когда он только начинал работать с конфигурированием интерфейсов. Было бы сэкономлено много времени.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Наложение объектов при докомпиляции интерфейса

Сообщение m0p3e »

Я пошел другим. viewtopic.php?f=8&t=13190
По прошествии времени могу сказать, что работает вполне успешно.
Irina_
Местный житель
Сообщения: 545
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Наложение объектов при докомпиляции интерфейса

Сообщение Irina_ »

Сергей, спасибо!
Хотела бы уточнить: почему Вы ввели не 2 настройки, а 4 (коэф-т позиции и коэф-т размера по X и по Y)? Действительно ли коэф-т позиции и коэф-т размера по одному направлению отличаются?
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Наложение объектов при докомпиляции интерфейса

Сообщение m0p3e »

Координаты x,y и коэффициент размеров по обоим осям.
Они довольно сильно различаются. В случае масштаба в настройках Windows не равного 100, начинается самое интересное. :)
Ответить