Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
men dea
Member

Откуда:
Сообщений: 143
Каким образом передавать переменные в различные процедуры обработки событий?
Вопрос, собственно, простой для тех, кто знает. Извиняюсь за такую банальность.

Предположим, есть файл 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 июн 05, 02:34    [1649579]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8871
Здесь у каждого свой подход.

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

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

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

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

.....

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

Good luck!
25 июн 05, 10:49    [1649709]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
XAndy
Member

Откуда: Киев
Сообщений: 326
2men dea

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

Но мне кажется, что ты просто пытаешься применять процедурное мышление к ООП, что есть неправильно. Правильнее не передавать параметры вообще: внешний код создает необходимый объект, устанавливает свойства и вызывает метод(ы), затем удаляет объект.
25 июн 05, 14:54    [1649936]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
men dea
Member

Откуда:
Сообщений: 143
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 июн 05, 04:38    [1650542]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Sergey Sizov.
Guest
2men_dea:

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

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


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

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

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

Наверняка кто-нибудь даст полее полное и точное разъяснение.
26 июн 05, 12:34    [1650651]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
Честно говоря не понял проблемы - никуда переменая не пропадает. Ни в GotFocus кнопки, ни в Click-е, ни в UnLoad формы, ни после выгрузки.
IMHO, единственое объяснение - в том, методе, где она пропадает стоит чтото вроде
LPAREMETERS mvar
26 июн 05, 15:47    [1650773]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Sergey Sizov.
Guest
А эта твоя mvar случаем не глобальная?
26 июн 05, 15:50    [1650777]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
>А эта твоя mvar случаем не глобальная?
Нет. Просто задана в вызывающей форму процедуре простым присваиванием
26 июн 05, 16:46    [1650819]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
men dea
Member

Откуда:
Сообщений: 143
Сизову

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

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

for BURN

В "протащенной" из 3-й версии до 7-ки через апгрейды программе, ничего не пропадает. А вот, если с нуля на семерке все мостить, то пропажа заметна. :)
Если бы только у меня пропадала, то не был бы уверен. Попробуй сам состряпать форму, присвой какой-нибудь переменной значение (хоть в Init) и посмотри в дебагере, как она испарится.
Впрочем, это уже не важно. Будем пользоваться PUBLIC и другими советами, что были выше.
26 июн 05, 23:13    [1650979]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Sergey Sizov.
Guest
Насчет передачи через свойство формы.
Это, что? Нужно выбрать какое-нибудь неотражающееся в целом на работе программы свойство в форме и присвоить ему значение?
Какие чаще всего свойства используете вы для таких целей?


Не нужно ничего выбирать! Нужно СОЗДАТЬ! Свое собственное. И делай с ним что хошь. :) И Public не нужны будут. Кстати, применение публичных переменных для передачи параметров тоже не очень согласуется с ООП так как в результате этого объект теряет свою независимость и появляется большая дырка в системе обеспечения устойчивости программы.
26 июн 05, 23:40    [1650986]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8871
Sergey Sizov.
Не нужно ничего выбирать! Нужно СОЗДАТЬ! Свое собственное. И делай с ним что хошь. :) И Public не нужны будут. Кстати, применение публичных переменных для передачи параметров тоже не очень согласуется с ООП так как в результате этого объект теряет свою независимость и появляется большая дырка в системе обеспечения устойчивости программы.

Небольшое уточнение - при приеме параметра в свойстве Init надо присвоить значение свойству, которое рекомендует Sergey Sizov, а иначе Вы не сможете обратиться к этому свойству...

И убедительная просьба - почитайте хотя бы Help к созданию форм - там это все очень подробно описано.
27 июн 05, 09:57    [1651261]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8871
men dea

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

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

Лучше этот метод Вам пока не использовать - он требует некоторого более глубокого понимания VFP.

Но суть его простая - создается временная локальная таблица для каждого запущенного приложения в которой есть поле имени переменной, тип и значение (которое можно хранить в Memo binary или сейчас в Blob). Если Вам потребуется какая-то переменная, то пишете класс или процедуру, в которую передается имя этой переменной а возвращается значение... Соответсвенно на изменение и удаление...
27 июн 05, 10:03    [1651275]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы  [new]
Crispy
Member

Откуда:
Сообщений: 523
men dea
Итак, если передача переменной идет, то ВСЕ, кто ниже, ДОЛЖНЫ эту переменную ВИДЕТЬ, а если не идет, то пусть ВСЕ НЕ ВИДЯТ переменную.

У М. Базияна, если не путаю, по этому поводу было что-то вроде такого: если не указано явно, что переменная public, то внутри процедуры - она всегда local. Книга - по VFP6, значит - и для поздних версий тоже. (для 3 - видимо выполнялось наследование переменной сверху вниз, о котором было сказано, а при перекомпилляции - скорее всего - нужные изменения сами были вставлены, можно просто просмотреть код и убедиться в этом).
27 июн 05, 13:09    [1652049]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Crispy
У М. Базияна, если не путаю, по этому поводу было что-то вроде такого: если не указано явно, что переменная public, то внутри процедуры - она всегда local.

Начиная с самого рождения FoxPro, если область видимости переменной не указана явно, то в исполняемом коде она получит область видимости PRIVATE, а в командном окне PUBLIC.
27 июн 05, 13:19    [1652100]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы  [new]
Crispy
Member

