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

Улетевшее окно

Добавлено: 08 Сентябрь 2017, 16:12
Алексей- Софт-Центр
Добрый день!
Любой кларион и любая винда.
Изредка бывает:
1. Вошел в окно, нажал кнопку выполнить.
2. Программа чего-то сделала.
3. В конце работы стоит вызов другого окна с , например, диагностикой и дизабле кнопки.
Вот здесь происходит "зависание" программы - кнопка еще активна, а программа не отвечает и не реагирует ни на какие действия.
Что произошло? Элементарно: окно с диагностикой "улетело" за пределы экрана и там ждет нажатия кнопки ОК, например.
4. Как это полулечится: снимаем программу и удаляем INI - файл. Запускаем прогу снова - и все работает нормально.(до следующего случайного "улета")
А теперь вопрос:
Есть ли какой-то способ все-таки показать "улетевшее" окно, чтобы все-таки нажать там на кнопку!
ПС. Разрешение экрана не помогает.

Спасибо,
Алексей

Улетевшее окно

Добавлено: 08 Сентябрь 2017, 16:44
kreator
Алексей- Софт-Центр писал(а): 08 Сентябрь 2017, 16:12 Любой кларион и любая винда.
Вот это спорно. Но народ сталкивался с проблемой (в ini записаны сумасшедшие координаты. Ведь так?). Поищи по форуму - Игорь Столяров предлагал заплатку.

Улетевшее окно

Добавлено: 08 Сентябрь 2017, 16:46
Ал
kreator писал(а): 08 Сентябрь 2017, 16:44
Алексей- Софт-Центр писал(а): 08 Сентябрь 2017, 16:12 Любой кларион и любая винда.
Вот это спорно. Но народ сталкивался с проблемой (в ini записаны сумасшедшие координаты. Ведь так?). Поищи по форуму - Игорь Столяров предлагал заплатку.
хм, продолжаю стесняться, но спрошу - а ини файл обязательно нужен?, ну и если нужен - то что-то мешает в улетающих окнах выключить запись в этот ини?

Улетевшее окно

Добавлено: 08 Сентябрь 2017, 16:50
kreator
Ал писал(а): 08 Сентябрь 2017, 16:46 то что-то мешает в улетающих окнах выключить запись в этот ини?
Нужно где-то хранить местоположение и размеры окна. Где? Выключил запись - и что?

Улетевшее окно

Добавлено: 08 Сентябрь 2017, 16:53
Игорь Столяров
Алексей- Софт-Центр писал(а): 08 Сентябрь 2017, 16:12Есть ли какой-то способ все-таки показать "улетевшее" окно, чтобы все-таки нажать там на кнопку!
Да.
После Resizer.Resize вставить строку: Window{Prop:Center} = True
Всё. :)

Улетевшее окно

