|
|
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Каким образом передавать переменные в различные процедуры обработки событий? Вопрос, собственно, простой для тех, кто знает. Извиняюсь за такую банальность. Предположим, есть файл start.prg: mvar = “ Событие “ DO FORM test.scx Запускаем этот start.prg, предварительно напихав во всевозможные METHOD EVENTS пустой формы test строчку: MESSAGEBOX ( mvar + PROCEDURE(),0) Сначала сообщения еще выдаются, но после некоторого момента эта переменная mvar пропадает. И выскакивают сообщения об ошибке. Смотрел по DEBUG поведение mvar. Обычно после Refresh переменная пропадает. Если в LOAD или INIT формы определять эту mvar, то результат еще хуже. Она чуть за порог процедуры – и, разумеется, сдохла. Не описывать же все такие переменные, как PUBLIC, чтобы при обработке любого события формы к ней всегда был доступ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2005, 02:34:29 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Здесь у каждого свой подход. Можно сделать свойство метода, значение которого передавать как параметр в форму. Можно явно использовать переменные как Public. Можно создать объект Application видимый всем формам и процедурам и добавить свойства, который можно потом использовать с любом месте программы. Можно использовать временный курсор и туда писать переменные. ..... У каждого способа есть преимущества и недостатки - решать Вам самому... Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2005, 10:49:23 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
2 men dea Ну, вообще-то, команда DO FORM имеет опцию [WITH cParameterList], откуда параметры передаются в метод Init формы. Там записываешь параметры в свойства формы... Это стандартный подход. Но мне кажется, что ты просто пытаешься применять процедурное мышление к ООП, что есть неправильно. Правильнее не передавать параметры вообще: внешний код создает необходимый объект, устанавливает свойства и вызывает метод(ы), затем удаляет объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2005, 14:54:58 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Cобственно, этот вопрос у меня возник после того, как обратился ко мне с жалобой на VFP-7.0 приятель. Он написал программы на трешке, а потом новые версии VFP автоматом перегоняли уже существующие проги под свои новые стандарты. А вот, когда приятель стал писать все с нуля уже на 7-ке, то начали, как тараканы, вылезать многочисленные проблемы. В том числе и эта. Итак, 1. Для ХAndy : Я раньше уже имел практику на 1,5 десятках разных СП и ЯП, от БЭМШ для БЭСМ-6, Аssembler (XT/AT) до Clipper под DOS. Наконец, удосужился придти к VFP. Поэтому в основе своей идеология СУБД, команды VPF и т.п. мне знакомы, а вот чистая специфика VPF мне за месяц изучения крови много выпила. Может, я и подхожу к нему с позиций процедурного языка. И поэтому ищу логику передачи переменной в функции и процедуры низшего ранга. (Кстати, я так понимаю, что Method events - это те же ассемблерные Interrupts, которые уж если начали выполняться, то выполняются до конца. ) Итак, если передача переменной идет, то ВСЕ, кто ниже, ДОЛЖНЫ эту переменную ВИДЕТЬ, а если не идет, то пусть ВСЕ НЕ ВИДЯТ переменную. А что на деле в VPF? В ранее описанyю форму test.scx добавляю одну ком.кнопку для стирания этой формы по событию Click (ThisForm.Release). Смотрим: "Как поживает наша незабвенная переменная mvar?" Load, Init, Show, Activate формы ее видят, а как только до GotFocus формы доходит очередь, "товар кончился". :) Переменная пропала. Чем GotFocus-то провинился? Кстати, и не только он. Мне не очень понятно, как сюда мою "необъектно-ориентированность" пришить. Передачу mvar в качестве параметра DO Form test.scx WITH mvar я пробовал и до этого. Ситуация не меняется. В Init, Load все попадет, а дальше-то как этот параметр передавать? У процедуры Activate параметра-то нет. ------------------------------------------------------ 2. Для Sergey Ch a) Можно сделать свойство метода, значение которого передавать как параметр в форму. С учетом того, что не у всех методов имееется одно общее подходящее для передачи свойство, несколько извилистая дорожка получается. :) Ну, например, для передачи числа можно использовать какой-нибудь неиспользуемый цвет экрана? А для текстовых caption, да еще выключить его видимость, чтобы не читал пользователь служебную информацию :) б) Можно явно использовать переменные как Public. К этому я пришел сразу после того, как обнаружилась вся эта фигня с потерей переменных. Многовато, конечно мусора в памяти будет. Особенно для тех, кто пожелает в тексте программы разобраться. Поэтому-то я и хотел спустить всех лишних чиновников в подчиненные процедуры, чтобы все не сидели в столице. Но, похоже, не удастся. :) в) Можно создать объект Application видимый всем формам и процедурам и добавить свойства, который можно потом использовать с любом месте программы. Думаю, что это тот же PUBLIC, только вид сбоку. Программа будет выглядеть еще запутаннее. Правда, может, создать такой объект Application, который представляет собой аналог структуры самой программы и у каждого субобъекта (аналога процедур) будут только его собственные параметры-переменные? Монстр какой-то, но порядок будет германским. Ничего не перепутаешь. Или я что-то неправильно представляю? г) Можно использовать временный курсор и туда писать переменные. Не очень понятны преимущества этого способа. Видимо, у меня вообще плохое понимание этого «курсора». Можно поподробнее? Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 04:38:48 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
2men_dea: Да уж, действительно процедурные привычки сильно заметны :) men_deaLoad, Init, Show, Activate формы ее видят, а как только до GotFocus формы доходит очередь, "товар кончился". :) Переменная пропала. Чем GotFocus-то провинился? Кстати, и не только он. Мне не очень понятно, как сюда мою "необъектно-ориентированность" пришить. В первых перечисленных тобой методах идет создание объекта (формы). В них еще нет полноценного работающего объекта. Это разобранный на части коструктор объекта. То есть они работают еще gпри отсутствии активности самого объекта. И потому они еще видят область видимости вызывающей программы. После них (GotFocus) уже существует и работает объект со своей собственной областью видимости. Это уже НЕ ТЕ, КТО НИЖЕ, это совершенно другое. Именно в этом твое заблуждение. А для передачи параметров в форму существует стандартный способ. Переданный из вызывающей программы параметр попадает в метод Init. Здесь он и должен быть обработан и сохранен в каком-либо свойстве ФОРМЫ, так как свойтсва формы видны во всех методах формы. Напоминаю: объекты имеют свою собственную область видимости других элементов программы и эта область мало связана с областью видимости вызывающей программы. Именно в этом месте нельзя использовать процедурный подход. :) Наверняка кто-нибудь даст полее полное и точное разъяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 12:34:47 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Честно говоря не понял проблемы - никуда переменая не пропадает. Ни в GotFocus кнопки, ни в Click-е, ни в UnLoad формы, ни после выгрузки. IMHO, единственое объяснение - в том, методе, где она пропадает стоит чтото вроде LPAREMETERS mvar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 15:47:05 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
А эта твоя mvar случаем не глобальная? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 15:50:02 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
>А эта твоя mvar случаем не глобальная? Нет. Просто задана в вызывающей форму процедуре простым присваиванием ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 16:46:37 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Сизову Смысл "разобранности" в целом понял. Только в частностях не очень. Для меня LOAD и Init все равно выглядят, как 2 двери одного автобуса. Нет разницы через какую войдешь, все равно одним автобусом поедешь. А вот, Show - это, как автобус №2/ Насчет передачи через свойство формы. Это, что? Нужно выбрать какое-нибудь неотражающееся в целом на работе программы свойство в форме и присвоить ему значение? Какие чаще всего свойства используете вы для таких целей? for BURN В "протащенной" из 3-й версии до 7-ки через апгрейды программе, ничего не пропадает. А вот, если с нуля на семерке все мостить, то пропажа заметна. :) Если бы только у меня пропадала, то не был бы уверен. Попробуй сам состряпать форму, присвой какой-нибудь переменной значение (хоть в Init) и посмотри в дебагере, как она испарится. Впрочем, это уже не важно. Будем пользоваться PUBLIC и другими советами, что были выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 23:13:22 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Насчет передачи через свойство формы. Это, что? Нужно выбрать какое-нибудь неотражающееся в целом на работе программы свойство в форме и присвоить ему значение? Какие чаще всего свойства используете вы для таких целей? Не нужно ничего выбирать! Нужно СОЗДАТЬ! Свое собственное. И делай с ним что хошь. :) И Public не нужны будут. Кстати, применение публичных переменных для передачи параметров тоже не очень согласуется с ООП так как в результате этого объект теряет свою независимость и появляется большая дырка в системе обеспечения устойчивости программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2005, 23:40:17 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov. Не нужно ничего выбирать! Нужно СОЗДАТЬ! Свое собственное. И делай с ним что хошь. :) И Public не нужны будут. Кстати, применение публичных переменных для передачи параметров тоже не очень согласуется с ООП так как в результате этого объект теряет свою независимость и появляется большая дырка в системе обеспечения устойчивости программы. Небольшое уточнение - при приеме параметра в свойстве Init надо присвоить значение свойству, которое рекомендует Sergey Sizov, а иначе Вы не сможете обратиться к этому свойству... И убедительная просьба - почитайте хотя бы Help к созданию форм - там это все очень подробно описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 09:57:47 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
men dea г) Можно использовать временный курсор и туда писать переменные. Не очень понятны преимущества этого способа. Видимо, у меня вообще плохое понимание этого «курсора». Можно поподробнее? Лучше этот метод Вам пока не использовать - он требует некоторого более глубокого понимания VFP. Но суть его простая - создается временная локальная таблица для каждого запущенного приложения в которой есть поле имени переменной, тип и значение (которое можно хранить в Memo binary или сейчас в Blob). Если Вам потребуется какая-то переменная, то пишете класс или процедуру, в которую передается имя этой переменной а возвращается значение... Соответсвенно на изменение и удаление... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 10:03:01 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
men dea Итак, если передача переменной идет, то ВСЕ, кто ниже, ДОЛЖНЫ эту переменную ВИДЕТЬ, а если не идет, то пусть ВСЕ НЕ ВИДЯТ переменную. У М. Базияна, если не путаю, по этому поводу было что-то вроде такого: если не указано явно, что переменная public, то внутри процедуры - она всегда local. Книга - по VFP6, значит - и для поздних версий тоже. (для 3 - видимо выполнялось наследование переменной сверху вниз, о котором было сказано, а при перекомпилляции - скорее всего - нужные изменения сами были вставлены, можно просто просмотреть код и убедиться в этом). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 13:09:36 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
CrispyУ М. Базияна, если не путаю, по этому поводу было что-то вроде такого: если не указано явно, что переменная public, то внутри процедуры - она всегда local. Начиная с самого рождения FoxPro, если область видимости переменной не указана явно, то в исполняемом коде она получит область видимости PRIVATE, а в командном окне PUBLIC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 13:19:43 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Ну вот, я же сказал: "если не путаю" Постараюсь быть поаккуратней :) (private / local - в принципе, так похоже...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 13:39:56 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
авторПопробуй сам состряпать форму, присвой какой-нибудь переменной значение (хоть в Init) и посмотри в дебагере, как она испарится. Стоп, стоп, стоп... Созданая в INIT переменая и должна испарятся по завершению INIT-а - принципы ООП требуют. А вот созданая перед вызовом формы переменная видна во всех методах формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 21:54:42 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Сделал новое свойство формы. Значение передается. Правда, как-то коряво все это выглядит. До формы, как до границы, несешь значение в переменной, а дальше переносишь его в свойство формы. Все это напоминает контрабанду через таможенника-сообщника. Ну, коль таковы правила VFP, то "да будет так!" Спец. для Burn. Созданная в Init переменная испаряется не сразу. Некоторое время она еще видна. Сейчас уже не помню, в каком событии она "отбывает на небеса". Может, принципы ООП и есть, но она все таки умирает не сразу. А вот, рожденная в вызывающей форму процедуре, как кавказкий долгожитель. За свою жизнь застает больше событий, пока программист почтит ее память. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 22:14:51 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
авторСозданная в Init переменная испаряется не сразу. Некоторое время она еще видна Чудеса у вас присходят. Лично у меня переменая, созданая в Init-е, видна только в Init-е и в методох, явно вызваных из Init. По выходу она пропадает сразу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 22:37:04 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Чудеса в мире происходят уже как 2005 лет. А у меня чуда никакого: аналогичная штука происходит у моего приятеля, с подачи которого эта тема и началась. А экспериментировали мы с переменными и формами совершенно независимо. Единственное, что саму 7 версию я у него брал. Если бы она пропадала сразу, то я и такого приятного общения не было бы. Пропала бы после Load и все. (Приятель любит инициализацию в Load-е делать, а я в Init-е. (Он по алфавиту ближе к верху списка. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 22:44:58 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
BurnСтоп, стоп, стоп... Созданая в INIT переменая и должна испарятся по завершению INIT-а - принципы ООП требуют. А вот созданая перед вызовом формы переменная видна во всех методах формы. "Ну, вы, блин, даете!" (с) С начала. Если область видимости переменной не указана явно (LOCAL, PRIVATE, PUBLIC), то переменная создается с областью видимости PRIVATE. Переменная с областью видимости PRIVATE "видна" в той процедуре, где она была создана и во всех процедурах вызванных из данной. Переменная с областью видимости PRIVATE автоматически удаляется при завершении процедуры в которой она была создана. Имеем код Код: plaintext 1. 2. 3. 4. 5. Если форма MyForm НЕ модальная, то переменная MyVar будет видна во всех методах, которые исполняются при инициализации формы (LOAD, INIT, и т.п.). Но после того, как форма будет открыта, выполнение процедуры test будет продолжено. Сама процедура будет закрыта и переменная MyVar благополучно удалится. Ее больше нет . Следовательно, никаким способом мы ее увидеть уже не можем ни из каких методов формы. Нечего видеть. Удалилась уже. Если форма MyForm модальная, то выполнение процедуры test будет остановлено на команде MyForm. Поскольку процедура test не завершена, то и переменная MyVar продолжает существовать. Следовательно, мы можем ее увидеть из любых событий и методов формы MyForm. Замечание : переменные с областью видимости PRIVATE созданные в главном (стартовом) файле до команды READ EVENTS по сути имеют область видимости PUBLIC и "видны" в любом событии или методе любого объекта приложения. А Вы "принципы ООП, принципы ООП". Обычная логика FoxPro. Ничего нового со времен FoxPro for DOS. Теперь, как к этому "безобразию" прилепить принципы ООП? Сначала уточним, в чем в данном случае состоит этот самый "принцип ООП". А заключается он в том, что каждый объект, по возможности, должен работать как "черный ящик". Т.е. ему на вход подается набор значений и он их как-то там у себя внутри обрабатывает. Это значит, что форма не должна зависеть от текущих значений внешних переменных. Ей надо передать эти значения как входной параметр Код: plaintext 1. 2. 3. 4. 5. Переданные параметры принимаются в событии INIT-формы "штатным" способом. Через указание в качестве первой исполняемой команды в событии Init команды PARAMETERS MyPar Или LPARAMETERS MyPar В данном случае принятые параметры - это уже новые переменные. Никакого отношения к переменной в процедуре test не имеющие. Если использовано ключевое слово PARAMETERS, то эти переменные имеют область видимости PRIVATE, если LPARAMETERS, то LOCAL. В любом случае, они будут удалены по завершении события INIT-формы. Чтобы их "не потерять", надо по быстрому (пока их еще "видно") присвоить их значения свойствам самой формы. Свойства формы можно создать либо на этапе конструирования самой формы, либо программно. Не суть важно. Следует только помнить, что свойства самой формы видны из любых методов и событий этой формы и будут удалены вместе с удалением формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 22:50:14 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
2 men_dea: Правда, как-то коряво все это выглядит. До формы, как до границы, несешь значение в переменной, а дальше переносишь его в свойство формы. Все это напоминает контрабанду через таможенника-сообщника. Можно поробовать провести такую аналогию между ООП и таким привычным некоторым :) процедурным подходом: Объект в ООП, например форма - отдельный файл (для С это *.с), в котором находятся свои константы и переменные (в ООП это свойства) и функции (в ООП - методы). Как известно, переменные, объявленные внутри функций видны только в этих функциях. Переменные объявленные в файле вне функций видны внутри всего файла. Если в файле есть функция Init и в ней будет объявлена переменная SomeVar будет ли она видна в какой-нибудь другой функции того же файла? Коряво как-то, не так ли? Чем меньше контактов с "внешним миром" - тем меньше вероятность появления побочных эффектов от других элементов программы. Поэтому такое общение желательно производить только через параметры, возвращаемые значения и специально выставленные наружу свойства и методы. Примерно так. В общих чертах. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2005, 22:57:23 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
авторЯ раньше уже имел практику на 1,5 десятках разных СП и ЯП, от БЭМШ для БЭСМ-6, Аssembler (XT/AT) до Clipper под DOS.Да Вы, сэр, ДИСПАЧник! Привет от ДУБНинца :-) ВладимирМЗамечание: переменные с областью видимости PRIVATE созданные в главном (стартовом) файле до команды READ EVENTS по сути имеют область видимости PUBLIC и "видны" в любом событии или методе любого объекта приложения. А Вы "принципы ООП, принципы ООП". Обычная логика FoxPro. Ничего нового со времен FoxPro for DOS. Ну да, ну да. Только вот READ EVENTS пришла к нам в тройке, а последний FPD - 2.6. А кроме этого мелкого замечания - только аплодисменты ВладимируМ , блестящее объяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2005, 16:32:39 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
А еще в FPD 2.0 уже была READ CYCLE VALID, очень похожая на Read Event... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2005, 16:44:36 |
|
||
|
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
|
|||
|---|---|---|---|
|
#18+
Я бы сказал "чем-то похожая", а не "очень похожая". По похожести ближе Foundation Read, а тогда причем тут CYCLE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2005, 18:46:45 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33137221&tid=1593962]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
141ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 406ms |

| 0 / 0 |
