Страницы: 1
RSS
Событие Textbox_Exit. Как выполнить кодом?
 
Здравствуйте уважаемые форумчане.
Вопрос такой.
Имеется пользовательская форма, на которой размещены два фрейма. В каждом фрейме размещены два текстбокса. В процедурах TextBox_Exit для каждого текстбокса написан код, который должен выполняться при выходе из него.
При переходе между текстбоксами, принадлежащих одному фрейму, обработка события Exit происходит так, как и должно быть.
Однако при переходе между текстбоксами, принадлежащих разным фреймам, обработка события Exit не выполняется, а происходит только при закрытии формы(в данном случае)
Как в этом случае организовать такую обработку, чтобы Exit срабатывал?
Спасибо
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Прописать действия в код события выхода из Frame
 
vikttur, это понятно, что надо прописать. Вопрос в том - что? Просто так эта процедура не вызывается, я не могу её вызвать по коду Call Textbox1_Exit
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Цитата
Artem1977 написал:
Вопрос в том - что?
плохо понятный вопрос. Событие:
Код
Private Sub Frame2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "Выход из Frame2"
End Sub

Цитата
Artem1977 написал:
я не могу её вызвать по коду Call Textbox1_Exit
а зачем Вам вызывать её по Textbox1_Exit? Я этого не очень понимаю, но тем не менее вызвать можно так:
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "Выход из TextBox1 Frame1"
    Call Frame2_Exit(Cancel)
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Понял свою ошибку.
Я пытался вызвать процедуру так: Call TextBox1_Exit(True), и так: Call TextBox1_Exit(False). Выдавало ошибку.
А надо было так Call TextBox1_Exit(Cancel).

Спасибо
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Когда текстбокс один, два или три можно для каждого написать строчку кода вызывающего процедуру Exit, а если их много? Как в цикле их вызвать?
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Artem1977,  у Вас странная задача (или формулировка задачм): Вы хотите ВЫЗВАТЬ процедуру, которую ВЫЗЫВАТЬ не нужно - событие произойдёт и без Вызова.
Т.е. по формулировке получается: Событие Exit  не происходило, но его нужно вызвать )
 
Юрий М, вроде бы в начале темы описал что мне нужно. повторюсь ещё раз. при выходе из каждого текстбокса должно происходить определённое действие, например форматирование текста, размещённого в этом текстбоксе. при переходах между текстбоксами размещённых в одном фрейме, эти действия выполняются. Но при переходе в текстбокс размещённый в другом фрейме событие для текстбокса в котором были перед переходом не выполняются и текст остаётся неотформатированным. Вот мне и нужно в событие frame_exit прописать код который вызовет событие exit для всех текстбоксов, размещённых в нём. Текстбоксов может быть не один и не два, поэтому необходимо в цикле их обойти
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Цитата
Artem1977 написал:
необходимо в цикле их обойти
затея так себе, конечно....Лучше пересмотреть логику, наверное. Но тем не менее:
Код
for each ocntrl in Frame1.controls 'цикл по всем элементам внутри Frame
if typeof ocntrl is msforms.textbox then 'отбираем только TextBox-ы
'а здесь что-то делаем: вызываем или еще что там
'правильнее всего здесь вызывать процедуру проверки этого текстбокса
end if
next
кстати, здесь чуть подробнее описывал механизм подобных переборов: Как быстро заполнить/очистить элементы на форме(TextBox-ы, ComboBox-ы)
Изменено: Дмитрий(The_Prist) Щербаков - 25.01.2022 08:21:36
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Событие Textbox_Exit. Как выполнить кодом?
выполните например так:
Код
  Dim c As MSForms.ReturnBoolean
  TextBox2_Exit c
добавьте процедуру
Код
Private Sub TextBox2_Change()
  Dim c As MSForms.ReturnBoolean
  TextBox2_Exit c
  TextBox4.SetFocus
End Sub
в модуль вашей формы
теперь при каждом изменении TextBox2 будет выполнена TextBox2_Exit  (TextBox2 станет запрограммированым так, что в нем нельзя будет изменить более 1 символа за сеанс посещения ТексБокс)
вы это хотели увидеть?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, нет, не это.
Еще раз. В Frame1 имеется пускай десять текстбоксов - TBx1, TBx2 ... TBx10. В событии Exit для каждого из них написан код, который должен выполняться при покидании текстбокса
Код
Private Sub TBx1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    'текст кода для TBx1
End Sub

