powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как корректно завершить приложение?
24 сообщений из 24, страница 1 из 1
Как корректно завершить приложение?
    #34769816
Есть главное окно программы, в котором есть модальное окно с пунктом меню "Выход" (меню на основе класса)
Есть процедура vixod:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IF MESSAGEBOX("Выйти из программы?",  036 , "Выход") =  6 
	CLOSE ALL
	RELEASE ALL EXTENDED
	ON SHUTDOWN
	RELEASE WINDOW
	CLEAR WINDOW
	SET CLASSLIB TO
	ON ERROR
	CLEAR EVENTS
ELSE   
    _Screen.Refresh()	
ENDIF

так вот при выборе пункта меню "Выход" на модальной форме или нажатии на "кретик" главного окна программы форма уничтожается, а главное окно программы остаётся.... но и конечно же потом при нажатии на "крестик" главного окна программы выдаётся сообщение "Невозможно завершить Visual FoxPro".... в главной программе проекта после READ EVENTS ничего нет..

как решить проблему выхода из программы в данном случае?
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34769940
немного переделал и главный файл проекта и саму процедуру vixod
главный файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
........
ON SHUTDOWN DO vixod
....
DO FORM mainform
READ EVENTS

*-очищаем среду
CLOSE ALL
CLEAR EVENTS
CLEAR ALL
ON ERROR
ON SHUTDOWN

и сама процедура vixod:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IF MESSAGEBOX("Выйти из программы?",  036 , "Выход") =  6 
    CLOSE ALL
    RELEASE WINDOW
    CLEAR WINDOW	
    RELEASE ALL EXTENDED
    SET CLASSLIB TO
    ON ERROR
    CLEAR EVENTS
ELSE   
    _Screen.Refresh()	
ENDIF

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

так как сделать так, чтобы по одному какому-нибудь из действий: либо по нажатию на кнопку "Выход" на форме, либо на нажатию на "крестик" главного окна приложения, сразу закрывать и форму и главное окно приложения, т.е. сразу выйти из приложения?
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34769946
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите поиск по форуму - люди уже выкладывали свои наработки. Могу повторить, то что я использую, может пригодятся некоторые идеи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
*********************************************************************
* Program....: EXITPROG()
* Compiler...: Visual FoxPro  08 . 0 
* Abstract...: close application using cross in the form
*********************************************************************
PROCEDURE ExitProg
  nAnswer = MESSAGEBOX('Would you like to close program and probably lose unsaved information?', 4 ,'Attention!')
  *!*    IF _VFP.STARTMODE= 0 
  *!*      ON SHUTDOWN
  *!*      CLEAR EVENTS
  *!*      QUIT
  *!*    ELSE
  IF nAnswer =  6 
    ON SHUTDOWN
    LOCAL I
    FOR I = _SCREEN.FORMCOUNT TO  1  STEP - 1 

      TRY
        _SCREEN.FORMS(I).ACTIVATE()
        _SCREEN.FORMS(I).HIDE()
        *      _SCREEN.FORMS(I).WINDOWTYPE =  0 
        _SCREEN.FORMS(I).RELEASE()
      CATCH TO oErr

      ENDTRY

    ENDFOR
    RELEASE ALL
    SET SYSM TO DEFA
    QUIT
    *!*      ENDIF
  ENDIF
  *RETURN
ENDPROC
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34769951
да всё у перерыл....
и всё равно сначала закрывается только форма и остаётся только главное окно приложение...

и так тоже...
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34769977
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦиклаи так тоже...
Ну тогда странно... У меня как раз для таких случаев цикл - перебирабтся и закрываются все формы сначал...
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34770046
Если форма не модальная, то всё ОК, а если модальная, то почему-то сначала закрывается только она, а потом, чтобы выйти надо опять жать на "крестик" главного окна приложения...
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34770074
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прежде всего вызываешь модальное окно командой
DO FORM my.scx TO lReturn
IF lReturn
ThisForm.Release
ENDIF
В процедуре Vihod
IF MESSAGEBOX("Выйти из программы?", 036, "Выход") = 6
ThisForm.lRet = .T.
ThisForm.Release
ELSE
_Screen.Refresh()
ENDIF
В методе Unload модальной формы
RETURN This.lRet && значение This.lRet = .T. если выбран пункт меню ВЫХОД
В главном окне проги, в DESTROY
CLEAR EVENTS

