Страница 56 из 198

Clarion 11-12

Добавлено: 08 Август 2021, 11:33
Игорь Столяров
finsoftrz писал(а): 08 Август 2021, 10:25 это popup всегда открывается около кнопки
Так и привяжите PopUp() к кнопке.
Из Вашего описания непонятно к каким координатам идёт привязка.

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

   Popup('...',?BPrint{Prop:XPos},?BPrint{Prop:YPos} - 2,True)
Тут есть другая, старая проблема - PopUp() сам выбирает направление открытия. :(
Но это от версии Clarion не зависит.

Clarion 11-12

Добавлено: 08 Август 2021, 12:22
finsoftrz
Рассказываю подробнее. Вот такой код:

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

     fFeq# = ?Button
     fFeqX# = fFeq#{PROP:Xpos}
     fFeqY# = fFeq#{PROP:Ypos}
     fFeqW# = fFeq#{PROP:Width}
     fFeqH# = fFeq#{PROP:Height}
     zn# = popup('Пункт1|Пункт2',fFeqX#+fFeqW#/2,fFeqY#+fFeqH#/2,1)
Если этот код разместить под кнопкой в окне (на событии accept), то отрабатывается корректно. Если этот же код оформить в виде отдельной функции в другой dll (в той же не пробовал), то не работает. Причем координаты показывает правильно, но popup не позиционируется.

Прототип функции FsPopUp(long pcontrol, string pstr), long.
Код для простоты такой:

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

     fFeq# = pcontrol
     fFeqX# = fFeq#{PROP:Xpos}
     fFeqY# = fFeq#{PROP:Ypos}
     fFeqW# = fFeq#{PROP:Width}
     fFeqH# = fFeq#{PROP:Height}
     zn# = popup('Пункт1|Пункт2',fFeqX#+fFeqW#/2,fFeqY#+fFeqH#/2,1)
     
     return(zn#)

Clarion 11-12

Добавлено: 08 Август 2021, 12:49
SergioRaguzini
Игорь Столяров писал(а): 28 Июнь 2021, 20:54 ....я использую текущие версии Clarion и у меня на это пять причин ...
------------------------------------------------------------------------------------------------
1. Современный интерфейс приложений. Интерфейс аля XP юзеры избалованные смартфонами не воспринимают
....
Привет Всем!

К сожалению Example из комплекта Clarion практически не меняются от версии к версии, базовые примеры app наверное остались еще с Сlarion 2.0 - и в С11 все те же People и School и интерфейсы в них те же, просто скомпилированные в новой среде. Я в некоторых приложениях использую украшательство 3rdParty (Noyantis, CoolFrames, Icetips Power XP и т.д.). Разумеется, обязательно подключаю Manifest. PullDown-меню вроде тоже пока не изжило себя и присутствует в большинстве современных приложений (хотя появилось еще в Dos)...

Коллеги, поделитесь примером (скрином или ссылкой на свою или некую стороннюю программу), которая на сегодняшней день является, на ваш взгляд, не плохой реализацией современного интерфейса выполненного средствами Clarion.

Спасибо

Clarion 11-12

Добавлено: 08 Август 2021, 13:06
finsoftrz
Ну так Memo Fora. :-)

Clarion 11-12

Добавлено: 08 Август 2021, 13:08
finsoftrz
В догонку по багу с popup. Если процедуру из другой dll скопировать в ту же, откуда вызываем, то работает корректно.
То есть, не совсем они ничего не делали в рантайме с11. :-)

Clarion 11-12

Добавлено: 08 Август 2021, 13:13
finsoftrz
Вот как такое может быть... И как обойти, с ходу не в голову не приходит.

Clarion 11-12

