На самом деле лучшее предложение, которое я могу дать, это не передавать параметры. Простое в открытии вашей формы событие или, что еще лучше, использование более позднего события загрузки - просто подобрать ссылку в вашем коде на ПРЕДЫДУЩУЮ форму вызова. Прелесть этого подхода в том, что если вы переходите от одного параметра к 10 параметрам сверхурочно, вам не нужно изменять код разбора параметров и даже не нужно изменять вызывающий код. На самом деле нет кода для изменения ВСЕГО, если вы решите проверить предыдущие значения из формы вызова.
Итак, имейте в виду, что использование открытых аргументов - это только один из способов. Вы не можете использовать его для возврата значений в форму вызова. Кроме того, все параметры open args должны быть строками. Таким образом, вы теряете любую возможность типирования датировки, например, целых чисел или даже форматирования даты и времени, что может быть довольно проблематичным для анализа. И, как вы можете видеть на примере, приведенном здесь, код для разбора строк в любом случае может немного запутаться.
Простое решение состоит в том, что в каждой форме, в которой вы хотите получить значения из ПРЕДЫДУЩЕГО, просто объявите переменную уровня модуля следующим образом
Dim frmPrevous as form.
Затем в ваших формах при загрузке события просто выберите название предыдущей формы следующим образом:
Set frmPrevious = screen.ActiveForm
Вот и все. Мы сделали!
Мы написали здесь только одну строку кода. (Хорошо, если вы включите декларацию). На этом этапе слова ЛЮБОЕ место в текущем коде вашей формы вы можете ссылаться на свойства событий и любое поле или значение в предыдущей форме, выполнив следующую команду
Msgbox "PK id of previous form = " & frmPrevious.ID
И скажем по какой-то причине, что вы хотите, чтобы предыдущая форма перезагружала записи, как в форме продолжения. Тогда мы можем пойти:
frmPrevious.Requery
Или принудительно сохранить запись:
frmPrevious.Dirty = false
Итак, вышеизложенное становится почти таким же естественным и удобным, как использование «ME» в вашем текущем коде. Я нахожу это настолько простым и легким, что, я думаю, это должно было быть частью доступа.
И как уже упоминалось, использование бесконечно, я могу проверить ЛЮБОЙ столбец или значение из формы вызова. Вы даже можете объявить переменные и функции как общедоступные, а затем их можно использовать.
И обратите внимание, что это работает ОБА ПУТИ. Я могу набивать и изменять значения в форме вызова. Поэтому я могу обновить или изменить значение любого значения / столбца / элемента управления из формы вызова.
И разбор абсолютно не требуется. Кроме того, вышеприведенный шаг кода работает, даже если одна и та же существующая форма вызывается разными формами. Во всех случаях формы, вызывающие ID, могут быть получены без изменения вашего кода.
И даже в случае, когда у меня есть много разных форм, запускающих и вызывающих эту конкретную форму, вы все равно можете извлечь столбец ID. И в случае, если столбцы могут отличаться от разных форм, вы можете просто объявить открытые переменные или публичные функции в вызывающей форме одного и того же имени. Итак, если я хотел вызвать форму, которая нуждается в DateCreate, но у каждой формы НЕ было согласованного имени столбца DateCreate (возможно, invoiceDateCreate и инвентаризации Date Create), то вы просто объявляете открытую функцию в вызывающих формах с постоянным именем , Затем мы можем пойти:
Msgbox "Date created of calling form record = " & frmPrevious.DateCreated
Итак, Дата создания может быть публичной переменной или публичной функцией в предыдущей форме, которая может быть любым мыслимым столбцом из базы данных.
Так что не передавайте значения между формами, просто передавайте ссылку на вызывающую форму, это не только удивительно более гибко, чем другие методы, показанные здесь, это также объектно-ориентированный подход, в котором вы не ограничены передачей значения.
Вы также можете вернуть значения в форму вызова, просто установив значение любого элемента управления, который вы хотите (frmPrevous.SomeContorlName).
И, как уже упоминалось, вы не ограничены просто передачей значений, но имеете полное использование кода, таких свойств, как dirty, и любых других вещей, которые существуют в вызывающей форме.
В качестве стандартной практики кодирования я принял вышеизложенное почти для каждой формы. Я просто заявляю и настраиваю форму предыдущей ссылки. Это приводит к удобной ссылке на предыдущую форму, так же полезной, как ссылка «ME» при написании кода.
С помощью этого стандарта кодирования я также могу вырезать и вставлять код между различными формами с разными именами, и, как правило, мой код будет продолжать работать без изменений.
И, как еще один пример, все мои формы имеют открытую функцию MyDelete, которая, конечно, удаляет запись в форме, поэтому, если я по какой-то причине хочу удалить запись в предыдущей форме вызова, тогда просто сделайте следующее
frmPrevious.MyDelete
Так что я могу сохранить данные в предыдущей форме. Я могу запросить предыдущую форму, я могу запустить код в предыдущей форме, я могу вернуть значения в предыдущую форму, я могу исследовать значения и все столбцы по цене только ОДНОЙ жалкой строки кода, которая устанавливает ссылку на вызов форма.