powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
25 сообщений из 29, страница 1 из 2
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33134499
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом передавать переменные в различные процедуры обработки событий?
Вопрос, собственно, простой для тех, кто знает. Извиняюсь за такую банальность.

Предположим, есть файл start.prg:
mvar = “ Событие “
DO FORM test.scx

Запускаем этот start.prg, предварительно напихав во всевозможные METHOD EVENTS пустой формы test строчку:
MESSAGEBOX ( mvar + PROCEDURE(),0)

Сначала сообщения еще выдаются, но после некоторого момента эта переменная mvar пропадает. И выскакивают сообщения об ошибке. Смотрел по DEBUG поведение mvar. Обычно после Refresh переменная пропадает.
Если в LOAD или INIT формы определять эту mvar, то результат еще хуже. Она чуть за порог процедуры – и, разумеется, сдохла.

Не описывать же все такие переменные, как PUBLIC, чтобы при обработке любого события формы к ней всегда был доступ?
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33134589
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь у каждого свой подход.

Можно сделать свойство метода, значение которого передавать как параметр в форму.

Можно явно использовать переменные как Public.

Можно создать объект Application видимый всем формам и процедурам и добавить свойства, который можно потом использовать с любом месте программы.

Можно использовать временный курсор и туда писать переменные.

.....

У каждого способа есть преимущества и недостатки - решать Вам самому...

Good luck!
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33134758
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 men dea

Ну, вообще-то, команда DO FORM имеет опцию [WITH cParameterList], откуда параметры передаются в метод Init формы. Там записываешь параметры в свойства формы... Это стандартный подход.

Но мне кажется, что ты просто пытаешься применять процедурное мышление к ООП, что есть неправильно. Правильнее не передавать параметры вообще: внешний код создает необходимый объект, устанавливает свойства и вызывает метод(ы), затем удаляет объект.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135114
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, который представляет собой аналог структуры самой программы и у каждого субобъекта (аналога процедур) будут только его собственные параметры-переменные? Монстр какой-то, но порядок будет германским. Ничего не перепутаешь.
Или я что-то неправильно представляю?


г) Можно использовать временный курсор и туда писать переменные.

Не очень понятны преимущества этого способа. Видимо, у меня вообще плохое понимание этого «курсора». Можно поподробнее?

Всем спасибо.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135194
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2men_dea:

Да уж, действительно процедурные привычки сильно заметны :)

men_deaLoad, Init, Show, Activate формы ее видят, а как только до GotFocus формы доходит очередь, "товар кончился". :) Переменная пропала. Чем GotFocus-то провинился? Кстати, и не только он.
Мне не очень понятно, как сюда мою "необъектно-ориентированность" пришить.


В первых перечисленных тобой методах идет создание объекта (формы). В них еще нет полноценного работающего объекта. Это разобранный на части коструктор объекта. То есть они работают еще gпри отсутствии активности самого объекта. И потому они еще видят область видимости вызывающей программы. После них (GotFocus) уже существует и работает объект со своей собственной областью видимости. Это уже НЕ ТЕ, КТО НИЖЕ, это совершенно другое. Именно в этом твое заблуждение.

А для передачи параметров в форму существует стандартный способ. Переданный из вызывающей программы параметр попадает в метод Init. Здесь он и должен быть обработан и сохранен в каком-либо свойстве ФОРМЫ, так как свойтсва формы видны во всех методах формы.

Напоминаю: объекты имеют свою собственную область видимости других элементов программы и эта область мало связана с областью видимости вызывающей программы. Именно в этом месте нельзя использовать процедурный подход. :)

Наверняка кто-нибудь даст полее полное и точное разъяснение.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135279
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря не понял проблемы - никуда переменая не пропадает. Ни в GotFocus кнопки, ни в Click-е, ни в UnLoad формы, ни после выгрузки.
IMHO, единственое объяснение - в том, методе, где она пропадает стоит чтото вроде
LPAREMETERS mvar
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135281
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А эта твоя mvar случаем не глобальная?
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135308
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А эта твоя mvar случаем не глобальная?
Нет. Просто задана в вызывающей форму процедуре простым присваиванием
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135403
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сизову

Смысл "разобранности" в целом понял. Только в частностях не очень. Для меня LOAD и Init все равно выглядят, как 2 двери одного автобуса. Нет разницы через какую войдешь, все равно одним автобусом поедешь. А вот, Show - это, как автобус №2/

Насчет передачи через свойство формы.
Это, что? Нужно выбрать какое-нибудь неотражающееся в целом на работе программы свойство в форме и присвоить ему значение?
Какие чаще всего свойства используете вы для таких целей?

for BURN