Ну а в запускающей программе, после
READ EVENTS

CLEAR ALL
*******
Ну и так далее, т.е. удаляешь все переменные, библиотеки, очищаешь память....
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34770403
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦиклаЕсли форма не модальная, то всё ОК, а если модальная, то почему-то сначала закрывается только она, а потом, чтобы выйти надо опять жать на "крестик" главного окна приложения... О какой модальной форме идет речь? Если mainform, то посмотри свой код:
Код: plaintext
1.
2.
DO FORM mainform
READ EVENTS
Модальная mainform не возвращает управление. Соответственно отрабатывает твой vixod(), закрывается mainform, а потом все переходит на READ EVENTS
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34770745
модальная форма mainform
вот я и спаршиваю как в таком случае лучше организовать выход?
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34771057
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
модальная форма mainform
вот я и спаршиваю как в таком случае лучше организовать выход?
Я же вроде напиСАЛ как... Не понятно?
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34771127
Вцелом всё понятно. Спасибо.
Только вот это не совесем. В чьём DESTROY делать CLEAR EVENTS? Если скрина. то как?

В главном окне проги, в DESTROY
CLEAR EVENTS


И вдогонку ещё один вопрос. Если в приложении возникает какаянить ошибка, появляется соответствующее сообщение с тремя кнопками, и когда выбираешь "Прекратить", то зацикливается на процедуре выхода, т.е. появляется сообщение "Выйти из программы?", и хоть "да", хоть "нет", то всё равно снова появляется это сообщение... только помогает снятие приложение через диспетчер задач. Как это побороть?
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34771163
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦикламодальная форма mainform
вот я и спаршиваю как в таком случае лучше организовать выход?
Для тех кто в танке. Одно из двух:
1. Убрать READ EVENTS
2. Сделать форму немодальной
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34771346
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если главное окно программы SCREEN (главное окно фокса), то код запуска модальной формы будет таким
Код: plaintext
1.
2.
3.
4.
DO FORM my.scx TO lReturn
IF lReturn
   ThisForm.Release
   CLEAR EVENTS
ENDIF
Ну а боротся с ошибками - написать свой обработчик ошибок
Например
ON ERROR MyPrg.prg

* MyPrg
=MESSAGEBOX("Ошибка")
CLEAR EVENTS

Только не забыть востановить стандартный обработчик ошибок
ON ERROR

Хотя я лично противник использования главного окна Фокса. Свои приложения всегда делаю как As Top-Level Form, а главное окно подавляю. Намного удобнее в отладке и нет необходимости перегружать Fox при ошибках во время разработки программы.
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34785795
srsberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T КонецЦикламодальная форма mainform
вот я и спаршиваю как в таком случае лучше организовать выход?
Для тех кто в танке. Одно из двух:
1. Убрать READ EVENTS
2. Сделать форму немодальной

Для тех, кто не в танке:
Не убирая Read Events и оставив форму модальной.
Задача:
1) существует ДЕРЕВО форм: родительская и ей порожденные (и ими порожденные). При этом, расчитываем на то, что какие-то порожденные формы могут просто минимизироваться, не закрываясь (или просто быть в фоне).
2) необходимо организовать:
а) корректное закрытие форм таким образом, чтобы при закрытии формы, кроме нее закрывались и все, ей порожденные
б) корректное общение между формами без Public и прочих рекомендованных маразмов - неудобно
в) невоможность запуска 2-го экземпляра одной и той же формы - свернув формочку, пользователь, обычно забывает про это и лезет запускать ее повторно.

