Официальный сайт студ.городка НГТУ
Программирование и БД » VB.net Передача данных между формами(окнами) 

#1  25.05.11 12:17

VB.net Передача данных между формами(окнами)

Всем доброе время суток!
Прошу помощи в написание грамотного универсального кода для обмена данными между формами.
Поясню, в приложение существуют "формы справочников" и "формы документов". Многие поля на "форме документов" заполняются методом выбора из справочника(который собственно открывается в отдельном окне). Хотелось бы сделать так чтобы после вызова из "формы документа" "формы справочника", "форма справочника" возращала выбранное значение именно в то окно(форму) из которого она была вызвана(в не зависимости какое количество экземпляров класса "форма документа" в данный момент открыто в приложении), по аналогии как это сделано со стандартным OpenFileDialog(когда после выбора файла форма возращает значение в переменную DialogResult), за одним лишь исключением что все это должно присходить в MDI контейнере без использования Модального режима.
Сразу оговорюсь что  я не программист, поэтому длинные и умные слова меня растраивают, поэтому прошу проявить искуство объяснять доходчего, а ещё лучше привести пример готового рабочего кода.
Буду очень благодарен за ответ.
PS. Среда разработки VisualStudio 2005\2008

Исправлено eagle (25.05.11 12:28)

Offline

#2  11.06.11 17:12

Re: VB.net Передача данных между формами(окнами)

Совет 217a. Как передавать данные между формами
   
На этой странице…
    1. Передача параметров через свойства объектов
    2. Передача данных через параметры процедур
    3. Передача данных через глобальные переменные
   
Читатель прислал нам такой вопрос

«Пишем программу на VB4/16, и не можем передать переменную или массив из одной формы в другую. Если Вас не затруднит, помогите советом.»
Наш ответ таков

Конечно, было проще ответить, рассмотрев конкретную конструкцию, которую пытаются реализовать читатели. Но лучше попробовать разобраться в принципах информационного взаимодействия двух форм.
1. Передача параметров через свойства объектов

Для этого создадим две формы Form1 и Form2, на каждой из которых разместим текстовое поле и командную кнопку. При такой последовательности создания форм в качестве стартовой формы приложения будет выбрана Form1. В VB4 этот параметр корректируется командой Tools|Options|Project|Startup Form, в VB5/6 — Project|Project Properties|General|Startup Object. Для элементов Form2 установим имена элементов управления как Text2 и Command2 соответственно (чтобы отличать зрительно объекты по их именам), а также Text2.Text = «Text2». Для кнопок Command1 и Command2 установим соответственно такие свойства Caption: «Запустить Form2» и «Вернуть управление в Form1». И напишем для них следующий программный код:
Листинг 1.

Private Sub Command1_Click()
  Form2.Show 1 ' вывод Form2 в модальном режиме
End Sub

для формы Form2 (для внешнего элемента управления Text1 обязательно указание имени формы Form1):
Листинг 2.

Private Sub Form_Activate()
  ' установка при запуске формы
  Text2.Text = Form1.Text1.Text
  Form1.Text1.Text = "" 'очистить поле
End Sub
Private Sub Command2_Click()
  ' Возврат в Form1
  ' переписываем содержимое Text2 в Text1
  Form1.Text1.Text = Text2.Text
  Form2.Hide ' закрыть форму
End Sub

Обратите внимание, что форма Form2 запускается в модальном режиме (значение параметра равно 1). Это означает, что фокус приложения переходит в Form2 — родительская форма Form1 остается видимой, но недоступной для каких-либо операций. Запустите приложение и нажмите кнопку «Запустите Form2» — появится форма Form2, при этом в поле Text2 будет записано содержимое Text1. (Само поле Text1 при этом очистится). Теперь нажмите «Вернуть управление в Form1» — управление вернется в Form1 и в поле Text1 будет установлено содержимое Text2. (Вы можете сами устанавливать содержимое полей, чтобы убедиться в правильности обмена информацией.)

Таким образом мы видим, как происходит передача информации от одной формы к другой в виде установки или чтения свойств элеменов управления. Все формы и находящиеся на них элементы управления являются глобальными: их свойства и методы доступны из процедур других модулей (в том числе BAS-модулей). Вот как выглядит полное имя элемента управления:
Листинг 3.

[Имя_Формы.]Имя_Элемента_Управления

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