В "протащенной" из 3-й версии до 7-ки через апгрейды программе, ничего не пропадает. А вот, если с нуля на семерке все мостить, то пропажа заметна. :)
Если бы только у меня пропадала, то не был бы уверен. Попробуй сам состряпать форму, присвой какой-нибудь переменной значение (хоть в Init) и посмотри в дебагере, как она испарится.
Впрочем, это уже не важно. Будем пользоваться PUBLIC и другими советами, что были выше.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135408
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчет передачи через свойство формы.
Это, что? Нужно выбрать какое-нибудь неотражающееся в целом на работе программы свойство в форме и присвоить ему значение?
Какие чаще всего свойства используете вы для таких целей?


Не нужно ничего выбирать! Нужно СОЗДАТЬ! Свое собственное. И делай с ним что хошь. :) И Public не нужны будут. Кстати, применение публичных переменных для передачи параметров тоже не очень согласуется с ООП так как в результате этого объект теряет свою независимость и появляется большая дырка в системе обеспечения устойчивости программы.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135597
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov. Не нужно ничего выбирать! Нужно СОЗДАТЬ! Свое собственное. И делай с ним что хошь. :) И Public не нужны будут. Кстати, применение публичных переменных для передачи параметров тоже не очень согласуется с ООП так как в результате этого объект теряет свою независимость и появляется большая дырка в системе обеспечения устойчивости программы.
Небольшое уточнение - при приеме параметра в свойстве Init надо присвоить значение свойству, которое рекомендует Sergey Sizov, а иначе Вы не сможете обратиться к этому свойству...

И убедительная просьба - почитайте хотя бы Help к созданию форм - там это все очень подробно описано.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33135607
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
men dea
г) Можно использовать временный курсор и туда писать переменные.

Не очень понятны преимущества этого способа. Видимо, у меня вообще плохое понимание этого «курсора». Можно поподробнее?
Лучше этот метод Вам пока не использовать - он требует некоторого более глубокого понимания VFP.

Но суть его простая - создается временная локальная таблица для каждого запущенного приложения в которой есть поле имени переменной, тип и значение (которое можно хранить в Memo binary или сейчас в Blob). Если Вам потребуется какая-то переменная, то пишете класс или процедуру, в которую передается имя этой переменной а возвращается значение... Соответсвенно на изменение и удаление...
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33136144
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
men dea Итак, если передача переменной идет, то ВСЕ, кто ниже, ДОЛЖНЫ эту переменную ВИДЕТЬ, а если не идет, то пусть ВСЕ НЕ ВИДЯТ переменную.
У М. Базияна, если не путаю, по этому поводу было что-то вроде такого: если не указано явно, что переменная public, то внутри процедуры - она всегда local. Книга - по VFP6, значит - и для поздних версий тоже. (для 3 - видимо выполнялось наследование переменной сверху вниз, о котором было сказано, а при перекомпилляции - скорее всего - нужные изменения сами были вставлены, можно просто просмотреть код и убедиться в этом).
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33136190
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrispyУ М. Базияна, если не путаю, по этому поводу было что-то вроде такого: если не указано явно, что переменная public, то внутри процедуры - она всегда local.
Начиная с самого рождения FoxPro, если область видимости переменной не указана явно, то в исполняемом коде она получит область видимости PRIVATE, а в командном окне PUBLIC.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33136249
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот, я же сказал: "если не путаю" Постараюсь быть поаккуратней :)
(private / local - в принципе, так похоже...)
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33137204
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПопробуй сам состряпать форму, присвой какой-нибудь переменной значение (хоть в Init) и посмотри в дебагере, как она испарится.

Стоп, стоп, стоп... Созданая в INIT переменая и должна испарятся по завершению INIT-а - принципы ООП требуют. А вот созданая перед вызовом формы переменная видна во всех методах формы.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33137212
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем. Сделал новое свойство формы. Значение передается.
Правда, как-то коряво все это выглядит. До формы, как до границы, несешь значение в переменной, а дальше переносишь его в свойство формы. Все это напоминает контрабанду через таможенника-сообщника.
Ну, коль таковы правила VFP, то "да будет так!"

