Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Возврат результата из формы в процедуру / 9 сообщений из 9, страница 1 из 1
24.08.2010, 14:53
    #36808216
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
Архитектурный критинизм...
В процессе выполнения процедуры я запускаю некую Form1, в зависимости от того чего там выберет пользователь, я должен присвоить какое-то значение в m_value (см.ниже).
Если бы это был простой MsgBox, то я бы написал
m_value = MsgBox (ДА/НЕТ).
Но у меня так сказать обычная (с рюшечками) форма.
Если как у меня Dim m_value объявлено в теле процедуры, то из формы не присвоишь.
Могу конечно объявить ее как Public в любом модуле,
но с другой стороны, взглянул и забыл, чего ей глобально болтаться по всей программе...непорядок.
Как извернуться? (чувствую что что-то простое, но не знаю)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub FunctionA()
    Dim m_value as...
    '<some code>
    'у программы возникли вопросы к пользователю
    'запускаем форму с объяснением ситуации и возможностью выбора
    Form1.Show  1  'модально чтобы код остановился до момента закрытия Form1
    '
    m_value=<значение которое зависит от выбора в Form1>
    if m_value=A then
         '<some code 1>
    else if m_value=B then
         '<some code 2>
    EndIf
End Sub
...
Рейтинг: 0 / 0
24.08.2010, 16:21
    #36808582
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
Дмитрий77,

Пока приходит в голову только следующее:

Загрузить форму заранее, до Show 1, присвоив ее какой-то переменной WithEvents, после чего выловить событие Unload и считать ее публичную переменную или функцию.
Или просто - чтобы форма выдала сама событие из своего Unload.
...
Рейтинг: 0 / 0
24.08.2010, 16:25
    #36808593
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
m_value = Form1.CreateForm

'Форма:
Public Function CreateForm()
    Show vbModal
    CreateForm = TextBox1.Text
    Unload Me
End Function
...
Рейтинг: 0 / 0
24.08.2010, 16:32
    #36808619
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
Antonariy - как всегда краток и точен! *THUMBS UP*
...
Рейтинг: 0 / 0
24.08.2010, 17:52
    #36808882
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
Antonariy,

Проверяли? Есть проблема.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub main()
    Dim m_value As String
    m_value = Form1.CreateForm
    MsgBox m_value
End Sub

'в форме
Public Function CreateForm() As String
    Show vbModal
    CreateForm = Text1.Text
    Unload Me
End Function
Пусть в конструкторе в Text1 написано Text1
Если после появления Form1 написать там Text2,
то ответ будет таки Text1 а не Text2 (проверил и в vb-среде и с exe).

Shocker.ProИли просто - чтобы форма выдала сама событие из своего Unload.
Так-то я обычно и поступаю. Но это означает делить код процедуры на 2 части, не есть Good.
Тем более что вывода этой формы может и не быть вовсе, а после ее появления(или не появления по условию) у меня напр. достаточно много кода, дублировать код в Unload и в остатке процедуры бы не хотелось, если потом меняешь в одном месте, то в другом частенько забываешь.

Shocker.ProЗагрузить форму заранее, до Show 1, присвоив ее какой-то переменной WithEvents, после чего выловить событие Unload и считать ее публичную переменную или функцию..
Это что-то как-то сложно будет. Проще уж тогда в модуле иметь
Public m_value
и в нее писать значение по Unload.
Я это значение прочитаю только по закрытии Form1 и только если форма запускалась, а форма всегда его туда напишет, так что м.б. не париться...раз все так сложно.
...
Рейтинг: 0 / 0
24.08.2010, 20:47
    #36809147
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
В VBA работает, а в VB6 не хочет. Скорее всего, из-за того что после ввода значений и закрытия формы, она уничтожается, а при получении значения заново загружается с дефолтными значениями. Проверил - Load вызывается два раза, а Initialize - 1 раз
...
Рейтинг: 0 / 0
24.08.2010, 21:22
    #36809183
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
VSVLADВ VBA работает, а в VB6 не хочет

Ну извращаться, так извращаться

Текст вызывающей формы Form1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub Command1_Click()

Dim m_value As New Collection, CalledForm As Form2
Set CalledForm = New Form2
CalledForm.Start m_value
CalledForm.Show  1 
MsgBox m_value( 1 )

End Sub
Текст вызываемой формы Form2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private RetColl As Collection

Public Function Start(Ret As Collection)

Set RetColl = Ret

End Function
Private Sub Form_Unload(Cancel As Integer)

RetColl.Add Me.Text1.Text

End Sub

вроде работает
...
Рейтинг: 0 / 0
25.08.2010, 10:14
    #36809641
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
Дмитрий77Antonariy,
Проверяли? Есть проблема.
Даже две. Я о них специально умолчал, чтобы попытались сами решить.

1)
VSVLADСкорее всего, из-за того что после ввода значений и закрытия формы, она уничтожается, а при получении значения заново загружается с дефолтными значениями.Это означает, что Unload нужно вызывать только после CreateForm =, а по кнопке подтверждения делать Hide или Visible = False. Или можно объявить локальную переменную, в которую копируется значение при нажатии кнопки, она до Terminate не обнулится.

2)
Нужно подавлять закрытие формы через крестик (или вообще отключить крестик), обрабатывая событие Form_QueryUnload, в котором параметр UnloadMode равный 0 означает закрытие крестиком. Или забить, если использовать локальную переменную.
...
Рейтинг: 0 / 0
25.08.2010, 13:25
    #36810346
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат результата из формы в процедуру
AntonariyЯ о них специально умолчал, чтобы попытались сами решить.
Заботливый...но все равно спасибо.
Решил. По своему.
Дмитрий77Проще уж тогда в модуле иметь
Public m_value
и в нее писать значение по Unload.

Antonariyа по кнопке подтверждения делать Visible = False.
и... вообще отключить крестик
Да так работает, я проверил. Но в приложение внедрять уже не стал. Как то навороченно все это выглядит, а после всех рассуждений нет особо доверия...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Возврат результата из формы в процедуру / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]