Страница 19 из 53

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

Добавлено: 22 Июль 2020, 10:30
Admin

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

Добавлено: 22 Июль 2020, 10:45
kreator
Вот у вас куча запущенных программ. Вы выключаете компьютер. Появляется окно со списком запущенных программ. Они постепенно закрываются. Редакторы, например, спрашивают о сохранении, если не сохранено. И т.д. А тут выступает Ваша программа с сообщением "Отставить". Правильно? Я считаю, пусть закроется как все остальные. Очень маловероятно, что пользователь сидит в форме, редактирует запись, и посылает компьютер на выключение или перезагрузку. Каких-то других вариантов я не вижу. Можно ещё подстраховаться и спросить пользователя, если он находится в режиме редактирования записи. Но это сильно специфический и маловероятный случай.

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

Добавлено: 22 Июль 2020, 11:20
RaFaeL
Игорь Столяров писал(а): 22 Июль 2020, 6:10 И нужно искать другой способ - потому, что программа не должна блокировать завершение работы Windows.
Выдрал из шаблона конкретно те 5 строчек, что отвечают конкретно за closedown, вставил вместо вызова класса - и shutdown приложение закрывает, и ошибки при закрытии нет

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

Добавлено: 22 Июль 2020, 11:27
Игорь Столяров
RaFaeL писал(а): 22 Июль 2020, 11:20 и ошибки при закрытии нет
Ну и славно. Значит классическая проблема: не соответствие последовательности закрытия классов - порядку открытия.
В этом случае теряется указатель на заголовок окна и всё становиться колом.

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

Добавлено: 22 Июль 2020, 12:34
finsoftrz
RaFaeL писал(а): 22 Июль 2020, 11:20
Игорь Столяров писал(а): 22 Июль 2020, 6:10 И нужно искать другой способ - потому, что программа не должна блокировать завершение работы Windows.
Выдрал из шаблона конкретно те 5 строчек, что отвечают конкретно за closedown, вставил вместо вызова класса - и shutdown приложение закрывает, и ошибки при закрытии нет
Попробуйте при открытом не mdi child окне. Например, на предпросмотре печатной формы.

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

Добавлено: 22 Июль 2020, 12:44
finsoftrz
Admin писал(а): 22 Июль 2020, 10:30 https://docs.microsoft.com/en-us/window ... endsession
Спасибо за ссылку. В принципе, я посмотрел, как управляется выключение. Сабклассится окно фрейма и обрабатываются 2 сообщения, которые по ссылке. Типа такого.
После открытия окна фрейма.

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

    SavedProc              = AppFrame{PROP:WndProc}
    AppFrame{PROP:WndProc} = ADDRESS(CSubClassFunc)
В локальных процедурах.

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

CSubClassFunc     PROCEDURE(UNSIGNED shWnd,UNSIGNED swMsg,UNSIGNED swParam,LONG slParam)
LOC:WM_QUERYENDSESSION EQUATE(0011h)
LOC:WM_ENDSESSION      EQUATE(0016h)
LOC:WM_PAINT           EQUATE(000Fh)
LOC:WM_ERASEBKGND      EQUATE(0014h)
Nerr UNSIGNED
  CODE
  CASE swMsg
  OF LOC:WM_QUERYENDSESSION
    RETURN(True)
  OF LOC:WM_ENDSESSION
    POST(Event:CloseDown,,1)
    RETURN(True)
  END
  RETURN(CallWindowProc(SavedProc,shWnd,swMsg,swParam,slParam))

Однако такая схема не срабатывает при открытом не mdi child окне. В ABC классах, как я понял, аналогично. И нужна дополнительная обработка окон с измененными данными. В общем, направление понятно.

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

Добавлено: 22 Июль 2020, 13:21
RaFaeL
В шаблоне не так сделано. Там ловится Event:Notify, и в зависимости от Notification выполняется действие

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

Добавлено: 22 Июль 2020, 14:03
finsoftrz
Я не очень ориентируюсь в ABC классах. Смотрел в С10. Поиск по событию WM_QUERYENDSESSION выдает WindowExtenderClass, в нем похожий код. С некоторыми довесами. В частности, прописан вызов виртуального метода класса для дополнительной обработки.
Как я понял, проблема есть где-то в обработке события CloseDown, не все окна закрывает в нужный момент. Если открыт предпросмотр печатной формы и жмете перезагрузить компьютер, что происходит?
Я смотрел в демке у Игоря. Там вывешивает окно, что приложение не дает перезагрузить компьютер, но завершает работу, если отказаться от перезагрузки. Что выглядит некорректно. А если предпросмотр не открыт, то программа молча завершает работу. Я у себя получил аналогичный результат. Причем не только на предпросмотре. У меня не срабатывает при активной панели переключения потоков, которая без mdi и с toolbox. Отключаем ее в настройке, работает, как задумано.

