как передавать данные между формами в Access?

Программирование на Visual Basic for Applications
Mech
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 07.02.2006 (Вт) 20:37
Откуда: г. Лобня

как передавать данные между формами в Access?

Сообщение Mech » 07.02.2006 (Вт) 21:57

Здравствуйте!

У меня возник вопрос как передавать данные между формами в Access.

Такая задача:
Есть формы
1 – Поиск_домов
2 – F1
3 – F2
4 - …
… F15

Из любой формы F1, F2, … вызывается форма Поиск_домов
Когда пользователь в списке нашел интересующий его дом, он кликает на кнопку Вернуться и мне необходимо передать данные в форму из которой он попал на форму Поиск_домов. После этого эти данные надо как-то обработать. (Проверить, подходят ли они по критерию для данной формы и прочее).
Причем обрабатывать надо для каждой формы разными способами.

Если надо передавать одно значение, мне кажется не целесообразными делать для этого таблицу, поэтому, я в обработке события кнопки Вернуться писал код:


Код: Выделить всё

If Not (IsNull(СписокДомов.Value)) Then
   If IsFormOpen("F1") = True Then
     ‘ проверка подходит ли по критерию для формы F1
     ‘ если да то
   Forms("F1").Controls("IdDoma").Value = СписокДомов.Value
    ‘ дополнительные действия для F1
    End If     
End If

If Not (IsNull(СписокДомов.Value)) Then
   If IsFormOpen("F1") = True Then
     ‘ проверка подходит ли по критерию для формы F2
     ‘ если да то
   Forms("F2").Controls("IdDoma").Value = СписокДомов.Value
  ‘ дополнительные действия для F2
    End If     
End If


If Not (IsNull(СписокДомов.Value)) Then
   If IsFormOpen("F3") = True Then
     ‘ проверка подходит ли по критерию для формы F3
     ‘ если да то
   Forms("F3").Controls("IdDoma").Value = СписокДомов.Value
     ‘ дополнительные действия для F3
    End If     
End If



Но по мере того, как росло количество форм, у меня возникли проблемы

1. При изменении каких-то условий или действий для формы F1, мне приходится постоянно лезть в форму Поиск_домов и править там код. ИМХО Это не удобно!
2. Если открыты две и более форм, то вносятся изменения в каждую из форм.

Чтобы изменения вносились именно в ту форму я стал использовать пометку Tag:

Код: Выделить всё

Private Sub Укажи_дом_Click()
stDocName = " Поиск_домов"
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    If IsFormOpen("Поиск_домов") = True Then
        Forms("Поиск_домов").Tag = Me.Name
    End If
End Sub


А потом, при обработке события кнопки Вернуться указывать
Код: Выделить всё


         Forms(Me.Tag).Controls("Адрес").Value = СписокДомов.Value



Всебы хорошо, да не так, потребовалось для одной из форм указывать два адреса!
Теперь так просто Forms(Me.Tag) :) не прокатывало, изменяло два адреса.

А теперь вопрос

Как сделать по нормальному!
Хочется чтобы при нажатии кнопки Вернуться вызывалась процедура формы F1,F2,F3.. которая захватывала бы все данные.
То есть обработку критерия данных переложить на форму, ту которую правишь F1,F2,F3
Под каждый критерий своя функция GetVal(), Приписанная к каждой форме F1…
F1. GetVal()
F2. GetVal()

Но я не знаю как запустить процедуру для другой формы, указанной по имени. 8-(

Если вы сталкивались с подобними проблемами, подскажите как решали

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.02.2006 (Ср) 7:30

Вообще, обычно это равно наоборот. Главная форма вызывает поисковую в модальном режиме, когда поисковая закрывается, главная проверяет её f.СписокДомов.Value.
Ввиду того, что в access нет операторов load/unload применительно к формам, а также методов show/hide, я не знаю, как это будет выглядеть там...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.02.2006 (Ср) 8:20

Зато в Access открываемая форма может принимать параметр. И возвращать значение (косвенно).
Можно использовать это.
Lasciate ogni speranza, voi ch'entrate.

Mech
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 07.02.2006 (Вт) 20:37
Откуда: г. Лобня

Сообщение Mech » 08.02.2006 (Ср) 16:25

alibek писал(а):Зато в Access открываемая форма может принимать параметр. И возвращать значение (косвенно).
Можно использовать это.


как именно? пожете поястить?

Пожа-а луйста! :)

Olga
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 08.09.2004 (Ср) 8:49
Откуда: Москва

Сообщение Olga » 08.02.2006 (Ср) 18:48

А нельзя просто передать параметр на форму:

Forms![Имя формы]![Имя поля] = [передаваемое значение]

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.02.2006 (Чт) 6:46

Внимательно смотрим приведённый в вопросе код и понимаем, что нельзя...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mech
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 07.02.2006 (Вт) 20:37
Откуда: г. Лобня

Сообщение Mech » 17.02.2006 (Пт) 20:28

Mech писал(а):
alibek писал(а):Зато в Access открываемая форма может принимать параметр. И возвращать значение (косвенно).
Можно использовать это.


как именно? пожете пояснить?


Сам догадался!

Надо в форму Doma_Find передать в переменную Tag имя формы, кто вызвал, и имя СВОБОДНОГО элемента управления, куда нало вставить данные.
Форма DOMA_Find при отработке засунет значения в этот элемент и завершится.

НО Главное - надо создать на том СВОБОДНОМ контроле обработку сообщения ПОСЛЕ_ОБНОВЛЕНИЯ туда и загнать все проверки!

Я-Я-БА-А-ДА-А-БА-А-ДУУУ !!!![/b]


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 97

    TopList