Private Sub TBx2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    'текст кода для TBx2
End Sub
и т.д. до TBx10
Во Frame2 также имеются текстбоксы. Пускай их будет 5 шт. И в них также имеется свой код для события Exit.

Так вот при переходе из Frame1 в Frame2 в последнем текстбоксе где находилсиь событие Exit для него не выполняется.
Мне нужно для события Frame1_Exit прописать такой код, который бы вызвал событие Exit у всех текстбоксов расположенных в Frame1. Но не прописывать в коде вызов процедуры для каждого текстбокса, а обойти их в цикле.
Т.е. не так:
Код
Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call TBx1_Exit(Cancel)
    Call TBx2_Exit(Cancel)
    ........
    Call TBx10_Exit(Cancel)
End Sub
А как-то так:
Код
Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim Ctrl As Control

    For Each Ctrl In Frame1.Controls
        If TypeOf Ctrl Is MSForms.TextBox Then
        '
        'вызываем процедуру Exit для этого контрола
        '
        End If
    Next
End Sub
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Цитата
Artem1977 написал:
А как-то так:
так я и не понял ни фига в итоге...Я ровно такой же код дал. Пример вызова события Exit для контрола из любой процедуры у Вас есть. Что теперь-то не получается?
Просто создаете функцию с параметром и передаете в неё текстбоксы из цикла и делаете с ними нужные действия(те, которые делали в каждом событии выходы отдельного текстбокса).
Код
Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim Ctrl As Control
 
    For Each Ctrl In Frame1.Controls
        If TypeOf Ctrl Is MSForms.TextBox Then
        '
        'вызываем процедуру Exit для этого контрола
        '
        Call EmulateExit(Ctrl)
        End If
    Next
End Sub

Function EmulateExit(Ctrl As Control)
    MsgBox Ctrl.Name
End Function
Изменено: Дмитрий(The_Prist) Щербаков - 25.01.2022 15:42:34
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Наверное это я нифига не понимаю.

Для каждого контрола - свой код должен выполняться. А не один и тот же.
Сейчас этот код прописан в каждой процедуре Exit контрола.
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Если все Ваши элементы управления логически связаны, то для чего Вы их сгруппировали в разные фреймы?
Уберите фреймы и всё будет, как Вы хотите.
Изменено: sokol92 - 25.01.2022 16:32:18
Владимир
 
Понятно. Раз ответ сразу не поступил - значит его нет.
Всем спасибо
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Понятно. Раз ответ сразу не поступил - значит его нет.
Всем спасибо

Цитата
Artem1977 написал:
If TypeOf Ctrl Is MSForms.TextBox Then        
       'вызываем процедуру Exit для этого контрола        '      
End If
Меня интересовал именно этот кусок кода. Что именно я должен написать, чтобы инициировать выполнение события Exit для контрола, который в данный момент перебирается в цикле.
А не как перебирать контролы или вызвать одну процедуру
Microsoft Office 2010 64-bit, Windows 10 Professional 64-bit
 
Цитата
Artem1977 написал:
Что именно я должен написать, чтобы инициировать выполнение события Exit
ничего Вы здесь не напишите, потому что событийную процедуру нельзя сопоставить с объектом цикла. События - это специальные процедуры, создание которых лежит на плечах внутренних ресурсов Excel и VBA.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Ігор Гончаренко , нет, не это.
да, вполне возможно, я не читаю мысли, я читаю вопрос и отвечаю на него, если ответ на вопрос вам совсем не нужен, то понятно, что это не то))
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
А ларчик просто открывался..
При выходе из последнего Control'а на Frame, возникает не событие Control_Exit, а событие Frame_exit. При этом, событие Control_Exit все-же возникает, но возникает при последующем получении фокуса любым Control'ом этого Frame.
Так что, использование Frame и события Exit даст только ООООЧЕНЬ большой геморрой, и ничего другого.
Либо используйте Frame, либо событие Exit.
Я, например, сему внял, и от подобных маневров отказался.
 
Artem1977,  Вы меня не поняли: ведь Вам при выходе из Frame нужно выполнить некие действия, которые Вы храните в событии Exit для конкретного TextBox. И пытаетесь обратиться именно к этому событию. А зачем? Вызывайте не событие, а внешнюю процедуру, которая сделает с последним активным TextBox всё нужное.
См. файл.
Страницы: 1
Наверх