PS. Мне кажется, мы слишком погрузились в эту тему. Ситуация, когда пользователь перегружает или выключает компьютер при работающем приложении, актуальна только для небольших утилит. Например, серверов оборудования, которые при включении компьютера вешаются в трей. Там без вопросов приложение сразу закрывается при выключении компьютера. С обычным приложением ситуация настолько редкая, что, ИМХО, можно не заморачиваться, просто запрашивать подтверждение закрытия приложения, как дефолтно и происходит.

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

Добавлено: 22 Июль 2020, 14:17
RaFaeL
Я и не заморачиваюсь. Добавил закрытие обычное, раз у всех есть а у меня нет. Если на каких-то формах вдруг при перезагрузке не закроется, ничего страшного не вижу

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

Добавлено: 22 Июль 2020, 14:54
finsoftrz
У всех, это у кого? :-)
У большинства, я думаю, стоит дефолтно. То есть запрос на подтверждение закрытия приложения. Как у Вас раньше и было, если я правильно понял. Галка в шаблонах это для утилит, которые должны завершать работу при выключении компьютера. Мне вообще показалось, что SV позаимствовало идею с пускача (откуда я привел вырезку кода). Либо у них общий предок. Слишком все похоже.

В 1С8, которые заморочились. Я думаю, они блокируют перезагрузку и выключение компьютера, когда их среда работает. Затем выполняют закрытие всех окон с проверкой необходимости сохранения данных, а потом уже на выходе из программы сами генерят событие на перезагрузку или выключение компьютера. А тут придется еще разруливать заморочки с правами доступа. Нафиг это надо...

Кстати, сам кларион при попытке перезагрузки компьютера и отказа в ступор впадает. С6 и С10 по разному. C6 перестает собирать приложение, C10 совсем виснет. До перезагрузки.

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

Добавлено: 22 Июль 2020, 15:32
RaFaeL
Дефолтно нет никакого подтверждения, просто винда говорит, что закрыть не может. Потому что посылает в приложение событие, а на него реакции никакой. А вот реакцию обрабатывать можно по-разному - не молча закрывать, например, а спрашивать пользователя. Из трея на полный экран развернуть, в панели помигать, у кого какая фантазия

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

Добавлено: 22 Июль 2020, 15:57
finsoftrz
Если дословно, винда пишет, что для перезагрузки (выключения) надо выйти из программы. И предлагает либо отказаться от перезагрузки, либо перезагрузить, принудительно закрыв программу.

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

Добавлено: 24 Июль 2020, 16:56
finsoftrz
"А теперь баба Люба!" :-)
Порекламирую ресайзер Струменского. Можно хоть черта лысого отресайзить. Работает со сплиттерами Руденко. И все бесплатно. Должен быть в файловых архивах.
Когда-то наткнулся на него в обсужденях в ClaList. Стандартный не устраивал. Мялин, помнится, тогда написал, так вот как надо делать ресайзер... Кто-то пользуется стандартным ресайзером в кларионе? Может, я что-то упустил. Глянул в С10, вроде все тоже самое, как когда-то давно было.

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

Добавлено: 24 Июль 2020, 17:26
Игорь Столяров
finsoftrz писал(а): 24 Июль 2020, 16:56 Кто-то пользуется стандартным ресайзером в кларионе
Я пользуюсь. И всё устраивает. Может быть я просто чего-то не знаю ?
Что касается шаблонов в C11 - то с чего им меняться, если всё на человечьем языке написано ?
На всякий случай обвёл на рисунке красненьким ... :)

1.jpg
1.jpg (32.54 КБ) 2869 просмотров

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

Добавлено: 24 Июль 2020, 17:53
finsoftrz
Попробуйте Струменского, рекомендую. Во всяком случае, на сложных окнах. На простых можно и стандартный использовать, одно другому не мешает.
Там надо стратегию для каждого контрола задавать, который ресайзится. Делается это прямо на закладке action. Кроме выбора стандартных стратегий, можно создавать пользовательские. Например, смещать контролы в задаваемой пропорции и/или относительно какого-то фиксированного значения, например, позиции сплиттера.