Добавлено: 08 Сентябрь 2017, 20:26
Ал
Игорь Столяров писал(а): 08 Сентябрь 2017, 16:53
Алексей- Софт-Центр писал(а): 08 Сентябрь 2017, 16:12Есть ли какой-то способ все-таки показать "улетевшее" окно, чтобы все-таки нажать там на кнопку!
Да.
После Resizer.Resize вставить строку: Window{Prop:Center} = True
Всё. :)
если окно статично в размере - указать свойстве окна треб.размер и размещение по центру и отменить политику изм. размера и записи в ини....

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 8:08
finsoftrz
Открываем фрейм в максимизированном режиме при входе в программу. Запоминаем размеры. После восстановления положения дочерних окон из ini проверяем выход за границы. Ну и опция восстановления дефолтных размеров и расположения всех окон должна быть в меню фрейма...

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 10:17
Yufil
Делал перехватчик GetIni-PutIni а заодно и IniMgr, потому как системные глючат на больших Ini-файлах, и есть куча унаследованных модулей, которые пишут в каталог Windows. При запросе Xpos/Ypos/Height/Width программа проверяет, что окно влезет во фрейм и подправляет, если не так...

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 13:59
Ал
"...месье знает толк в извращениях..." :lol:

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 14:09
Игорь Столяров
Yufil писал(а): 09 Сентябрь 2017, 10:17При запросе Xpos/Ypos/Height/Width программа проверяет, что окно влезет во фрейм и подправляет, если не так...
Это очень хорошая, хотя и нетривиальная в понимании и реализации, идея.
Странно, что её не сделали в стандартных шаблонах для MDI окон ...
В своё время, по совету Юрия, сделал упрощённый вариант - сразу отпала масса
проблем с запуском программы через терминальный сервер на рабочих станциях
с разными разрешениями экрана.

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 14:23
Алексей- Софт-Центр
Добрый день!
Задал вопрос и пропал. Сори)))))
Немного ответы не о том. Вопрос не в том как исправить ситуацию, а как завершить процесс в программе. А именно, как все-таки это окно увидеть и нажать таки на кнопку.
Причину сегодня нашёл. В описании окна AT(222,-20,22,22) второй параметр был отрицательным. Проверил всю прогу, нашёл ещё с десяток таких описаний окон. Возможно при конвертации из 5 в 6 или из 6 в ... в 10.
Спасибо всем за ответы
Алексей

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 14:40
Ал
Игорь Столяров писал(а): 09 Сентябрь 2017, 14:09
Yufil писал(а): 09 Сентябрь 2017, 10:17При запросе Xpos/Ypos/Height/Width программа проверяет, что окно влезет во фрейм и подправляет, если не так...
...
Это очень хорошая, хотя и нетривиальная в понимании и реализации, идея.
...
ну-ну :mrgreen:, вообще спорить| :nr: можно долго...
видимо, все зависит от контекста использования..., в большинстве случаев можно обойтись простыми "штатными" средствами среды - вкл/выключить галочки - не сохранять данные этого окна в ини, запретить растягивать окно, поставить размер и вывод по дефолту при открытии в центр экрана и тп.

т.е. например, в ситуации ТС в первом посте, возможно можно было бы результат сообщения/диагностики вывести стандартным мессенджем с той самой кнопкой [ОК]?

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 16:07
gopstop2007
может все проще, при считывании из ini в параметрах окна не должно быть отрицательных значений и подставлять по умолчанию, если таковые оказались?

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 16:45
Yufil
Ну вот у тебя приложение из пары десятков APP, с кучей окон. И все ini уходят в каталог windows (не только позиции окон, ещё самые разнообразные настройки). Размер ini-файла перевалил за 32К, после чего начались сбои. Юзер поставил себе Win8 и жалуется, что у него нифига не пишется, потому как писать в каталог Windows просто запрещено. Более того, если на одном компе работает несколько юзеров, у них должны быть РАЗНЫЕ конфигурации.

Были написаны процедуры MyGetIni и MyPutIni ( аналоги GetIni и PutIni, только на Кларион) и процедура SetMyIniProc, запускающаяся при инициализации приложения и подменяющая стандартные GetIni/PutIni на мои функции. Запись в c:\windows\program.ini подменялась на %LocalAppData%\...\program.ini, более того, если первый файл был, а второго не было, происходило копирование. Ну и с окнами разобрался. В принципе, это где-то есть на форуме... ну и кусок из работающей программы https://mega.nz/#!EgJC3T7L!XCoPZyrJrVk- ... 7xzQADMEec .

В этом куске нет переадресации ini-файла, а ещё SetMyIniProc временный каталог чистит, можно убрать, если не...

Улетевшее окно

Добавлено: 09 Сентябрь 2017, 16:48
Yufil
gopstop2007 писал(а): 09 Сентябрь 2017, 16:07может все проще, при считывании из ini в параметрах окна не должно быть отрицательных значений и подставлять по умолчанию, если таковые оказались?

А оно может быть не отрицательным, а за пределами фрейма... Надо выяснить размеры mdi-фрейма и вписаться в него...