Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Передача информации из одного поля в другое (Edit)


Автор: Ane4ka 16.10.2007, 00:30
Сново рад приветствовать вас. Я столкнулся с очередной проблеймой :( и сново прошу помощи.

У меня есть две формы на каждой из которых есть поле(Edit) - номер путевого листа. Сначала предлогается заполнить форму (AddL) где одним из полей является номер листа, затем по нажатию на кнопу (Кнопка1) происходит переход на вторую форму (List1, где есть такое же поле Edit). Как сделать чтобы при переходе на 2-ю форму в поле (Edit) вводился тот-же номер что мы ввели на 1-й форме?

Надеюсь вопрос сформулирован понятно.... Большое спасибо за любую помосчь

Автор: bopoha 16.10.2007, 07:54
На форму можно передать данные разными способами:
1. Атрибут OpenArgs.

Этот параметр строковый. Если сформировать строку в специальном формате, то можно передать и больше параметров.
При открытии формы:
Код

DoCmd.OpenForm "myforma2",,,,,,"значение параметр"


На открывающейся форме (на событии открытия или загрузки):
Код

Dim stPrm as String

stPrm = nz(Me.OpenArgs, "значение по умолчанию")


2. Инициализировать поле в открывающей форме:
Код

dim frm As Form_myforma2
DoCmd.OpenForm "myforma2"

set frm = Forms("myforma2")
frm.pole = value

2.1 или обявить в форме myforma2 функцию, которая и выполнит присваивание полю значения
Код

dim frm As Form_myforma2
DoCmd.OpenForm "myforma2"

set frm = Forms("myforma2")
calc frm.func( value )



3. Тоже самое, что и п.2, но уже в открываемой форме (на событии открытия или загрузки):
Код

set frm = Forms("myforma1")
me.pole = frm.pole


4. Использовать процедуру и п.1-3. Более сопровождаемый вариант. 
Код

Public Sub OpenMyForma2(byVal param as Sytring)
dim frm As Form_myforma2
DoCmd.OpenForm "myforma2"

set frm = Forms("myforma2")
frm.pole = param
End Sub


ЗЫ: 4. пункт мне больше нравится, в последующем пишется меньше кода. Так же он компилируем - изменяем количество параметров, компилируем и находим все места, которые необходимо подправить. Также легко использовать функцию в меню.

Автор: Akina 16.10.2007, 08:45
Есть еще вариант - использовать не две формы, а одну. По нажатию кнопки перехода на шаг 2 просто скрываем ненужные контролы, показываем нужные, перемещаем те, что должны остаться... тогда и передавать ничего не нужно.

Автор: Ane4ka 16.10.2007, 09:38
Пробывала разные варианты но каждый раз выдаётк следуюсчую ошибку:
Type mismatch

Вот пример вставляемого кода:

Private Sub Form_Open(Cancel As Integer)
Dim frm As Form_List1
Set frm = Forms("Addl")
Me.nListNum1 = frm.nListNum
End Sub

Где, List1 - Имя формы на котой находится поле (nListNum, с которого собственно и берётся значение);
        Addl - Имя формы на которой расположено поле (nListNum1, в которое должно занестись значение из nListNum);
Событие назначено на открытие формы Addl

Автор: Akina 16.10.2007, 10:21
Цитата(Ane4ka @  16.10.2007,  10:38 Найти цитируемый пост)
каждый раз выдаётк следуюсчую ошибку:
Type mismatch

А в какой именно строке выдает, секрет? 

Вероятно, в строке
Цитата(Ane4ka @  16.10.2007,  10:38 Найти цитируемый пост)
Dim frm As Form_List1

потому как должно быть
Код

Dim frm As Form


Автор: Ane4ka 16.10.2007, 10:48
Гм...
Теперь стало ругаться на эту строчку :( :
Me.nListNum1 = frm.nListNum

Говорит  следуесчее
Run time error '-2147352564 (80020009)

Невозможно присвоить значение объекту

Вот  smile :(

Автор: Akina 16.10.2007, 10:56
Код

Me.nListNum1.Text = frm.Controls("nListNum").Text

по всей видимости... 

Автор: Ane4ka 16.10.2007, 11:15
Час от часу не легче... :'(
Теперь это:
Run Time error '2185':

Невозможно обратиться к свойству или методуэлемента
управления, пока на этот элемент не установлен фокус ввода.
------------------------------------------------
И ругаетсчя вот на эту строчку:
Me.nListNum1.Text = frm.Controls("nListNum").Text

Автор: Akina 16.10.2007, 11:57
ну так и сделай предварительно
Код
Me.nListNum1.SetFocus
Что ты как дитё малое, право слово...

Автор: kapbepucm 16.10.2007, 12:01
Или
Код
Me.nListNum1.Value = frm.Controls("nListNum").Text


Автор: Ane4ka 16.10.2007, 13:31
И в одном и во втором случае выскакивает всё та же ошибка....

Автор: kapbepucm 16.10.2007, 13:50
Где код выполняется, в событии OnOpen?

Автор: Ane4ka 16.10.2007, 14:08
Да.

Код

Private Sub Form_Open(Cancel As Integer)
Dim frm As Form
Set frm = Forms("Addl")
Me.nListNum1.SetFocus
Me.nListNum1.Text = frm.Controls("nListNum").Text
End Sub


Если изменить на вот это:
Код

Private Sub Form_OnOpen(Cancel As Integer)
Dim frm As Form
Set frm = Forms("Addl")
Me.nListNum1.SetFocus
Me.nListNum1.Text = frm.Controls("nListNum").Text
End Sub

Ошибка пропадает, но ничего не происходит

Автор: kapbepucm 16.10.2007, 14:17
Похоже на то, что строки
Код
Me.nListNum1.SetFocus
Me.nListNum1.Text = frm.Controls("nListNum").Text
принципиально работать не будут. (к nListNum1 ещё рано тут обращатся)
Пробуй открывать эту форму из OnClick "Кнопка1" и там обращатся. Например:
Код
DoCmd.OpenForm "List1"
Forms("List1").Controls("nListNum").Value = Me.nListNum1.Value

Автор: Akina 16.10.2007, 14:29
В Private Sub Form_Open это в принципе работать не может и, соответственно, не будет. Форма еще не загружена, присвоение невозможно.

Цитата(kapbepucm @  16.10.2007,  15:17 Найти цитируемый пост)
Пробуй открывать эту форму из OnClick "Кнопка1" и там писать эти строки

Вообще-то так и делают:
Код

Private Sub Button_Click
Form2.Load
Form2.Controls("nListNum1").Text = Me.nListNum.Text
End Sub

Цитата(Ane4ka @  16.10.2007,  15:08 Найти цитируемый пост)
Если изменить на вот это:

Конечно, OnOpen - это событие, а имя обрабатывающей его процедуры Form_Open

Автор: Ane4ka 16.10.2007, 14:46
Всё равно ругается вот на это: List1.Load
object required

Ладно парни забейте.... Спасибо вам....
не судьба ему работать

Автор: kapbepucm 16.10.2007, 14:52
Продолжай начатое, свет в конце тунеля уже виден!
Код
DoCmd.OpenForm "List1"
Forms("List1").Controls("nListNum").Value = Me.nListNum1.Value
Только что проверил, работает.

Автор: Akina 16.10.2007, 15:00
ну тогда попробуй сделать так, как положено - каждый объект отвечает только за себя.

Создай модуль. В нем определи глобальную переменную. Присваивай ее методом одной формы, а бери значение методом другой формы.

Автор: Ane4ka 16.10.2007, 20:10
ААААААААААААААААААААААААААААААААА заработало!!!!!!!!!!!
 smile  smile  smile  smile  smile  smile  smile  smile  smile  smile  smile 
Спасибо вам ребята!!! Боооооольшое!!!

Автор: bopoha 18.10.2007, 09:57
Поясню:
Цитата(Ane4ka @  16.10.2007,  09:38 Найти цитируемый пост)

Private Sub Form_Open(Cancel As Integer)
Dim frm As Form_List1 '-- Тут объявляем переменную типа Form_List1
Set frm = Forms("Addl") '-- тут Пытаемся присвоить ссылку на форму типа Form_Addl - естественно ошибка
Me.nListNum1 = frm.nListNum
End Sub


Нужно было так:
Цитата(Ane4ka @  16.10.2007,  09:38 Найти цитируемый пост)

Private Sub Form_Open(Cancel As Integer)
Dim frm As Form_Addl 
Set frm = Forms("Addl") 
Me.nListNum1 = frm.nListNum
End Sub



На момент этой операции форма Addl открыта?

Добавлено через 8 минут и 25 секунд
Цитата(Akina @  16.10.2007,  15:00 Найти цитируемый пост)
Создай модуль. В нем определи глобальную переменную. Присваивай ее методом одной формы, а бери значение методом другой формы. 


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

Автор: bopoha 18.10.2007, 10:13
Цитата(kapbepucm @  16.10.2007,  14:52 Найти цитируемый пост)

DoCmd.OpenForm "List1"
Forms("List1").Controls("nListNum").Value = Me.nListNum1.Value


Эта штука очень красиво заменяется, на это:

Код

Dim frm As Form_List1
DoCmd.OpenForm "List1"
Set frm = Forms("List1")
frm.nListNum.Value = Me.nListNum1.Value '-- .Value - писать не обязательно


Что я и хотел предложить. Это компилируемый вариант. Т.е. если изменить имя поля nListNum на что-то другое и скомпилировать, то Access ругнется.

Автор: Akina 18.10.2007, 10:43
Цитата(bopoha @  18.10.2007,  10:57 Найти цитируемый пост)
Не делайте так!!!! Это очень плохо сопровождаемо. Всегда будет ведущий и ведомый объекты и интерфейс взаимодействия между ними, но только не через глобальные переменные.

При наличии жесткой связи управляющий-управляемый - да... но если объекты независимы (а в данном случае, как мне кажется, скорее так, нежели иначе, ибо нет возврата в форму 1 после закрытия формы 2, есть последовательный их вызов) глобальная переменная есть не что иное как настройка загружаемого объекта, и по определению не должна содержаться в другом объекте.

Цитата(bopoha @  18.10.2007,  11:13 Найти цитируемый пост)
Эта штука очень красиво заменяется, на это:

Вот это мне, например, очень не нравится - объект не знает, кто, как и почему его меняет. Ибо нет интерфейса взаимодействия, есть прямое вмешательство. Где еще, как не тут, почва для плохой сопровождаемости?

Автор: kapbepucm 18.10.2007, 11:41
Объясните, пожалуйста, непонимающим- чем плох следующий алгоритм:
.....Есть 2 независимые формы Form1 и Form2
.....Form1 открыта
.....Form1 открывает Form2
.....Form1 что-то напрямую без посредников меняет в Form2
У меня есть куча подобных реализаций. Я ужаснулся читая вышенаписанное.

Автор: bopoha 18.10.2007, 13:39
Цитата(Akina @  18.10.2007,  10:43 Найти цитируемый пост)
Вот это мне, например, очень не нравится - объект не знает, кто, как и почему его меняет. Ибо нет интерфейса взаимодействия, есть прямое вмешательство. Где еще, как не тут, почва для плохой сопровождаемости? 


Интерфейс может находится:
1. в функции, которая знает как открыть эту форму. Т.е. просто так открывать форму нельзя или она открывается в режиме по умолчанию.

2. На открываемой форме реализуется открытый метод (функция или процедура)

В результате отпадает необходимость использовать глабальную переменную. 

С глобальной переменной возникает желание использовать ее одну для всех однотипных связок между формами.


Цитата(kapbepucm @  18.10.2007,  11:41 Найти цитируемый пост)
.....Form1 что-то напрямую без посредников меняет в Form2


Этот алгоритм плох всем! Особненно большим количеством связей (неуправляемыми) между формами.
Если у нас есть 10-ть мест в который меняется напрямую значение поля, а нам понадобилось обработать эти изменения по условию, то очень долго придется стучать в бубен и искать эти варианты использования. Если бы использовалась фукнция (п. 1 или 2), то меняем функцию компилируем и находим все несовпадения. Еще пример, измени 2-а имени поле на этой форме, а потом найди их. Или поменяй логику работы этой формы (удалились поля, добавились, переименовались). Вообще песня smile. В этом случа удачной ночной смены.

Исходя из этого принцип "каждый объект черный ящик и работать с ним можно через функции" очень хорошо себя оправдывает. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)