Продолжим наши эксперименты. Создадим на форме Form1 еще одну командную кнопку, для которой установим свойства Name = Command11 и Caption = «Второй вариант запуска», и напишем для нее такой код:
Листинг 4.

Private Sub Command11_Click()
  ' второй вариант запуска
  Call Form2.Text2_KeyPress(65)
End Sub

Для поля Text2 на форме Form2 напишем следующую процедуру:
Листинг 5.

Public Sub Text2_KeyPress(KeyAscii As Integer)
  Show  ' запуск формы Form2 в немодальном режиме
  Text2.Text = "Значение = " & KeyAscii
End Sub

Запустите на выполнение приложение, нажмите на форме Form1 кнопку Command21 и вы увидите картину, изображенную на  Изображение GIF Рис. 1. рисунке.

В этом примере мы обратились из формы Form1 напрямую к процедуре Form2 (в данном случае к Text2_KeyPress) и даже передали в нее информацию в виде параметра процедуры. Но обратите внимание, что выше мы установили для событийной процедуры Text2_KeyPress тип Public, вместо Private по умолчанию.

Очевидно, что такое использование встроенной событийной процедуры является довольно искусственным и ограниченным по возможностям — мы можем использовать только весьма простые, предопределенные варианты передачи параметров. К тому же можно столкнуться с тем, что эти процедуры неожиданно выполняют еще какие-то встроенные операции, которые нам тут не нужны.

Гораздо лучше для реализации второго варианта создать в Form2 простую процедуру, например с именем Start3 (но обязательно типа Public):
Листинг 6.

Public Sub Start3(StartName$)
  Show 'запуск формы Form2
  Text2.Text = StartName$
End Sub

а в процедуре Command11_Click (форма Form1) записать такой код:
Листинг 7.

Private Sub Command11_Click()
  Call Form2.Start3("Третий вариант запуска")
End Sub

Очевидно, что в этом случае мы может реализовать любой вариант передачи параметров из Form1 в Form2, в том числе и массивы.

Совсем другой вопрос — что мы будем делать с передаваемыми параметрами? В приведенном здесь примере мы их сразу использовали для формирования свойств объектов. А можно переписать эти данные в глобальные переменные на уровне данного модуля (формы), которые затем передать в другие процедуры.
3. Передача данных через глобальные переменные

Еще один вариант передачи данных между модулями — использование глобальных переменных, доступ к которым разрешен из любых процедур приложения. Однако нужно иметь в виду, что в VB такие переменные можно создавать только в модуле кода BAS. Поэтому если вы хотите, чтобы обе созданные нами формы работали с общими данными, то нужно создать BAS-модуль и в нем описать соответствующие глобальные переменные:
Листинг 8.

Global MyArray$(), MyVar As Integer

В форме Form1 создадим еще одну командную кнопку Command12 и запишем для нее такой код:
Листинг 9.

%
Private Sub Command12_Click()
  ' передача данных через глобальные переменные
  ReDim MyArray$(200)
  MyArray$(1) = "Элемент1"
  MyVar = 1001
  Call Form2.Start4
End Sub

В форме Form2 сформируем еще одну процедуру:
Листинг 10.

Public Sub Start4()
  Form1.Text1.Text = MyArray$(1)
  Text2.Text = MyVar
  Show
  MsgBox UBound(MyArray$)
End Sub

Запустите приложение на выполнение и убедитесь, что при нажатии кнопки Command12 передача данных в Form2 выполняется правильно. Обратите внимание, что в модуле формы Form1 мы не только устанавливаем значения глобальных переменных, но и можем изменять размер массивов, объявленных динамическими.


Взято с http://www.microsoft.com/Rus/Msdn/Activ … /217a.mspx

Offline

#3  17.06.11 15:16

Re: VB.net Передача данных между формами(окнами)

Llevella, спасибо за ответ, но это не совсем то что нужно.
В приведенных Вами примерах везде идет прямое обращение к свойствам второй формы, тоесть везде используется Form1.Свойство, это не будет работать если будет открыто несколько экземпляров класса Form1(DIM F as new Form1, ) к тому же нужно заранее знать в какую форму нужно возращать параметры, мне же необходимо что бы форма "Хозяин" передавала ссылку на объект в форму "дочку", собственно по этой ссылке форма "дочка" вернёт в форму "хозяина" необходимые параметры.

Offline

Программирование и БД » VB.net Передача данных между формами(окнами) 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.039 сек.
Выполнено 11 запросов.