Как вызвать форму из Листбокса

Итак, есть две формы. Задача такая.

В первой нужно сделать выбор из листбокса, и открыть соответствующую запись во второй форме.

На словах просто, да и должно это быть быть просто, но без дополнительных ухищрений у меня не получилось. В принципе, когда делается выбор их листбокса (комбобокса, грида), выбранная запись становится текущей. По идее, форма должна бала бы открываться сразу с нужной фамилией. Но у меня этот номер не прошел - открывается с первой, хоть убейся. Проверил, поставив на Click Event команду brow, и убедился, что, выбранная запись действительно становится текущей, но пользы от этого так и не увидел. Перерыл два форума по Foxpro, кое-что нашел. Прежде всего порадовало "Но при нажатии этой кнопки запускается форма не с текущей записью в форме, а первая запись таблицы". Стало легче, но по-прежнему непонятно было, что делать..

Нашел совет "…вторая форма запускается в приватной сессии данных. Следовательно при запуске формы таблица будет открываться повторно и указатель будет устанавливаться на первую запись. Нужно установить свойство формы DataSession в значение 1 (Default Data Session)"

Не помогло. Проверил - стоит единичка, как положено, так что пришлось читать дальше. Но совет хороший, можно запомнить на будущее.

Поискал снова, нашел "Когда вызываю эту форму DO FORM- счастье заканчивается. Указатель намертво врастает в 1-ю запись".

Стало совсем зорошо - не один я такой! Читаю советы: "Передать первичный ключ таблицы в качестве параметра вызова формы, в вызванной форме этот ключ найти. Если грид подвязан к таблице, тогда по индексу SEEKнись на нужную запись и thisform.grid1.refresh"

В итоге делаю так:

  • При инициализации первой формы (с листбоксом), в свойстве Init Event создаю глобальную переменную TEK_ZAP, и на всякий случай присваиваю ей значение (единичку).



  • Создаю кнопку вызова второй формы, и на событие ClickEvent ("когда щелкнули") пишу команды
    TEK_ZAP = RECNO()
    DO FORM pers_dat



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

  • Сохраняюсь, закрываю первую форму, и открываю вторую.

  • На инициализацию формы (свойство Init Event) ставлю команду: goto TEK_ZAP

И результат выглядит следующим образом:

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

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

Теперь, когда результат в принципе достигнут, можно подумать и о других способах сделать то же самое.

 
К оглавлениюк следующей статье