2014-10-24 2 views
3

У меня есть форма под названием «деталь», которая показывает подробный вид выбранной записи. Запись выбирается из другой формы, называемой «поиск». Потому что я хочу, чтобы иметь возможность открыть несколько экземпляров «деталей», каждые из которых показывают детали другой записи, я использовал следующий код:Передача аргументов в формы доступа, созданные с помощью «New»

Public detailCollection As New Collection  

Function openDetail(patID As Integer, pName As String) 
'Purpose: Open an independent instance of form 
Dim frm As Form 
Debug.Print "ID: " & patID 

'Open a new instance, show it, and set a caption. 
Set frm = New Form_detail 
frm.Visible = True 
frm.Caption = pName 


detailCollection.Add Item:=frm, Key:=CStr(frm.Hwnd) 

Set frm = Nothing 
End Function 

PatID является первичным ключом записи я хочу показать в этом новый экземпляр «детали». Строка отладочной печати выводит правильный пароль, поэтому я имею его доступным. Как передать его этому новому экземпляру формы?

Я попытался установить OpenArgs новой формы, но получаю сообщение о том, что OpenArgs только для чтения. После исследования OpenArgs может быть установлен только DoCmd (это не сработает, потому что тогда я не получаю независимые экземпляры формы). Я не могу найти документацию о допустимых параметрах при создании объекта Form. По-видимому, Microsoft не рассматривает конструктор как метод, по крайней мере, согласно документам. Как я должен справиться с этим? (PLZ не говорите мне установить его в невидимое текстовое поле или что-то в этом роде) Спасибо, ребята, вы, ребята, лучше всего в сети, отвечая на эти вопросы для меня. Я люблю всех вас!

Исходный код для формы мульти инстанции взят из: http://allenbrowne.com/ser-35.html

ответ

9

Внутри формы Form_detail создайте собственное свойство.

Private mItemId As Long 

Property Let ItemID(value as Long) 
    mItemId = value 
    ' some code to re query Me 
End Property 

Property Get ItemId() As Long 
    ItemId = mItemId 
End Property 

Тогда в коде, который создает форму, вы можете это сделать.

Set frm = New Form_detail 

frm.ItemId = patId 

frm.Visible = True 
frm.Caption = pName 

Это позволит вам передать идентификатор в новый экземпляр формы, и убедиться, что он получает перезапросить прежде, чем сделать его видимым. Не нужно загружать все результаты каждый раз, если вы всегда открываете форму New. Вы позволяете собственности загружать данные вместо традиционного события .

Это работает, потому что модули формы доступа - это не что иное, как прославленные классы. Надеюсь это поможет.

+1

Ницца. Я понятия не имел, что «собственность» даже существовала. Со всем поисковым движком, который я сделал, вы думаете, что в какой-то момент он появится. Я уже реализовал решение, установив источник записи, но потом у меня возникла проблема, выяснив, что какая-то деталь уже открыта. Это должно решить эту проблему для меня. Кроме того, были проблемы с параметром источника записи, например, использование паттида для загрузки данных из других таблиц в подробном представлении. Необходимо было установить их с того же места, что и источник записи формы. Спасибо, RubberDuck. – user3646932

+0

Добро пожаловать! Я счастлив, что смогу помочь. Я очень рекомендую [статью CPearson о классах в VBA] (http://www.cpearson.com/excel/classes.aspx). Это должно помочь прояснить любые возникающие у вас вопросы о том, почему это работает. – RubberDuck

+0

Спасибо RubberDuck, что было полезно. Как кто-то, кто изучил ООП из Java/Python, я нахожу VBA ... странным. Я знаю, какие алгоритмы я хочу, но все же я ищу Google. Это раздражает. Вся информация, которую я могу получить, полезна, и Microsoft нелегко найти. – user3646932

3

Вы можете попробовать применение фильтра:

frm.Filter = "[ID] = " & patID 
frm.FilterOn = True 

Рекорд Источник Detail формы необходимо будет установить в таблицу который принадлежит идентификатору.

UPDATE Как вы просили, вот код, чтобы установить RecordSource:

frm.RecordSource = "select * from TableName where [ID] = " & patID 

Это, вероятно, чище, чем с помощью фильтра, учитывая, что пользователь может удалить фильтр (в зависимости от типа формы) ,

+0

Хотел бы я знать достаточно о VB, чтобы узнать, будет ли это работать. Я должен попробовать и посмотреть. Я хотел бы запросить BE, чтобы вернуть только одну запись, чтобы облегчить загрузку в многопользовательской среде. Я проведу это сегодня вечером. Спасибо за ответ. – user3646932

+0

Я просто думал об источнике записи. Если вы установите источник записи в строку запроса, данные будут там. Это, наверное, все, что мне нужно было сделать. Если вы добавите пару строк кода в свой ответ, который устанавливает источник записи в таблицу с фильтром, а также запрос, который возвращает одну запись из таблицы на основе patID, ваш ответ будет завершен для следующего парня и меня зеленый флажок. =) Если нет, я сделаю это позже и по-прежнему буду отмечать вас. Спасибо за помощь! – user3646932

+0

Я просто думал, что свойство recordSource будет установлено через графический интерфейс, то есть, если это не должно быть динамичным. – LungFungus