Спец. для Burn. Созданная в Init переменная испаряется не сразу. Некоторое время она еще видна. Сейчас уже не помню, в каком событии она "отбывает на небеса". Может, принципы ООП и есть, но она все таки умирает не сразу. А вот, рожденная в вызывающей форму процедуре, как кавказкий долгожитель. За свою жизнь застает больше событий, пока программист почтит ее память. :)
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33137221
Burn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСозданная в Init переменная испаряется не сразу. Некоторое время она еще видна
Чудеса у вас присходят. Лично у меня переменая, созданая в Init-е, видна только в Init-е и в методох, явно вызваных из Init. По выходу она пропадает сразу
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33137227
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудеса в мире происходят уже как 2005 лет.
А у меня чуда никакого: аналогичная штука происходит у моего приятеля, с подачи которого эта тема и началась. А экспериментировали мы с переменными и формами совершенно независимо. Единственное, что саму 7 версию я у него брал. Если бы она пропадала сразу, то я и такого приятного общения не было бы. Пропала бы после Load и все. (Приятель любит инициализацию в Load-е делать, а я в Init-е. (Он по алфавиту ближе к верху списка. :))
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33137228
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BurnСтоп, стоп, стоп... Созданая в INIT переменая и должна испарятся по завершению INIT-а - принципы ООП требуют. А вот созданая перед вызовом формы переменная видна во всех методах формы.
"Ну, вы, блин, даете!" (с)

С начала.

Если область видимости переменной не указана явно (LOCAL, PRIVATE, PUBLIC), то переменная создается с областью видимости PRIVATE.

Переменная с областью видимости PRIVATE "видна" в той процедуре, где она была создана и во всех процедурах вызванных из данной.

Переменная с областью видимости PRIVATE автоматически удаляется при завершении процедуры в которой она была создана.

Имеем код

Код: plaintext
1.
2.
3.
4.
5.
PROCEDURE test
PRIVATE MyVar
m.MyVar =  1 
PUBLIC MyForm
DO FORM MyForm.scx
RETURN

Если форма 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.
PROCEDURE test
PRIVATE MyVar
m.MyVar =  1 
PUBLIC MyForm
DO FORM MyForm.scx WITH m.MyVar
RETURN

Переданные параметры принимаются в событии INIT-формы "штатным" способом. Через указание в качестве первой исполняемой команды в событии Init команды

PARAMETERS MyPar

Или

LPARAMETERS MyPar

В данном случае принятые параметры - это уже новые переменные. Никакого отношения к переменной в процедуре test не имеющие. Если использовано ключевое слово PARAMETERS, то эти переменные имеют область видимости PRIVATE, если LPARAMETERS, то LOCAL.

В любом случае, они будут удалены по завершении события INIT-формы. Чтобы их "не потерять", надо по быстрому (пока их еще "видно") присвоить их значения свойствам самой формы.

Свойства формы можно создать либо на этапе конструирования самой формы, либо программно. Не суть важно. Следует только помнить, что свойства самой формы видны из любых методов и событий этой формы и будут удалены вместе с удалением формы.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33137231
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 men_dea:

Правда, как-то коряво все это выглядит. До формы, как до границы, несешь значение в переменной, а дальше переносишь его в свойство формы. Все это напоминает контрабанду через таможенника-сообщника.


Можно поробовать провести такую аналогию между ООП и таким привычным некоторым :) процедурным подходом:

Объект в ООП, например форма - отдельный файл (для С это *.с), в котором находятся свои константы и переменные (в ООП это свойства) и функции (в ООП - методы). Как известно, переменные, объявленные внутри функций видны только в этих функциях. Переменные объявленные в файле вне функций видны внутри всего файла. Если в файле есть функция Init и в ней будет объявлена переменная SomeVar будет ли она видна в какой-нибудь другой функции того же файла? Коряво как-то, не так ли?

Чем меньше контактов с "внешним миром" - тем меньше вероятность появления побочных эффектов от других элементов программы. Поэтому такое общение желательно производить только через параметры, возвращаемые значения и специально выставленные наружу свойства и методы.

Примерно так. В общих чертах. :)
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33138795
Данилов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ раньше уже имел практику на 1,5 десятках разных СП и ЯП, от БЭМШ для БЭСМ-6, Аssembler (XT/AT) до Clipper под DOS.Да Вы, сэр, ДИСПАЧник! Привет от ДУБНинца :-)
ВладимирМЗамечание: переменные с областью видимости PRIVATE созданные в главном (стартовом) файле до команды READ EVENTS по сути имеют область видимости PUBLIC и "видны" в любом событии или методе любого объекта приложения.

А Вы "принципы ООП, принципы ООП". Обычная логика FoxPro. Ничего нового со времен FoxPro for DOS.
Ну да, ну да. Только вот READ EVENTS пришла к нам в тройке, а последний FPD - 2.6. А кроме этого мелкого замечания - только аплодисменты ВладимируМ , блестящее объяснение.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33138825
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще в FPD 2.0 уже была READ CYCLE VALID, очень похожая на Read Event...
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33139097
Данилов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сказал "чем-то похожая", а не "очень похожая". По похожести ближе Foundation Read, а тогда причем тут CYCLE.
...
Рейтинг: 0 / 0
Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?
    #33139193
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Данилов Юрий:

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


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