|
|
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Задача: Необходимо сделать форму с двумя страницами на каждой, из которых присутсвует один combo box и два text-поля. Проблема: не могу программно описать (из справочной системы неясно как это сделать) или добавить объекты combobox и text, принадлежащие соотвествующим страницам. Как делал: Код: 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. Очевидно, что при выполнении ADD OBJECT cbolistitem AS combobox WITH ; он создается на форме и не принадлежит первой странице, но как описать прикрепить его к первой странице не понял. Помогите, кто может. Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 11:19 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 13:05 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
спасибо, но этого недостаточно для полного понимания. я пробывал сделать так Код: 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. но мне нужна еще процедура инициализации combo box вида Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. пытался ее приспособить так Код: 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. выдает ошибку. Если можно, опубликуйте код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 13:31 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Сделай DEFINE CLASS MyCombo AS Combo Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 13:55 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Понятно. Спасибо за помощь. К сожалению хорошей справки по фокс про у меня нет. А некоторые общие технологии ООП тут работают немного отлично, чем скажем в Дельфи. Но подход ясен. Только один момент. Определение класса mycombo слуедует делать внутри определения класса wizardexample или вне его? Кажестя, нужно делать вне его... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 14:21 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Если появляются такого рода вопросы, то Fox сам может подсказать что,как и куда нужно запихать. Для этого создаёшь свой класс (например на основе Form) закидываешь на него Page, заполняешь Page combobox(ами) , text(ами), прописываешь Init(ы) и т.д. Нажимаешь на кнопку Class Browser в нём кнопку View Class Browser и видишь свой текст программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 15:32 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Ага!!! Вот это я сегодня полдня искал, где бы посмотреть текстовое описание созданной формы. Как например в дельфях. Ну теперь гора с плеч. Баальшой фенькс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 16:54 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Владимиру! Сделал как доктор прописал:-) Но сразу возникли проблемы. Создал сначала форму, посмотрел ее код, добавил необходимые строки вот код Код: 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. однако при компиляции или запуске программы сразу возникла проблема в строке Код: plaintext т.е. неизвестный объект. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 17:13 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Ага, залезь, посмотри. Создай форму, прилепи страничный блок, запихни на него какой-нибудь лабель, сохрани, посмотри код в классброузере, посмотри хелп на DEFINE CLASS. Попробуй код скопировать и выполнить Думаю, вопросов у тебя поприбавится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 17:23 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
m.a.vСделай DEFINE CLASS MyCombo AS Combo Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Попытался сделать, как ты мне указал. Вероятно, что-то не совсем верно вот код Код: 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. Каковы ошибки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2006, 17:30 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Вот этот код работает только форма не остается на экране после завершения prg Я поставил точку останова форма висит после пропадает честно говоря почему не знаю. Кто знает прошу поделиться. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 08:35 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 08:57 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
prg вызывается из формы т.е. команда read events уже была. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 09:08 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Если вас всех так тянет работать с форами As Top-Level, то ознакомтесь с особенностями их применения в FoxPro. Хотя бы HELP читайте по тем командам, которые используете! По умолчанию, FoxPro рассчитан на работу In SCREEN. Т.е. внутри основного окна FoxPro. Для As Top-Level форм будете всегда налетать на грабли. Не то, чтобы их нельзя было обойти, но для FoxPro - это "не стандартный" путь. В данном случае: форма As Top-Level - не может быть модальной. Просто не может. Следовательно, команда loform.Show(1) отобразит форму, но останова не произойдет, поскольку форма НЕ модальная. Код благополучно выполниться до конца, а поскольку переменная loform объявлена как LOCAL, то эта переменная и связанный с ней объект будут уничтожены по завершению процедуры. Я бы рекомендовал сначала поработать с обычными формами. ShowWindow = 0. А вот когда научитесь, тогда и переходите к As To-Level. Тут разные организационнные решения. Разная идеология построения приложений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 10:46 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
ВладимирМ благодарю за ответ действительно поменял local на public все отлично работает. Видно не уследил в чужем коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 12:08 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
m.a.vВладимирМ благодарю за ответ действительно поменял local на public все отлично работает. Видно не уследил в чужем коде. Я присоединяюсь к благодарности. Действительно проблема в типе переменной. m. a. v. - это моя вина, я просто использовал примеры фокса из справки. В одном случае заметь в примере используется public, в другом local. Но поскольку у меня ни один код не прошел, то данная промашка и не была замечана. Однако пример, который ты-таки добил:-) страдает массой недочетов. Взять хотябы туже процедуру INIT для класса MyCombo. Я полагаю иметь два разных комбо на каждой из страниц и с разными значениями. Класс же следует описывать как-то более обще, без доп данных, а процедуру описывать там где в ней есть особая потребность. Я поступил так как мне рекомендовал Владимир и скопировал код формы , сделанной вручную, как текст программы. Однако - результат плачевный - смотри письмо днем раньше. Насчет модальных режимов формы и использования ее как Top level, а что тут сложного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 17:00 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Вот код, который работает на ура. Код: 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. Если сравнивать с предыдущими примерами, мы видим, что разница в том, что все новый объекты класса мы добавлем прямо на форму. В случае же использования страниц pageframe, мы имеем дело с одним объектом pageframe, у которого есть множество страниц и вот тут ничинается билеберда, которая простым способ не решается к сожалению. Несмотря на то, что дисскусия была довольно острой, особого конструктивизма практически нет, разве только m.a.v. добрая душа. Понятно, что сделанные вручную формы - нормальные формы, но хотелось бы грамотно формировать формы программным способом -любой сложности и по возможности простым способом. Пока все примеры фокса, которые я изучил внимательно, описыват процесс создание формы и ее контролов, только на этой самой форме. В нашем исходном случае, вероятно, надо идти таким образом. Создавать собственный класс mypageframe и уже от него плясать по видимому... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 18:23 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
criptonПонятно, что сделанные вручную формы - нормальные формы, но хотелось бы грамотно формировать формы программным способом -любой сложности и по возможности простым способом. Вы уж выберите что-то одно: либо "любой сложности", либо "простым способом". Сложную форму простым способом сделать в принципе невозможно. Не важно каким инструментом и в каком языке программирования. При программном создании классов - контейнеров (не только форм, а вообще любых контейнеров) в FoxPro есть ограничение на количество уровней вложенности. В пределах одной конструкции DEFINE CLASS не может быть больше одного уровня вложенности объектов по ADD OBJECT. То, что показывает Class Browser (он может показать больше одного уровня вложенности у класса созданного в дизайнере) не всегда можно реально запустить из программы. Будут именно описанные ошибки на этапе компиляции. На практике, это означает, что необходимо делать иерархию классов. Т.е. описывать отдельными конструкциями DEFINE CLASS собственно PageFrame, а потом другим DEFINE CLASS добавлять уже готовый класс в класс формы. Для таких объектов как PageFrame и Grid все осложняется тем, что у них добавление объектов Page и Column осуществляется не командами ADD OBJECT, а простым указанием количества этих объектов. До некоторой степени проблему можно решить используя свойства MemberClass и MemberClassLibrary. Но здесь проблема в том, что через эти свойства можно указать только один класс общий для всех добавляемых членов. Вот работающий код. Дальше можешь украсить по вкусу Код: 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. Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2006, 23:49 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
ВладимирМ criptonПонятно, что сделанные вручную формы - нормальные формы, но хотелось бы грамотно формировать формы программным способом -любой сложности и по возможности простым способом. Вы уж выберите что-то одно: либо "любой сложности", либо "простым способом". Сложную форму простым способом сделать в принципе невозможно. Не важно каким инструментом и в каком языке программирования. . Согласен формулировка подкачала :-) Сам других ругаю за такие формулировки, а вот сделал перл... Имелось ввиду, конечно, не любой сложности, а проектирование форм содержащие другие контейнеры такие как grid и frame. Спасибо за код программы, становится более понятно как действовать. Каюсь фокс знаю очень плохо (в смысле концепции). Ничто не мешает, конечно, изучить сначала, но как всегда надеешься на аналогию с другими система и попадаешь впросак. ВладимирМ Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами. А нельзя примерчик опубликовать, неочень доходит как это делать. заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2006, 13:22 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
cripton ВладимирМ Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами. А нельзя примерчик опубликовать, неочень доходит как это делать. заранее спасибо Я имел в виду сделать DEFINE CLASS на основе базового класса CONTAINER. Накидать в этот контейнер нужные объекты через ADD OBJECT, а в событии INIT для PageFrame делать AddObject() нужного класса CONATINER. Т.е. получается внутри страницы вставлен только один объект-контейнер (CONTAINER), а уже в нем все остальные объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2006, 14:21 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
ВладимирМ cripton ВладимирМ Чтобы не писать кучу команд AddObject для каждой Page можно сделать для каждой страницы описание объекта-контейнера. И через AddObject() добавлять нужный контейнер со всеми объектами. А нельзя примерчик опубликовать, неочень доходит как это делать. заранее спасибо Я имел в виду сделать DEFINE CLASS на основе базового класса CONTAINER. Накидать в этот контейнер нужные объекты через ADD OBJECT, а в событии INIT для PageFrame делать AddObject() нужного класса CONATINER. Т.е. получается внутри страницы вставлен только один объект-контейнер (CONTAINER), а уже в нем все остальные объекты. Да понял. Делаем скажем два класса на базе CONTAINER включаем в него объект COMBOBOX и 2 TEXTBOX. Определяем процедуру INIT и CLICK для COMBOBOX в рамках данного контейнера. Далее уже формируем основную форму с объектом на базе PAGEFRAME, для которого в процедуре INIT создаем объект, ранее определенный как контейнер. Кажется все ясно и разумно. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2006, 15:51 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Попробывал сделать задачу с контейнером. Однако не пошло. При компиляции кода выдает ошибку при определении класса mypage на первой строке добавления объекта - типа неизвестная команда код здесь: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2006, 16:17 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
В этом коде сразу несколько ошибок. 1) Перечитайте свой собственный пост в начале всей это ветки. Посмотрите синтаксис команды ADD OBJECT. Там он совершенно корректный. А в приведенном примере вы забыли точки с запятой и просто запятые. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 2) Когда объект создается через метод object.AddObject(), то, по умолчанию, он создается с настройкой Visible = .F. вне зависимости от того, что было прописано в классе. Т.е. делать новый объект видимым надо в любом случае Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 3) Это уже не столь принципиально. Надо задать размеры объекта контейнера иначе по умолчанию он примет некоторые стандартные размеры. Если не ошибаюсь, что-то около 100х100 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2006, 19:20 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Спасибо за помощь. Не догадывался, что точка с запятой в данном случае строга обязательна... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2006, 15:43 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#18+
Возникла проблема создания исполняемого файла и отчуждения готового приложения. Раньше я всегда в своих примерах делал примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. когда я попытался сделать то же самое для кода, который обсуждался выше, возникли проблемы. Во-первых, после закрытия формы приложение на завершается полностью. Во-вторых, не вызывается messagebox. Я почитал статью про то как делать главный файл программы, попытался повторить опыт, но что-то не так. Приложение не закрывается, попытка его закрыть вызывает сообщение в моей процедуре, которое работает циклически..... В чем может быть проблема объяните не путевому. Пока сделано так.... Код: 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. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2006, 16:43 |
|
||
|
Создание формы программным способом
|
|||
|---|---|---|---|
|
#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?all=1&fid=41&tid=1591874]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 523ms |

| 0 / 0 |
