|
|
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
я работаю с Visual FoxPro 8 SP1 у меня есть модальная форма диалога входа (ну там имя, пароль, все такое). во время работы этой формы мне не нужно главное окно ФоксПро, поетому я пишу SCREEN=OFF в файле CONFIG.FPW. мне нужно вернуть некоторое значение из этой формы (например, вошел человек или нет) я не хочу использовать глобальные переменные для подобных случаев, поскольку считаю такой подход примером плохого тона (ну вы меня понимаете - область видимости переменных и все такое...), поэтому я пользуюсь оператором DO FORM MyForm TO MyVar. вот. мы подошли к сути. поскольку у меня нет ни главного окна ФоксПро (SCREEN=OFF) ни своего главного окна (я его еще не инициализировал, поскольку человек еще не вошел. а мало ли, может, он ваще не войдет) из за того, что главного окна нет, сразу после срабатывания Инита моей модальной формы она сразу выгружается (не знаю почему, видимо это очередной баг фокса, мать его). вот. я могу, конечно, делать и так: DO MyForm READ EVENTS а в Unload-е формы писать CLEAR EVENTS, но тогда как я верну значение вызывающей форму программе ? я додумался только до следующего идиотического способа: определяю класс на основе Custom, добавив в него всего одно PUBLIC свойство vRetVal. создаю объект этого класса перед тем, как вызываю форму. вызываю форму, передавая этот объект в ее Init, а там сохраняю его в заранее определенном для этого свойстве формы. использкую READ EVENTS / CLEAR EVENTS для того, чтобы форма работала нормально. при завершении работы формы назначаю свойству vRetVal того объекта необходимое значение. форма отрабатывает, релизится, а объект остается. теперь я могу узнать значение ! люди, но это же бред, делать такие вещи ради того, что должно работать само, а не работает, мать его. подскажите более простой способ, но без использования (глобальных) переменных, пожалста спасибо заранее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 07:50 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 09:20 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
хм, этот способ очень хорош, но только в том случае, если я работаю с классами форм. но как быть, если политика партии такова, что мне приходится иметь дело с SCX файлами ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 10:50 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
А зачем PUBLIC переменные!?. Достаточно PRIVATE, определенные в том методе, который вызывает диалоговую форму. Глянь мой пример тут: http://www.caws.atnet.ru/vfox/vfox-sql6.html, метод AddNew С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 10:54 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
может не в тему.. но как-то надо было с формы передать значения 5-ти текстбоксов.. сделал просто При выгрузке формы пишется SELECT Text1 AS Param1, Taxt2 AS Param2... INTO CURSOR MyCursor и все... при закрытии этой формы курсор остался и делай с его значениями, что угодно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 11:01 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
do form with par1,par2,par3 (так только в форме будут видны, но не вернутся) do form with @par1,@par2,@par3 (эти назад вернутся) в форме в ините lparam tpar1,tpar2,tpar3 затем им где нить присваивай tpar1=.. tpar2=... tpar3=... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 11:19 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
alex11100 do form with @par1,@par2,@par3 (эти назад вернутся) 1 версия? 2 есть в документации (в 5-6-7 не нашел) или методом проб найдено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 11:34 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
???? читайте, там все написано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2006, 11:50 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Hi All! 2 --Eugene-- Чтобы "показать" форму в отсутствие главного окна её пришлось сделать AsTopLevel - так? А теперь почитай хелп про AsTopLevel+Modal - коротко говоря модальность в этом случае игнорируется. Так что у тебя абсолютно нормальный случай НЕмодальной формы. При этом ты сделал совершенно верный, нормальный и IMHO красивый вариант реализации - я например тоже параметры в форму передаю (и получаю обратно) при помощи паттерна ParameterObject - это универсально, гибко (хоть 1 возвращай параметр, хоть 1000 - с передачей тоже самое - никаких дурных ограничений на число параметров при вызове метода). Вообще я считаю что трюк с "возвратом" значения из формы слеудет давно перестать использовать - уже хотя-бы потому что он работает ТОЛЬКО с scx формами, причём ТОЛЬКО с модальными. Варианты с Private переменной, и тем более с курсором гораздо хуже (начиная с того что Private объявленная в main по сути ничем не отличается от Public, а возврат через курсор будет работать исключительно если вызываемая форма имеет Default DataSession)... > определяю класс на основе Custom, добавив в него всего одно PUBLIC > свойство vRetVal. > создаю объект этого класса перед тем, как вызываю форму. Свойство можно добавить в рантайме - т.е. можно использовать сразу базовый класс, не плодя новых. loParameter = CREATEOBJECT("Custom") loParameter.AddProperty("vRetVal", .F.) .... > вызываю форму, передавая этот объект в ее Init, а там сохраняю его в > заранее определенном для этого свойстве формы. Кстати такая функциональность у меня прописана сразу в базовом классе формы - у меня ЛЮБОЕ взаимодействие вызывающего кода с вызываемой формой происходит при помощи ParameterObject. При этом занимаясь субклассированием конечно приходится помнить о необходимости вызова из Init подкласса кода родителя, с передачей ему этого параметра (если он был принят! что вызывает несколько громоздкую констуркцию). Впрочем это можно обойти, если запретить в подклассах переопреелять САМ Init формы, создав скажем 2 "своих" метода, и уже их вызывать из Init базовой формы... > люди, но это же бред, делать такие вещи ради того, что должно работать > само, а не работает С модальныи формами только "это" работает - у тебя же форма немодальная. 2 alex11100 Ага, только ты забыл что для того чтобы это всё работало, нужно ещё и в Init формы написать This.Show() - а кроме того присваивать "возвращаемые" значения не "где-нибудь" а в том же само Init формы, но уже ниже This.Show() - т.е. когда форма уже скрыта/уничтожается. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 01:09 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Aleksey-KА зачем PUBLIC переменные!?. Достаточно PRIVATE, определенные в том методе, который вызывает диалоговую форму.если речь идет о строке Код: plaintext и это только одна (1) бага. а их там пруд пруди, если копнуть глубже. чего только PageFrame стоит, мать его alex11100 Код: plaintext 1. 2. 3. Igor KorolyovЧтобы "показать" форму в отсутствие главного окна её пришлось сделать AsTopLevel - так? А теперь почитай хелп про AsTopLevel+Modal - коротко говоря модальность в этом случае игнорируется. Так что у тебя абсолютно нормальный случай НЕмодальной формы. нет, я делаю ее (InTopLevelForm или InScreen) + Desktop=.T. Form::Desktop - хорошее свойство Igor Korolyov я например тоже параметры в форму передаю (и получаю обратно) при помощи паттерна ParameterObjectзначит не один я очередной раз придумал велосипед с квадратными колесами.. это воодушевляет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 04:09 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov ... Кстати такая функциональность у меня прописана сразу в базовом классе формы - у меня ЛЮБОЕ взаимодействие вызывающего кода с вызываемой формой происходит при помощи ParameterObject .... Какой смысл создавать специальный объект-посредник для передачи параметров в диалоговую форму. Чем для этого плоха сама вызывающая форма. Кто вам при вызове диалоговой форму мешает передать ссылку на вызывающюю и затем в конструкторе модальной: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 1. Имеете доступ во всем курсорам главной формы (DataSession у них равны) 2. Через ссылку THISFORM.P_Form имеете доступ ко всем свойствам вызывающей формы. Тем более, как вы сами заметили, свойства можно добавлять (и, кстати, удалять) динамически. В том числе и в вызывающую (не модальную) форму. С уважением, Алексей P.S. Кстати, методы вы добавлять в свой Proxy-объект динамически не можете, а я могу через ссылку на вызывающую форму, использовать и ее методы в модальной форме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 09:11 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
--Eugene-- если речь идет о строке Код: plaintext и это только одна (1) бага. а их там пруд пруди, если копнуть глубже. чего только PageFrame стоит, мать его Ну, допустим, в VFP тоже етсь область видимости переменных (LOCAL, PRIVATE, PUBLIC) и она тоже имеет огромное значение. Или вы все свои переменные оформляли в виде PUBLIC? Насчет указателей. Они тоже есть в VFP и активно используются. В моем примере, которые вы привели как раз и используются указатель на вызывающюю форму (THISFORM) для того, чтобы модальная форма могла через этот указатель использовать свойства и методы вызывающей формы (например ее DataSession и положения относительно _SCREEN). В VFP тоже считается дурным тоном иметь "связку между программными можулями через переменные" (и тем более, через PUBLIC). Но вызов модальной формы из главной - это никак нельзя назвать, как связь между програмными модулями. Вот вместе они составляют программный модуль. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 09:25 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Aleksey-K Igor Korolyov ... у меня ЛЮБОЕ взаимодействие вызывающего кода с вызываемой формой происходит при помощи ParameterObject .... Какой смысл создавать специальный объект-посредник для передачи параметров в диалоговую форму. Чем для этого плоха сама вызывающая форма. Кто вам при вызове диалоговой форму мешает передать ссылку на вызывающюю и затем в конструкторе модальной...да ? а если я вызываю форму из PRG файла ? это вам не шубу в трусы заправлять (пардон) Aleksey-KP.S. Кстати, методы вы добавлять в свой Proxy-объект динамически не можете, а я могу через ссылку на вызывающую форму, использовать и ее методы в модальной форме.странно, а разве вообще можно "добавлять" методы динамически ? а если речь идет об использовании существующих методов формы, переданной по ссылке в вызываемую, то оно, конечно, хорошо, но, опять же, как быть, если "вызывающей" формы нет, а "вызываемая" форма запускается в PRG файле. например, в main.prg происходит DO FORM Login.scx ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 09:37 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
--Eugene--? а если я вызываю форму из PRG файла ? это вам не шубу в трусы заправлять (пардон) Я бы вам советовал: 1. Отказаться от использования VFP и вернуться назад на PASCAL, DELPTHI и пр. Там у вас, очевидно, получалось лучше и с шубами и с трусами. 2. Сменить тон. 3. Отказаться от вызова формы Login из главного программного модуля. (это уже по существу). Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 09:45 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
прошу прощения, если вас задела пара слов не по существу Aleksey-KЯ бы вам советовал отказаться от вызова формы Login из главного программного модуляа как вы себе представляете запуск диалога входа если не в главной программе ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 09:58 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Обычную форму можно заставить вести себя как класс local loFrm Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 10:16 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
--Eugene--прошу прощения, если вас задела пара слов не по существу Aleksey-KЯ бы вам советовал отказаться от вызова формы Login из главного программного модуляа как вы себе представляете запуск диалога входа если не в главной программе ? Ну, например, главная программа тоже реализован как класс, объект которого создается в MAIN.PRG и для входа в систему (после успешного создания экземпляра этого класса), просто вызывается соответствующий метод этого объекта, например Login, а у объекта есть свойства: User_Login, User_Password и еще все, что вашей душе угодно. Может вам поможет мой пример: http://www.caws.atnet.ru/vfox/vfox-sql.html С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 10:26 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
CripОбычную форму можно заставить вести себя как класс local loFrm Код: plaintext 1. ясно. или передавать в Инит названия переменных, заранее определенных для возвращения результатов или использовать фиктивный объект в качестве посредника.. жаль, что нет нормального способа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 10:32 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Aleksey-KНу, например, главная программа тоже реализован как класс, объект которого создается в MAIN.PRGспасибо за пример. а можно ли как-то перегрузить класс приложения и сделать свой, из которого будет получаться объект Application ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 10:39 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov я не стараюсь разжевывать, я просто намекнул как это делается вот еще способ this.runform(nameform,@par1,@par2,@par3) method runform lpara tnameform,tpar1,tpar2,tpar3 local oForm do form tnameform name oForm if type(oForm)=="O" and oForm.lResult = .t. tpar1 = ?? tpar2 = ?? tpar3 = ?? endif а это вообще вот рабочий кусок *:Remarks: Активация формы выбора товаров. *:Example: oDlg.SelectList_Good(this.cObjCl, this.cExpr, this.tcExprConst, @lcXML) lparameters tcCursor, tcExpr, tcExprConst, tnPriID, tData, tcTrasfer * Создаем курсорадаптер для справочника if type("tcCursor")="C" and !used(tcCursor) if oApp.loadObject(tcCursor)<>0 oDlg.MsgErr("Невозможно инициализировать объект "+tcCursor,1,1,1,1, cj_getReturn()) return -1 endif endif * Активируем форму выбора из справочника local lnResult, oDlgSelectList lnResult = 0 oDlgSelectList = createobject("frm_selectlist_good", tcCursor, tcExpr, tcExprConst, tnPriID, tData) if vartype(oDlgSelectList)=="O" and !isnull(oDlgSelectList) oDlgSelectList.show() if vartype(oDlgSelectList)=="O" and !isnull(oDlgSelectList) lnResult = oDlgSelectList.nModalResult tcTrasfer = oDlgSelectList.cTrasfer else lnResult = 0 tcTrasfer = 0 endif endif release oDlgSelectList return lnResult ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 10:47 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
alex11100 Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 12:44 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
и чта дальша??? этоть мой золотой костыль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 12:54 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
Вообще-то, я не понял самой постановки задачи. Форма ввода логина и пароля ЧТО должна сделать? Я всегда считал, что эта форма дает пользователю ввести 2 значения и по нажатию кнопки Ok делает вывод о допустимости или не допустимости дальнейшей работы этого пользователя. Т.е. эта проверка делается ВНУТРИ формы, а вовсе не в основной программе. Ну, или как минимум, из этой формы организуется вызов внешней процедуры проверки. Другими словами, ЧТО предполагается возвращать из этой формы? Какой смысл в этом самом возвращаемом значении? Значит, логика работы совершенно другая. Эта форма вообще ничего не возвращает, а только САМА принимает решение: продолжить дальнейшую работу с программой или завершить. Следовательно код главной программы будет примерно таким: Код: plaintext 1. 2. 3. 4. В событии UNLOAD формы Login.scx дается примерно такой код: Код: plaintext 1. 2. 3. 4. 5. ВСЕ! Какие еще возвращаемые значения? Если в этой форме делаются какие-то глобальные настройки, то они именно глобальные. Т.е. присваиваются глобальным переменным или глобальному объекту. Опять нет смысла в возвращаемых значениях. К сведению : Если в модальной форме дать команду ThisForm.Hide(), то форма скроется и выполнение программы продолжится со следующей после команды DO FORM команды. Т.е. с модальными формами можно работать так: Код: plaintext 1. 2. 3. 4. 5. В данном случае, заголовок окна формы будет прочитан если форма будет закрыта командой ThisForm.Hide(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 13:58 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
--Eugene-- там что про изнул то было типа нашел у меня глюк??? нехорошо - дяденьку обидел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 14:28 |
|
||
|
Как вернуть значение из модальной формы ?
|
|||
|---|---|---|---|
|
#18+
2 alex11100 :) ВладимирМВообще-то, я не понял самой постановки задачи. Форма ввода логина и пароля ЧТО должна сделать? Я всегда считал, что эта форма дает пользователю ввести 2 значения и по нажатию кнопки Ok делает вывод о допустимости или не допустимости дальнейшей работы этого пользователя... Другими словами, ЧТО предполагается возвращать из этой формы? Какой смысл в этом самом возвращаемом значении?не вдавайтесь в подробности, да Бог знает, что там на форме делается. разве только логин может там быть ? ВладимирМ К сведению : Если в модальной форме дать команду ThisForm.Hide(), то форма скроется и выполнение программы продолжится со следующей после команды DO FORM команды. Т.е. с модальными формами можно работать так: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2006, 14:42 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33499195&tid=1592454]: |
0ms |
get settings: |
5ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 389ms |

| 0 / 0 |
