Получение значений из модального окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Получение значений из модального окна

Сообщение BasiС » 14.04.2007 (Сб) 22:18

Доброго времени суток, уважаемые All!

Подскажите плиз, если кто сталкивался с такой проблемой.

Суть: Вызывается модальная форма, в ней юзером заполняются поля. Затем, форма закрываются и эти значения должны попасть в процедуру которая собственно и вызвала эту форму. Возможно ли это сделать не плодя глобальные переменные?

Пробовал так:

Код: Выделить всё
Load frmRecEdit
With frmRecEdit
    .Show vbModal, Me
    MsgBox .txtEdit(0).Text
End With


Но возвращается значение, которое было присвоено txtEdit(0) при загрузке формы.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.04.2007 (Сб) 22:21

Да, не выгружать форму, а делать Me.Hide.

В процедуре - получать значения, а уже потом делать Unload frmRecEdit
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 14.04.2007 (Сб) 22:28

Не поверишь! получилось =)

А я целый день голову ломаю...


Спасибо!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 14.04.2007 (Сб) 22:30

Ну почему-же не поверю? Я так на протяжении многих лет делаю, и получается, однако.

Ну забудь про события QueryUnload. Ибо если юзер закроет окно, то она всё же будет Unload-ed. Смотри UnloadMode и делай Cancel если нужно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Сообщение BasiС » 14.04.2007 (Сб) 23:31

На будущее, может кому понадобится...

Для того, чтобы узнать, загружена форма или нет, можно это проверить функцией:

Код: Выделить всё
Public Function IsFormaObject(frmstr As String) As Boolean
'Проверка - загружена форма или нет
Dim x As Integer
For x = 0 To Forms.count - 1
    If Forms(x).name = frmstr Then
        IsFormaObject = True
        Exit Function
    End If
Next
IsFormaObject = False
End Function

Спасибо EUGY http://bbs.vbstreets.ru/viewtopic.php?t ... 6%E5%ED%E0

Мой код принял законченный вид:

Код: Выделить всё
Load frmRecEdit
With frmRecEdit
    .Show vbModal
    If Not IsFormaObject("frmRecEdit") Then Exit Sub
    MsgBox .txtEdit(0).Text
End With
Unload frmRecEdit

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.04.2007 (Вс) 10:20

Код: Выделить всё
r = frmRecEdit.CreateForm

'форма
Dim lCancel As Boolean

Public Function CreateForm() As String
    lCancel = False
    Show 1
    If Not lCancel Then CreateForm = txtEdit(0).Text
    Unload Me
End Function

Private Sub cmdCancel_Click()
    lCancel = True
    Hide
End Sub

Private Sub cmdOk_Click()
    Hide
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    lCancel = UnloadMode = 0
End Sub
Лучший способ понять что-то самому — объяснить это другому.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.04.2007 (Вс) 22:41

Лично я получение данных из модальных окон организую так:
Есть у формы метод типа Run или ещё чего. Он ByRef последовательно или структурой получает параметры, которые форма должна изменять.
Оттуда вызывается Me.Show vbModal. После того как форма отработала и управление вернулось, просто копирую данные в переданные параметрами.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.04.2007 (Вс) 22:55

Странные вы...

Форма, которая unloaded - она прекрасно существует и в ней доступны все её переменные и свойства... ни разу в жизни не использовал Hide...

frmMain
Код: Выделить всё
Option Explicit

Private Sub cmdShowDialog_Click()
  Dim f As frmDialog
 
  Set f = New frmDialog
  f.Show vbModal
 
  MsgBox f.UserSelectedValue
End Sub


frmDialog
Код: Выделить всё
Option Explicit

Private mUserSelectedValue As String

Public Property Get UserSelectedValue() As String
  UserSelectedValue = mUserSelectedValue
End Property

Private Sub cmdOK_Click()
  Unload Me
End Sub

Private Sub Form_Unload(Cancel As Integer)
  mUserSelectedValue = Text1.Text
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.04.2007 (Вс) 23:25

Дело в том, что иногда требуется валидация введённых значений. Причём валидация делается после опроса, и в коде формы она не возможна. Если использовать Хайд, то в вызывающей процедуре, можно после выполнения валидации, в случае возникновения ошибки во введённых данных, показать соотв. мессаг и вернуть пользователя в исходное состояие (Show форму). Причём форма покажется в том же самом состоянии, в котором она была до того как пользователь её закрыл.

А если её unload-ить, то значения полей придётся восстанавливать заново.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sergeant Pepper
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 25.08.2006 (Пт) 8:49

Сообщение Sergeant Pepper » 15.04.2007 (Вс) 23:35

Можно использовать WithEvents и в вызывающей форме обрабатывать события открытой модально формы.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.04.2007 (Пн) 0:27

[cuted, из-за неактуальности]
Это насчёт формулировки.

А на счёт идеи - да, можно, но только если модальная форма вызывается из формы. А если из кода?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sergeant Pepper
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 25.08.2006 (Пт) 8:49

Сообщение Sergeant Pepper » 16.04.2007 (Пн) 0:36

Хакер писал(а):А на счёт идеи - да, можно, но только если модальная форма вызывается из формы. А если из кода?

Ну не только же из формы, можно из модуля класса.
Открытие формы из стандарного модуля почему-то неактуальный вариант для меня.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.04.2007 (Пн) 12:17

А я всегда делаю это именно из функии, обяъявленной в модуле.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot] и гости: 96

    TopList