Добавлено: 08 Август 2021, 13:31
Игорь Столяров
finsoftrz писал(а): 08 Август 2021, 12:22 же код оформить в виде отдельной функции в другой dll
Даже не буду извиняться, что сам до такого не додумался когда писал ответ ! :)
У нас есть такой код - никаких проблем, работает корректно и в C6 и в C11.1.
Вызов POPUP() как в моём примере в предыдущем сообщении.
finsoftrz писал(а): 08 Август 2021, 12:22 zn# = popup('Пункт1|Пункт2',fFeqX#+fFeqW#/2,fFeqY#+fFeqH#/2,1)
Здесь вопрос в том, что координаты устанавливаются относительно текущего окна
(are treated as relative to the upper left corner of the active window's client area)

Вы уверены, что у Вас в другой DLL окно не меняется ?
Потому, что цифры координат кнопки напрямую не определяют положение POPUP().
Попробуйте проверить TARGET до вызова и внутри процедуры.

Возможно есть смысл передать в процедуру Window окна и выполнить SetTARGET(Window), а потом снять.

Clarion 11-12

Добавлено: 08 Август 2021, 13:44
Губин Игорь
Игорь Столяров писал(а): 08 Август 2021, 13:31 Вы уверены, что у Вас в другой DLL окно не меняется ?
Потому, что цифры координат кнопки напрямую не определяют положение POPUP().
Попробуйте проверить TARGET до вызова и внутри процедуры.

Возможно есть смысл передать в процедуру Window окна и выполнить SetTARGET(Window), а потом снять.
:!:

Clarion 11-12

Добавлено: 08 Август 2021, 13:45
finsoftrz
Окно не меняется. Уверен. Там его вообще нет.
SetTarget пробовал, не влияет.
Еще раз обращу внимание. Координаты переданного контрола определяются корректно. Я их сравнил с прямым вызовом popup. И я один в один скопировал процедуру из второй dll в первую, через txa. Таже самая процедура, размещенная в первой dll, работает корректно.

Игорь, а Вы уверены, что у Вас подобная процедура в другой dll, а не в той же самой, откуда вызываете?

Clarion 11-12

Добавлено: 08 Август 2021, 14:08
finsoftrz
Попробовал передать ссылку на окно, как параметр, и сделать settarget на него, ничего не изменилось.

Clarion 11-12

Добавлено: 08 Август 2021, 14:12
Игорь Столяров
finsoftrz писал(а): 08 Август 2021, 13:45 что у Вас подобная процедура в другой dll, а не в той же самой, откуда вызываете?
Конечно. Это отдельная DLL в которой находятся отчёты и собственно процедура POPUP() через которую они вызываются.
Более того - таких мест много и в разных программах. Но есть один момент. У нас нажимается не BOTTON, а CHECKBOX
(что показать удержание нажатия кнопки на момент выбора из POPUP() меню)

Clarion 11-12

Добавлено: 08 Август 2021, 14:27
finsoftrz
Это, по идее, не должно влиять. Значит, чудо. Я своими глазами вижу, тут просто ошибиться негде. Переименование функции тоже не помогает.
Может, у Вас не просто popup, а через класс завернуто?

Clarion 11-12

Добавлено: 08 Август 2021, 14:31
Игорь Столяров
SergioRaguzini писал(а): 08 Август 2021, 12:49 не плохой реализацией современного интерфейса выполненного средствами Clarion
Это очень обидная тема. Дело в том, что оформительские возможности Clarion исторически убоги.
И далее каждый решает эти вопросы в меру возможностей и готов за свою точку зрения загрызть оппонента. :)
Но есть три основных направления:

1. Как деды учили. Здесь утверждается, что оформление программ - это вообще суета, главное функционал.
Из плюсов - классическая тема оформления одинаково убога везде, а это и есть стабильность ! :)
Сюда же нужно отнести и использование перечисленных Вами прибамбасов сторонних разработчиков -
правда ими пользовались (и они выпускались) 15 лет назад.

2. Как SV придумал (это мы). Просто включаем штатный манифест и молимся, что бы всё всегда работало.
В общем-то красиво. Из минусов - последовательно отгребаем все проблемы попо-рукных программистов SV.

3. Сам себе дизайнер. Разработка своего уникального интерфейса, в т.ч. и через Windows API. Бывает круто.
Но обычно всё заканчивается на перекраске окон и навешивании графики. Всё блымает и это реально бесит.
Из минусов - нужно тестировать под всеми Windows и темами - однако трудоёмко для хорошего результата.

Clarion 11-12

Добавлено: 08 Август 2021, 14:38
Игорь Столяров
finsoftrz писал(а): 08 Август 2021, 14:27 Может, у Вас не просто popup, а через класс завернуто?
Нет. Просто вызов процедуры с popup() из DLL.
Но сам проект собран как Multi-DLL, т.е. RunTime Clarion и ABC классы линкуются в проект только один раз.

Если у Вас есть желание - соберите маленьки проект из пары DLL и окна с кнопкой - я его прогоню у себя.
Скорее всего вопрос решиться у Вас уже на этапе формирования такого примера ... ;)

Clarion 11-12

Добавлено: 08 Август 2021, 14:40
finsoftrz
Игорь Столяров писал(а): 08 Август 2021, 14:12
finsoftrz писал(а): 08 Август 2021, 13:45 что у Вас подобная процедура в другой dll, а не в той же самой, откуда вызываете?
Конечно. Это отдельная DLL в которой находятся отчёты и собственно процедура POPUP() через которую они вызываются.
Более того - таких мест много и в разных программах. Но есть один момент. У нас нажимается не BOTTON, а CHECKBOX
(что показать удержание нажатия кнопки на момент выбора из POPUP() меню)
Единственное, что мне приходит в голову, это разные билды клариона. Я тестирую на 11.0.13505. Возможно, Вы на более позднем смотрите, и там этот баг пофиксили.