Решение - коротко.
Делаем класс на основе формы. Добавляем ему 2 проперти: pParent (.null.) и pChildFrm[1] (.f.)
Вызов этого удовольствия делаем, передавая ему параметры массивом, первым элементом которого является this формы-родителя.
При инициализации (Init) класса:
а) сохраняем this родителя в pParent
б) проверяем весь массив pChildFrm родителя (а доступ у нас спокойный - pParent (this родителя))
на наличие Caption порождаемой формы. Если есть, активизируем
this.pchildfrm .WindowState= 0
this.pchildfrm.show
и возвращаем .f. в Init-е), если нет - расширяем pChildFrm родителя и вносим туда this порождаемой формы
Кстати, получили нормальный обмен данными между формами:
Порождаемая - родителю: this.pParent. ...=что угодно
родитель - порождаемой: this.pChilFrm[?]. ...=что угодно
Ликвидация методом Release
а) выставить в .null. себя в pChildFrm родителя и поджать этот pChildFrm
б) послать release всем своим pChildFrm:
For i=1 To Alen(this.pchildfrm)
this.pchildfrm[1].release
EndFor
Обратите внимание на это: this.pchildfrm[1].release
Дело в том, что порожденные формы на Release делают то же самое. Т.е., после release 1-й порожденной формы она, в том числе, высталяет себя в .null. и поджимает pchildfrm. Таким образом, после каждого вызова this.pchildfrm[1].release, pchildfrm сокращается и на место 1-й становится следующая.
Запуск главной формы стандартный:
DO form form1 Name Form1
Read Events
Закрытие ее тоже простое. Оно у меня на кнопке (и в меню)
This.parent.Visible= .F.
......
Clear Events
This.Parent.Release

Проблем аж никаких. Все формы - на основе вышеописанного класса, все - модальные.
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34785838
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое количество одновременно открытых окон, говорит о плохой организации программы. Или Вы 1С насмотрелись? Как по моему они уже сами запутались, если для пользования их прогой приходится специально людей обучать по два месяца!!!!! Для нормальной работы необходимо всего два одновременно открытых окна (главное и например какой нибудь справочник для заполнения). Тем более позволять пользователю свернуть дочернее окно. Если например пользователь открыл форму заполнения таблицы наименований товара, то он не должен иметь возможность сделать ещё что то, пока он её не закроет. Иначе с "пытливыми" умами наших юзеров, они черт знает что натворят. Так что смотрите внимательнее за своими программами сейчас, когда работать приходится руками и головой, потом придётся ещё и ножками побегать!!!
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34803541
srsberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 MiklS
1. Основные+вспомогательные (калькулятор, календарь, прочая дребедень...) - уже сколько?
2. Учитывая, что гридом я последний раз пользовался еще в 2.0 (там правда его, как такового, не было - организовывался на browse), что работаю я на SQL-сервера, как минимум, добавляется еще одна форма - изменения данных.
3. А чего я должен пользователя ограничивать? Он хочет одновременно иметь 10 окон - флаг ему в руки. Кстати, при специфике работы моих кадров, иметь одновременно 4..6 основных окошек - очень удобно... Мое дело - сделать так, чтобы это все правильно работало при пользователе-идиоте. Так, чтобы все вовремя обновлялось, чтобы при попытке открытия уже открытой формочки, она вела себя правильно, чтобы все дочерние формочки закрывались при закрытии родительской.
Пока не жалуются - уже 5 лет классу пошло. Особой беготни тоже не видать. А класс этот я уже практически всюду сую, даже если 2-3 открытые формочки - все равно удобно.
Но это вопросы такие... Пользователю должно быть удобно - вот наш с Вами принцип. Можно мило поболтать о взаимодействии форм, о корректном закрытии - о внутренней нашей с Вами кухне. А пользователю это до... Если Вы считаете, что существует жесткая, везде одинаковая связь между кол-вом окошек и удобством пользователя, я с Вами не соглашусь. Предпочитаю Oper-у Internet Explorer-у.
С уважением, всегда рад...
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34803563
srsberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 MiklS
Сорри, не заметил сразу...
MiklS Если например пользователь открыл форму заполнения таблицы наименований товара, то он не должен иметь возможность сделать ещё что то, пока он её не закроет
??? Одно заполнение формы - один товар из одной партии - я правильно Вас понял? И почему он не должен иметь возможности, не закрывая эту формочку, работать с этим товаром, после того, как уже занес его? ИМХО, один из самых безопасных вариантов. ИМХО, что-то у Вас не так, если в этих условиях можно что-то наворочать... (Варианты: прямое редактирование рабочих таблиц - прямо из формы, без кнопочки "ОК"("ЗАНЕСТИ", или как там?); вешать рабочие таблицы непосредственно на комбобоксы; играться с private data sessions, некорректные обновления данных и пр. - много вариантов есть...) По крайней мере, у меня, примерно в аналогичной ситуации (занесение нового прибора учета) - все тип-топ, можно сразу с ним работать, не закрывая эту формочку - висит она себе автономно , и все...
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34804820
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обычно всегда экономишь место на экране. По этому моё мнение - не нужно засорять экран другой информацией. Зачем пользователю окно справочника, если он закончил с ним работать? Не у всех большие мониторы, по этому нужно всегда ориентироваться 600*800, ну а там раздвинится, то хорошо. Конечно если юзер хочет, можно и 20 окон прилепить... но все равно нужно стараться всю необходимую информацию компактно разместить на одном окне, ну а все вспомогательные окна это уже второстепенно.
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34809538
srsberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, согласен с Вами, сколько лет прошло, а все равно на 800х600 все пишешь... У меня дисплей домашний wide 1680х1050, видели бы Вы эту 800х600 на нем - кур я м на смех...
Что же касается окошек - нерабочие можно закрывать, а можно и сворачивать. Или вообще бросать...
Подвесить одновременно несколько окошек - очень удобно - тот же справочник, к примеру. Нет у тебя прибора - не закрываешь свое основное окно, а поднимаешь справочник, добавляешь - и работаешь дальше себе. Попробуйте сами. Я сам очень долго писал по этому принципу - минимум открытых окон, не закроешь предыдущее - не попадешь дальше, а попробовал другой - кое-где очень удобно. (ИМХО).
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #34809823
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я выхожу из этого положения следующим способом (см. пример)
На главной форме распологаем Grid например со списком продаж. Слева (можно где угодно) слайд меню (нечто похожее на меню Explorer), изменяющееся при определённых условиях (в примере его нет, заменено на простые кнопки).
При необходимости редактировать какой либо справочник, Grid закрывается другим окном для изменения этого справочника. Получается и красиво и место на экране экономится. Пользователь всегда видит как бы одно окно.
Посмотрите, может пригодиться!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как корректно завершить приложение?
    #36575267