Откуда:
Сообщений: 523
Ну вот, я же сказал: "если не путаю" Постараюсь быть поаккуратней :)
(private / local - в принципе, так похоже...)
27 июн 05, 13:39    [1652182]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
автор
Попробуй сам состряпать форму, присвой какой-нибудь переменной значение (хоть в Init) и посмотри в дебагере, как она испарится.

Стоп, стоп, стоп... Созданая в INIT переменая и должна испарятся по завершению INIT-а - принципы ООП требуют. А вот созданая перед вызовом формы переменная видна во всех методах формы.
27 июн 05, 21:54    [1654053]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
men dea
Member

Откуда:
Сообщений: 143
Спасибо всем. Сделал новое свойство формы. Значение передается.
Правда, как-то коряво все это выглядит. До формы, как до границы, несешь значение в переменной, а дальше переносишь его в свойство формы. Все это напоминает контрабанду через таможенника-сообщника.
Ну, коль таковы правила VFP, то "да будет так!"

Спец. для Burn. Созданная в Init переменная испаряется не сразу. Некоторое время она еще видна. Сейчас уже не помню, в каком событии она "отбывает на небеса". Может, принципы ООП и есть, но она все таки умирает не сразу. А вот, рожденная в вызывающей форму процедуре, как кавказкий долгожитель. За свою жизнь застает больше событий, пока программист почтит ее память. :)
27 июн 05, 22:14    [1654064]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
автор
Созданная в Init переменная испаряется не сразу. Некоторое время она еще видна

Чудеса у вас присходят. Лично у меня переменая, созданая в Init-е, видна только в Init-е и в методох, явно вызваных из Init. По выходу она пропадает сразу
27 июн 05, 22:37    [1654079]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
men dea
Member

Откуда:
Сообщений: 143
Чудеса в мире происходят уже как 2005 лет.
А у меня чуда никакого: аналогичная штука происходит у моего приятеля, с подачи которого эта тема и началась. А экспериментировали мы с переменными и формами совершенно независимо. Единственное, что саму 7 версию я у него брал. Если бы она пропадала сразу, то я и такого приятного общения не было бы. Пропала бы после Load и все. (Приятель любит инициализацию в Load-е делать, а я в Init-е. (Он по алфавиту ближе к верху списка. :))
27 июн 05, 22:44    [1654085]     Ответить | Цитировать Сообщить модератору
 Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Burn
Стоп, стоп, стоп... Созданая в INIT переменая и должна испарятся по завершению INIT-а - принципы ООП требуют. А вот созданая перед вызовом формы переменная видна во всех методах формы.

"Ну, вы, блин, даете!" (с)

С начала.

  • Если область видимости переменной не указана явно (LOCAL, PRIVATE, PUBLIC), то переменная создается с областью видимости PRIVATE.
  • Переменная с областью видимости PRIVATE "видна" в той процедуре, где она была создана и во всех процедурах вызванных из данной.
  • Переменная с областью видимости PRIVATE автоматически удаляется при завершении процедуры в которой она была создана.

    Имеем код

    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.

    Теперь, как к этому "безобразию" прилепить принципы ООП?

    Сначала уточним, в чем в данном случае состоит этот самый "принцип ООП". А заключается он в том, что каждый объект, по возможности, должен работать как "черный ящик". Т.е. ему на вход подается набор значений и он их как-то там у себя внутри обрабатывает.

    Это значит, что форма не должна зависеть от текущих значений внешних переменных. Ей надо передать эти значения как входной параметр

    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-формы. Чтобы их "не потерять", надо по быстрому (пока их еще "видно") присвоить их значения свойствам самой формы.

    Свойства формы можно создать либо на этапе конструирования самой формы, либо программно. Не суть важно. Следует только помнить, что свойства самой формы видны из любых методов и событий этой формы и будут удалены вместе с удалением формы.
  • 27 июн 05, 22:50    [1654087]     Ответить | Цитировать Сообщить модератору
     Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
    Sergey Sizov.
    Guest
    2 men_dea:

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


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

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

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

    Примерно так. В общих чертах. :)
    27 июн 05, 22:57    [1654090]     Ответить | Цитировать Сообщить модератору
     Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
    Данилов Юрий
    Member

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

    А Вы "принципы ООП, принципы ООП". Обычная логика FoxPro. Ничего нового со времен FoxPro for DOS.
    Ну да, ну да. Только вот READ EVENTS пришла к нам в тройке, а последний FPD - 2.6. А кроме этого мелкого замечания - только аплодисменты ВладимируМ, блестящее объяснение.
    28 июн 05, 16:32    [1656498]     Ответить | Цитировать Сообщить модератору
     Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
    Sergey Sizov.
    Guest
    А еще в FPD 2.0 уже была READ CYCLE VALID, очень похожая на Read Event...
    28 июн 05, 16:44    [1656573]     Ответить | Цитировать Сообщить модератору
     Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
    Данилов Юрий
    Member

    Откуда: СПб
    Сообщений: 69
    Я бы сказал "чем-то похожая", а не "очень похожая". По похожести ближе Foundation Read, а тогда причем тут CYCLE.
    28 июн 05, 18:46    [1657070]     Ответить | Цитировать Сообщить модератору
     Re: Почему переменная из процедуры высокого уровня пропадает при обработке событий в формы?  [new]
    Sergey Sizov.
    Guest
    2 Данилов Юрий:

    Cycle не причем. Просто после Paste не удален, только и всего. :)
    28 июн 05, 20:34    [1657193]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / FoxPro, Visual FoxPro Ответить