|
|
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
0) Точка с запятой означает перенос команды на следующую строку. ADD OBJECT - это ОДНА команда. Все, что после WITH - это параметры , которые идут, как и положено параметрам, через запятую. 1) Событие QueryUnload - это событие формы. Для PageFrame ты ее, конечно, тоже можешь написать, но там она будет не событием, а просто неким пользовательским методом, который еще надо вызвать. Соответственно, закрытие формы не приводит к выполнению команды CLEAR EVENTS, поскольку событие QueryUnload формы осталось не перекрытым и, естесственно, форма остается висеть. 2) В данном случае делать переменную ofrm глобальной нет никакой необходимости. Форму бедет "держать" команда READ EVENTS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2006, 00:35 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
ВладимирМ0) Точка с запятой означает перенос команды на следующую строку. ADD OBJECT - это ОДНА команда. Все, что после WITH - это параметры , которые идут, как и положено параметрам, через запятую. Да, это я понял и уяснил. ВладимирМ 1) Событие QueryUnload - это событие формы. Для PageFrame ты ее, конечно, тоже можешь написать, но там она будет не событием, а просто неким пользовательским методом, который еще надо вызвать. Это моя ошибка, я ее уже устранил, но вино забыл исправить в посте. Конечно я не туда поместил событие ВладимирМ Соответственно, закрытие формы не приводит к выполнению команды CLEAR EVENTS, поскольку событие QueryUnload формы осталось не перекрытым и, естесственно, форма остается висеть. Я поместил условие CLEAR EVENTS на событие формы ВладимирМ 2) В данном случае делать переменную ofrm глобальной нет никакой необходимости. Форму бедет "держать" команда READ EVENTS Я сменил видимсоть переменной, но это особо ни к чему не приводит Код: plaintext 1. 2. 3. 4. 5. 6. 7. Работа происходит так, загружается и форма и окно с ообщением. Естественно после закрытия окна формы завершение работы не происходит. В режиме IDE приходится лезть в Project и делать cancel программы. В рантайм режиме - только путем завершения процесса. Объясни, пожалуйста, как остановить работу главного программного файла после появления формы, а когда работа с формой завершена передать управление событию Clear Events. Т.е. если форма создана визуальным редактором, я просто использую команду DO FORM FORM1 READ EVENTS а вот через программный интерфейс ничего не получается. И добавление Read events и return в разных сочетаниях Ничего не помогает. Понимаю, что я просто не понимаю каких-то общих принципов. Просьба или пояснить на живом примере, или отослать к первоисточникам (ссылкам) Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2006, 11:03 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Еще немного подумал и сделал так. Кажестя работает. Но желательен комментарий специалиста. А то я не совсем понимаю, что делаю:-). Не люблю делать что-то не понимая.. файл config.fpw Код: plaintext 1. 2. главный исполняемый файл (источник) Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. Интересно, что если вообще исключить строчку Clear Events из главной программы - то exeшник работает точно также как из Clear Events. Почему так происходит? Вероятно, потому, что объектная переменная локальная и умирает после выхода по return, что автоматически приводит у умиранию runtime, поскольку у меня есть событие при выгрузке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2006, 11:19 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Просто у тебя две команды выполняют схожие действия и поэтому путают тебя. Код: plaintext 1. не удалишь. Для простоты можно считать, что у нее выполняется свой READ EVENT. Поэтому надо заботиться чтобы эту форму ликвидировать через THISFORM.RELEASE. И только после удаления твоей формы сработает следующая строка в твоей программе: READ EVENT. На нем твоя программа остановиться, выполняя события, методы и ожидая, когда ты дашь команду CLEAR EVENT, чтобы продолжить выполнение дальше. В твоем случае команду MESSAGEBOX. Мне думается что в твоем простом примере пара READ\CLEAR EVENT излишняя. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2006, 11:39 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Кузнецов Игорь Просто у тебя две команды выполняют схожие действия и поэтому путают тебя. Код: plaintext 1. не удалишь. У него используется форма ShowWindow = 2 - As Top-Level. Такие формы не могут быть модальными по определению. Т.е. параметр 1 в методе Show() - игнорируется. Поэтому "держит" форму только и исключительно READ EVENTS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2006, 18:14 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
2 cripton Команду CLEAR EVENTS надо давать в событии UNLOAD-формы. В любых других событиях нет никакой гарантии, что до этой команды вообще дойдет дело. В том же событии QueryUnload обычно никто никаких явных команд по закрытию не пишет. Там делается перенаправление на общий метод закрытия формы. Как пример, такое сойдет. Но для рабочей программы - не годится. Почитай все-таки описание к настройке ShowWindow = 2. И что там написано по поводу WindowType. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2006, 18:20 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
да я согласен на счет методоа QueryUnload. Дело в том что у меня есть некоторый опыт работы с формами в VBasic и Delphi. В частности Vbasic есть событие Close и UnLoad. Я вполне понимаю разницу между этими событиями. Close идет после UnLoad и фактически к этому моменту все объекты формы становятся в nil. В FoxPro еще не все догоняю. Понимаю, что среда тут особая, хотя и логически во многом схожая. Я прочитал справку и хорошо понял, что означает As Top Level и почему такая форма не может быть модальной по определению. Это было бы прямое нарушение многозадачности винды, несомненно. Не совсем я понимаю когда требуется вызыв события read events и команды clear events, В случае создания формы в ручную и вызывая ее из главного программного модуля с помощью read events я организую точку останова. Поработав с формой и закрыв ее, даже используя команду clear events - я тем неменее не завершаю процесс, запущенный главным программным модулем. В случае же программного создание формы как я понимаю все происходит непосредственно из главного программного модуля, поэтому завершение приложения при закрытии формы происходит автоматически Не понимаю только почему так происходит. Какова кухня??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2006, 21:10 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
criptonВ случае создания формы в ручную и вызывая ее из главного программного модуля с помощью read events я организую точку останова. Поработав с формой и закрыв ее, даже используя команду clear events - я тем неменее не завершаю процесс, запущенный главным программным модулем. Приведите пример. Из этого описания следует, что до команды CLEAR EVENTS дело вообще не дошло. Либо команда READ EVENTS была дана повторно ПОСЛЕ команды CLEAR EVENTS criptonВ случае же программного создание формы как я понимаю все происходит непосредственно из главного программного модуля, поэтому завершение приложения при закрытии формы происходит автоматически В случае DO FORM все также происходит непосредственно из главного программного модуля. Дело вовсе не в этом, а в последовательности событий. Где-то, что-то напутали criptonНе понимаю только почему так происходит. Какова кухня??? "ТщательнЕе надо" (с) Все просто при любом способе запуска формы. Ни команда DO FORM ни команда oForm.Show() в случае формы As Top-Level не могут сформировать процесс ожидания события пользователя. Это значит, что после выполнения этих команд выполнение главного стартового модуля будет продолжено. Если не организовать точки останова, то выполнение главного стартового модуля будет завершено и приложение FoxPro завершит свою работу. Чтобы организовать точку останова для ожидания события пользователя дается команда READ EVENTS. Она и "держит" весь процесс. Когда дается команда CLEAR EVENTS (не важно где), точка останова по READ EVENTS отменяется. Система больше не ожидает событий пользователя. Она выполняет все оставшиеся в стеке события, затем управление передается в главную стартовую программу на команду, непосредственно следующую за командой READ EVENTS. "Подвесить" систему в такой идеологии может только не закрытая форма. Форма не может быть закрыта, если остался не завершенным какой-либо ее метод или есть не обнуленная ссылка на внешний объект. Например, из метода формы вызвали модальную форму. В этом случае, метод формы не может быть завершен, пока не будет закрыта вызванная модальная форма. Как следствие, сама форма не может быть закрыта. Ее "держит" дочерняя модальная форма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2006, 12:29 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Все спасибо. Кажется разобрался во всех моментах. Действительно не важно каким образом создана форма. Главное, в особенности, если это форма типа AS TOP LEVEL, корректное завершение ее, т.е. отработка события clear events в нужном методе, в нашем случае UnLoad. Если данное событие поместить в метод Release нас ожидает конфуз с не завершением процесса и тогда, кажется, что нужно выполнять Clear Events в программном файле. Но это только видимость для данного конкретного случая. Еще раз большое спасибо за полезную дискуссию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2006, 16:57 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33670430&tid=1591874]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
162ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 487ms |

| 0 / 0 |