Elenka_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перечитала массу всего, многое почерпнула, но один вопрос остался.
Есть prg-файл
_SCREEN.Visible = .F.
SET ESCAPE OFF
..... && настройки
SET DATE TO GERMAN
SET CENT ON
SET DEFAULT TO ..... && путь

DO FORM lg_form
READ events

close data
CLEAR EVENTS

Bызываемая форма As Top-Level с двумя кнопками -Расчет и Выход.
Код кнопки Выход
CLEAR EVENTS
CLOSE DATABASES
CLOSE all
RELEASE ALL
_screen.ActiveForm.Release()
RELEASE ALL


Все бы замечательно, но форма стартует без окна фокса, а при выходе я от этого окна никак избавиться не могу. В каталоге с программой лежит
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #36575269
Elenka_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каталоге с программой лежит config файл с SCREEN=OFF
Не пойму, фокс не видит это конфигурационный файл? Или что я делаю неверно.
Очень хочется избавиться от главного окна.
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #36575707
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elenka_DВ каталоге с программой лежит config файл с SCREEN=OFF
Не пойму, фокс не видит это конфигурационный файл? Или что я делаю неверно.
Очень хочется избавиться от главного окна.
Для начала, не надо поднимать тему 3-х летней давности. Создавайте новую

Вы не включили "случайно" файл конфигурации внутрь EXE? В этом случае именно этот "внутренний" файл конфигурации и будет использоваться. Т.е. файл Config.fpw вклюен в файл проекта PJX.

Определить, какй файл конфигурации подхвачен можно командой SYS(2019)


Насчет "избавиться" от основного окна FoxPro - это Вы зря. Вам все-равно придется создавать главную форму приложения. Обычно для этих целей как раз и используют основное окно FoxPro от которого Вы так стараетесь избавится. Естесственно, заменяя системное меню своим и устанавливая свой ToolBar.

Построение приложения на базе As Top-Level форм требует более тщательного программирования. Больше сопутствующих проблем приходится решать. Это "не естесственное" построение приложения с точки зрения FoxPro.
...
Рейтинг: 0 / 0
Как корректно завершить приложение?
    #36577481
Elenka_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу темы учту.
По поводу главного окна. У меня как раз уже и есть главная форма приложения и на ней не будет никакого меню, только три кнопки и текст для информации. Формочка маленькая, бухгалтерскую часть она замечательно выполняет. Просто пользователи пугаются всяких незнакомых окошек и хотят, чтоб если они нажали на кнопочку "Выход", так форма тихо и бесследно закрылась.

Спасибо за консультацию.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как корректно завершить приложение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]