| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. Этот параметр строковый. Если сформировать строку в специальном формате, то можно передать и больше параметров. При открытии формы:
На открывающейся форме (на событии открытия или загрузки):
2. Инициализировать поле в открывающей форме:
2.1 или обявить в форме myforma2 функцию, которая и выполнит присваивание полю значения
3. Тоже самое, что и п.2, но уже в открываемой форме (на событии открытия или загрузки):
4. Использовать процедуру и п.1-3. Более сопровождаемый вариант.
ЗЫ: 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:48 |
| Гм... Теперь стало ругаться на эту строчку :( : Me.nListNum1 = frm.nListNum Говорит следуесчее Run time error '-2147352564 (80020009) Невозможно присвоить значение объекту Вот |
| Автор: Akina 16.10.2007, 10:56 | ||
по всей видимости... |
| Автор: Ane4ka 16.10.2007, 11:15 |
| Час от часу не легче... :'( Теперь это: Run Time error '2185': Невозможно обратиться к свойству или методуэлемента управления, пока на этот элемент не установлен фокус ввода. ------------------------------------------------ И ругаетсчя вот на эту строчку: Me.nListNum1.Text = frm.Controls("nListNum").Text |
| Автор: Akina 16.10.2007, 11:57 | ||
ну так и сделай предварительно
|
| Автор: kapbepucm 16.10.2007, 12:01 | ||
Или
|
| Автор: Ane4ka 16.10.2007, 13:31 |
| И в одном и во втором случае выскакивает всё та же ошибка.... |
| Автор: kapbepucm 16.10.2007, 13:50 |
| Где код выполняется, в событии OnOpen? |
| Автор: Ane4ka 16.10.2007, 14:08 | ||||
Да.
Если изменить на вот это:
Ошибка пропадает, но ничего не происходит |
| Автор: kapbepucm 16.10.2007, 14:17 | ||||
Похоже на то, что строки
Пробуй открывать эту форму из OnClick "Кнопка1" и там обращатся. Например:
|
| Автор: Ane4ka 16.10.2007, 14:46 |
| Всё равно ругается вот на это: List1.Load object required Ладно парни забейте.... Спасибо вам.... не судьба ему работать |
| Автор: kapbepucm 16.10.2007, 14:52 | ||
Продолжай начатое, свет в конце тунеля уже виден!
|
| Автор: Akina 16.10.2007, 15:00 |
| ну тогда попробуй сделать так, как положено - каждый объект отвечает только за себя. Создай модуль. В нем определи глобальную переменную. Присваивай ее методом одной формы, а бери значение методом другой формы. |
| Автор: Ane4ka 16.10.2007, 20:10 |
| ААААААААААААААААААААААААААААААААА заработало!!!!!!!!!!! Спасибо вам ребята!!! Боооооольшое!!! |
| Автор: bopoha 18.10.2007, 09:57 | ||||||
Поясню:
Нужно было так:
На момент этой операции форма Addl открыта? Добавлено через 8 минут и 25 секунд
Не делайте так!!!! Это очень плохо сопровождаемо. Всегда будет ведущий и ведомый объекты и интерфейс взаимодействия между ними, но только не через глобальные переменные. |
| Автор: bopoha 18.10.2007, 10:13 | ||||
Эта штука очень красиво заменяется, на это:
Что я и хотел предложить. Это компилируемый вариант. Т.е. если изменить имя поля nListNum на что-то другое и скомпилировать, то Access ругнется. |
| Автор: Akina 18.10.2007, 10:43 | ||
При наличии жесткой связи управляющий-управляемый - да... но если объекты независимы (а в данном случае, как мне кажется, скорее так, нежели иначе, ибо нет возврата в форму 1 после закрытия формы 2, есть последовательный их вызов) глобальная переменная есть не что иное как настройка загружаемого объекта, и по определению не должна содержаться в другом объекте. Вот это мне, например, очень не нравится - объект не знает, кто, как и почему его меняет. Ибо нет интерфейса взаимодействия, есть прямое вмешательство. Где еще, как не тут, почва для плохой сопровождаемости? |
| Автор: kapbepucm 18.10.2007, 11:41 |
| Объясните, пожалуйста, непонимающим- чем плох следующий алгоритм: .....Есть 2 независимые формы Form1 и Form2 .....Form1 открыта .....Form1 открывает Form2 .....Form1 что-то напрямую без посредников меняет в Form2 У меня есть куча подобных реализаций. Я ужаснулся читая вышенаписанное. |
| Автор: bopoha 18.10.2007, 13:39 | ||
Интерфейс может находится: 1. в функции, которая знает как открыть эту форму. Т.е. просто так открывать форму нельзя или она открывается в режиме по умолчанию. 2. На открываемой форме реализуется открытый метод (функция или процедура) В результате отпадает необходимость использовать глабальную переменную. С глобальной переменной возникает желание использовать ее одну для всех однотипных связок между формами. Этот алгоритм плох всем! Особненно большим количеством связей (неуправляемыми) между формами. Если у нас есть 10-ть мест в который меняется напрямую значение поля, а нам понадобилось обработать эти изменения по условию, то очень долго придется стучать в бубен и искать эти варианты использования. Если бы использовалась фукнция (п. 1 или 2), то меняем функцию компилируем и находим все несовпадения. Еще пример, измени 2-а имени поле на этой форме, а потом найди их. Или поменяй логику работы этой формы (удалились поля, добавились, переименовались). Вообще песня Исходя из этого принцип "каждый объект черный ящик и работать с ним можно через функции" очень хорошо себя оправдывает. |