|
|
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Сначала сказка. В моем царстве живет некая free table с полями Ivanushka и Alenushka. Для ввода в нее делаю форму с двухстраничным PageFrame1. На Page1 размещаю textbox txtIvanushka c ControlSource= m.Ivanushka, а на Page2 размещаю txtAlenushka, соответственно c ControlSource= m.Alenushka. Теперь на саму форму помещаю две commandbutton: а) «Добавить запись» с примерным кодом на Click: …. SCATTER memvar ThisForm.Pageframe1.ActivePage=1 ThisForm.Pageframe1.Page1.Refresh() ThisForm.Pageframe1.Page1.txtIvanushka.SetFocus() и б) «Сохранить», код по Click: IF !EMPTY(m.Ivanushka) .AND. !EMPTY(m.Alenushka) APPEND BLANK GATHER memvar ENDIF Ну, а теперь приключения в темном царстве. Если ничего никуда не вводил, то запись не заносится, и все благополучно завершается. Если ввел что-то в оба поля (т.е. побывал на обеих страницах !), то запись добавляется. А вот, если ввел только txtIvanushka, то появляется Баба-Яга c сообщением: «Variable ‘Alenuska’ is not found”. И что любопытно, если снять вообще условие IF, то новые записи будут появляться вне зависимости, посетил ли ты страницу с этой txtAlenushka или нет. Значит, все Ivanushka и Alenushka живы и находятся! Но как случается IF-проверка, т.е. обращение к переменным со второй страницы, случается казус. Please, внесите рассказчику свет в его темное царство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2005, 16:44:15 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
CREATE CURSOR tale (al c(10),iv c(10)) INSERT INTO tale VALUES ('1','2') SELECT tale SCATTER TO memvar ?m.memvar[1],m.memvar[2] m.memvar[1]="###" ?m.memvar[1],m.memvar[2] и область видимости переменных... сомневаюсь что у Вас мемвар паблик да и как то не для этого он вообще как-то надумано всё не по нашему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2005, 17:18:37 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Бабка-Яга ругается что не знает она m.Alenushka, а посему проверка if Type(m.Ivanushka) # "U" and !Type(m.Alenushka) # "U" IF !EMPTY(m.Ivanushka) .AND. !EMPTY(m.Alenushka) ..... endif endif ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2005, 17:40:18 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Hi men dea! Изучать буферизацию, читать статьи по ООП и отказываться от диких (для VFP) замашек :) Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 00:04:58 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Спасибо за советы. Ну, может замашки и дикие, но иначе пока я не умею. :) Поэтому и задаю вопросы в форум. Изучать все это хозяйство (ООП) сложно, т.к. рядом никакого нормального спеца по VFP, ни курсов нет, и с литературой тоже швах. Даже примера нормальной программы нет. Только поделки таких же дилетантов, как и сам. Теперь по теме. Что касается "public"-овости memvar, то они не public. Я глянул, что работает в одной странице и менять не стал ее зону видимости. Без этого я и просто глобальными переменными бы пользовался. Но парадокс состоит в том, что переменную m.Alenushka нельзя трогать - возникает ошибка, но если ее произнорировать, то откуда-то Фокс все-таки находит значение для соответствующего поля в dbf-е. Добавляет запись и присваивает ей нужное значение. Код инициализации memvar-ов был-то немного другой. Я не пустые поля подставлял, а со стандартными значениями, используя файл шаблона с одной записью. use shablon && одинаковой структуры с myfile scatter memvar use myfile потом запускалась форма с PageFrame, где возникала ошибка и, наконец, ... gather memvar Интересно, откуда отсутствующая переменная находила все-таки значение? Владимир М. писал о том, что VFP сам иногда подменяет неявно описанные переменные, но чего же это он делает только после получения команды на сброс данных в файл? Вообще, я не понял, почему SCATTER и GATHER "не для этого" ? Вроде такая же ООП-команда. Кстати, в книжке по VFP ее автор тоже предлагает. В Хелпе не написано, что она оставлена для совместимости. (у меня 7 версия) Ну, я ее и применил по прежней практике, и глядя на то, как ее использовали в схожной программе другие программисты. И разницу между курсором, scatter-gather или файлом-шаблоном, в котором я мог бы ввести еще одну запись и использовать поля, вместо переменных, не почувствовал. Разве, что для курсора используется оперативка, а для моего шаблона диск... Может быть, быстрее работало бы? Но в том месте, где я бы это использовал (ввод в форму), скорость работы программы и используемые методы значения не имеют. Хотя, разумеется, я буду теперь применять курсор, коль другие делают... В общем, всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 20:11:37 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Для начала Почему созданный массив или переменную не "видно" в других методах формы Так вот, SCATTER именно что создает переменные! Если их не было до этой команды, разумеется. Новая запись создается командой APPEND BLANK. Но создается, разумеется, пустой. Далее ты наполняешь эту запись командой GATHER MEMVAR из тех переменных, которые были созданы (или перезаписаны) командой SCATTER. Так что, никакого противоречия нет. Запись создается, но ничем не заполняется, поскольку переменные, созданные командой SCATTER были уничтожены в момент завершения того метода, где эта команда была дана. Вообще-то, подобные задачи решаются при помощи буферизации или LOCAL VIEW. Через SCATTER/GATHER, в принципе, тоже можно, но требует большего кода, что совершенно лишнее. Кстати, инересно, в какой книжке автор предлагает использовать SCATTER/GATHER? И в какой ситуации? Команды SCATTER/GATHER ни в коем случае не являются устревшими или оставленными для совместимости. Просто изменилась сама область (способ) их применения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2005, 20:56:35 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Hi men dea! Пока ты не разберёшься с областями видимости, и с тем кто и как создаёт и убивает переменные (точнее КОГДА они создаются и когда убиваются) - толку не будет. Но когда ты с этим разберёшься, то поймёшь что оно и не нужно вовсе - ибо есть другие, более удобные механизмы. Насчёт SCATTER - единственно его полезное применение я вижу в SCATTER NAME oData или SCATTER NAME SomeObject.oData - т.е. создавать особого вида объект со свойствами-полями и ЯВНО передавать его между методами, или прицепить к свойству формы или иного объекта - дабы его ВСЕ методы могли использовать. В общем ПОИСК по SCATTER, TABLEUPDATE/буферизация, [Local] View/представление - в т.ч. на foxclub.ru и изучай материал. Также изучи поставляемые с фоксом примеры - там многое есть... Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2005, 03:52:57 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
2men dea есть предложение ... давайте забудем про массивы и будем делать по другому ...... используйте сзарание созданный курсор (create cursor), или если позволяет версия фокса, то select * from myfile where (здесь условия для записи или .T.) readwrite nofilter into curs qq1 ControlSource=qq1.Alenushka .......... ну там и так далее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2005, 10:34:06 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Владимиру М. Книга именуется Т.В. Мусина «Visual FoxPro 8.0. Учебный курс.» см. стр.130. Игорю Королеву. С областями видимости (public, local, private) мне все понятно. Кстати, приятно отметить, что вы меня уже запомнили по ранее задаваемому вопросу об исчезновении переменных. Тогда Владимир.М. дал весьма подробный ответ, за что ему большое спасибо. Нового по переменным я для себя я не нашел, но объяснение причины «изчезновений» получил: я не до конца представлял, как работает modeless-форма. А вот с «Аленушками и Иванушками» полной ясности пока нет. Как пишет Владимир.М., SCATTER создает (!) переменные Ivan & Alena. Я понимаю, что они равноправны. Но коль одна не видна в другой процедуре, то и другая не должна быть видна. Так? Однако, m.Ivan виден, m.Alena нет. Феминистки возмутятся! :) Дружная проверка обеих на непустые значения ведется в одной процедуре («Сохранить».Click), а создаются обе вместе в другой («Добавить».Click) . ВОПРОС 1. Почему же такое неравноправие? Еще раз обращаю внимание, что изначально m.Ivan и m.Alena имели непустые значения. Они были инициализированы из файла shablon. Предположим, m.Ivan =”Дурак”, а m.Alena=”Сестрица”. Далее следуют происки юзера. Затем моя проверка EMPTY(), чтобы он не оставил обе переменные пустыми, а затем уже GATHER в поля myfile.dbf. Так, вот, несмотря на появление Бабы Яги в связи со смертью m.Alena, в соответствующее ей поле myfile все-таки вносилось значение «Сестрица». Про «Дурака» уж не говорю. Ему всегда везет. Если верить Владимиру.М., то после Append Blank новая запись-то должна была оказаться пустой, без прозвищ наших несчастных героев. Но, похоже, завершение метода, где они создавались SCATTER, не «замочило в сортире» значения этих переменных. Даже Владимир П. не помог. :) Значения каким-то образом сохранились, хотя m.Alena сдохла. SET CARRY был OFF. ВОПРОС 2. Отчего память о ней жива? Теперь к курсорам. Теперь для меня это главное. May be, после этого подобные «непонятки» у меня исчезнут, и методы программирования «цивилизуются». Вкратце задача: на форме есть GRID с фамилиями и PageFrame со страничками-досье типа «Адрес», «Документ» и т.п. Перемещение в гриде вызывает смену данных (изначально Enabled=.F.) на ActivePage. Теперь лепим на форму кнопочки «Добавить», «Изменить» и т.п. По нажатию последних зажигаются кнопки «Сохранить»-«Отменить» и данные в PageFrame «оживают»: Enabled=.t. Вводи-редактируй! После всех умных советов, что мне написали, я прочитал про транзакции, буферизации и курсоры. Стало быть, я должен сначала заранее запихнуть всю (free table) myfile.dbf в какой-нибудь курсор tale, как предлагает ГенГрум, или qq1, по совету leaf, а потом всем «контролсоурсам пейджфрейма» присвоить tale.familia, tale.ulica, tale.pasport и т.п. ? «Ходить» по Гриду и вводить-редактировать именно эти tale.fieldname? Их же и проверять на корректность? А потом, накопив целый вагон изменений, уже с помощью своих любимых SCATTER-GATHER или рекомендуемых TABLEUPDATE() и BEGIN TRANSACTION сбрасывать все разом в dbf, когда появится желание? ВОПРОС 3. Так? Или а) я должен на каждом AfterRowColumnChange я должен заново загонять весь myfile.dbf в курсор tale? б) на каждом шагу в курсор tale пихать только текущую соответствующую запись из myfile, чтобы отразить в PageFrame? в) я опять ничего не понял? PS Спасибо всем, кто терпеливо дочитал все это до конца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2005, 20:25:55 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
2men dea >ВОПРОС 1. Почему же такое неравноправие? Скорее всего одна переменая уже была определена в вызвывшей форму процедуре или в головном модуле... >ВОПРОС 3. Так? Нет. Открываем таблицу. Назначаем ей 5-ю буфферизацию. Делаем эту таблицу источником до всех контролов. Все - никаких GATHER-SCATTER ненадо. Любые изменения попадут в таблицу только после TableUpdate(), если надо отказатся - просто TableRevert. Изменения необязательно накапливать. Сбрасывать в любое нужное время. Транзакции применять только в случае изменения нескольких записей одной таблицы или нескольких таблиц одновремено. Или используй редактируемое представление ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2005, 20:42:15 |
|
||
|
Недружелюбное поведение PageFrame.
|
|||
|---|---|---|---|
|
#18+
Hi men dea! > ВОПРОС 3 Если таблица небольшая, то можно и так поступать (т.е. в курсор-представление выбрать ВСЁ, править там пока не надоест, а при ЯВНОЙ команде или при закрытии формы и положительном ответе на MESSAGEBOX("таки сохранить?") вызвать TABLEUPDATE() окружённый проверками - а всё ли у нас прошло гладко, или где-то "не пустили"). Если большая - то примерно так - просто в курсор брать не ВСЕ данные, а лишь небольшую часть - предварительно запросив у юзера критерий отбора. Можно и как написал Burn - т.е. напрямую работать с таблицей, находящейся в режиме буферизации. Вопрос "сохранять каждую запись при движении" или "сохранять ВСЕ но потом" - непринципиален - это как тебе удобнее, так и делай. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2005, 04:42:37 |
|
||
|
|

start [/forum/topic.php?fid=41&tid=1593827]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
195ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 467ms |

| 0 / 0 |
