Передать в модуль управление контролами из формы

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

Передать в модуль управление контролами из формы

Сообщение konst » 20.03.2015 (Пт) 20:46

Для разрешения ввода в textBox только числовых значений, при вводе в textBox, вызываю процедуру Chk_Num, находящуюся в модуле. В Chk_Num передаю код KeyAscii нажатой клавиши, данные о форме (не знаю, как это называется) и текст из textBox-а.

Код: Выделить всё
Private Sub txtR_KeyPress(KeyAscii As Integer)
    Call Chk_Num(KeyAscii, Me, txtR.Text)
End Sub

В модуле, после некоторых действий, вызываю форму. И в текущий textBox, благо, что он является активным, заношу все, что мне нужно. Это работает:

Код: Выделить всё
Public Sub Chk_Num(KeyAscii As Integer, F_Name As Form, Txt_text As String)
    With F_Name
                .ActiveControl.Text = "0,"
                .ActiveControl.SelStart = 2  'перемещение курсора в конец текста
    End With
End Sub


Но не могу передать в процедуру данные о другом textBox-е, и внести потом что-то в него. Пробовал так (процедура другая, но смысл тот же, txtR1 и txtR2 - имена текстбоксов):
Код: Выделить всё
    Dim ctl1 As Control
    Dim ctl2 As Control
     
Private Sub btnCalc_Click()
    Set ctl1 = Me.txtR1
    Set ctl2 = Me.txtR2
    Call Mod_Txt(Me, ctl2, ctl2)
End Sub

Это не работает (процедура в модуле):
Код: Выделить всё
Public Sub Mod_Txt(F_Name As Form, Txt_1 As Control, Txt_2 As Control)
    With F_Name
         .Txt_1.Text = "5555555"
         .Txt_2.Text = "6666666"

    End With
End Sub

Подскажите, пожалуйста, как сделать правильно.

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

Re: Передать в модуль управление контролами из формы

Сообщение Хакер » 20.03.2015 (Пт) 21:10

Тут всё неправильно. Сейчас объясню.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Jack Ferre
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 17.02.2014 (Пн) 14:31
Откуда: Казахстан, Костанай

Re: Передать в модуль управление контролами из формы

Сообщение Jack Ferre » 21.03.2015 (Сб) 10:45

[offtopic]
Хакер писал(а): 0:10
Тут всё неправильно. Сейчас объясню.

Сон одолел?[/offtopic]


Код: Выделить всё
Public Sub Mod_Txt(F_Name As Form, Txt_1 As Control, Txt_2 As Control)
    With F_Name
         .Txt_1.Text = "5555555"
         .Txt_2.Text = "6666666"
    End With
End Sub

1) Не стоит передавать ссылки на текстбоксы вместе со ссылкой на форму. Контролы на форме имеют публичные ссылки. Можно обращаться как (в вашем случае) F_Name.txtR1.
2) Переменные Txt_1 и Txt_2 не используются в вашей функции. Посмотрите внимательно. Вот тут .Txt_1.Text = "5555555" переменная Txt_1 не используется, а у формы параметра Txt_1 нет.

Код: Выделить всё
.ActiveControl.Text = "0,"
.ActiveControl.SelStart = 2  'перемещение курсора в конец текста

благо, что он является активным

Опять же - используйте нормальное обращение - F_Name.txtR.Text. (То, что после точки после F_Name нет параметра txtR совершенно правильно, т.к. у класса Form его нет, зато он есть у класса Form1 (или как там ваша форма называется)).

[offtopic]2 All
Класс Control - просто алиас ВБКонтролЭкстендера? Чет я его не замечал :? [/offtopic]

konst
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 10.10.2007 (Ср) 12:23

Re: Передать в модуль управление контролами из формы

Сообщение konst » 21.03.2015 (Сб) 11:43

Спасибо. вечером проверю.

konst
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 10.10.2007 (Ср) 12:23

Re: Передать в модуль управление контролами из формы

Сообщение konst » 21.03.2015 (Сб) 13:01

Проверил сейчас. Работает. Спасибо большое!
Контролы на форме имеют публичные ссылки. Можно обращаться
Сразу так и предположил, но что-то не получилось
переменная Txt_1 не используется
и
после точки после F_Name нет параметра txtR
- это я сразу увидел. Потому и обратился на форум, что не знал как сделать. Вот только я свой вопрос таки не сформулировал правильно. Мне обязательно нужно передавать в процедуру модуля ссылки на textBox-ы и кнопки. Смысл в том, чтобы при нажатии на разные кнопки, в разные textBox-ы вносились данные, что-то активировалось, что-то деактивировалось. Так вот, процедуре я могу передать txtR1.Name например. А как в процедуре его применить, чтобы в F_Name.txtR1.Text внести изменения.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Передать в модуль управление контролами из формы

Сообщение Vi » 23.03.2015 (Пн) 11:31

У формы есть свойство Controls, которое даёт коллекцию всех контролов на форме. Выбор из коллекции осуществляется либо по номеру, либо по имени.

Код: Выделить всё
    With Me
         .Controls("txtR1").Text = "5555555"
         .Controls("txtR2").Text = "6666666"
    End With

Или же напрямую, без использования Me

Код: Выделить всё
         Txt_1.Text = "5555555"
         Txt_2.Text = "6666666"

Всё это справедливо и при вызове функции.

Код: Выделить всё
Public Sub Mod_Txt(ByVal Txt_1 As Control, ByVal Txt_2 As Control)    ' вызов Call Mod_Txt(Me.Txt_1, Me.Txt_2) или просто Call Mod_Txt(Txt_1, Txt_2)
    Txt_1.Text = "5555555"
    Txt_2.Text = "6666666"
End Sub
Public Sub Mod_Txt(ByVal F_Name As Form, ByVal Txt_1 As String, ByVal Txt_2 As String) ' вызов Call Mod_Txt(Me, "Txt_1", "Txt_2")
    With F_Name
         .Controls(Txt_1).Text = "5555555"
         .Controls(Txt_2).Text = "6666666"
    End With
End Sub
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

konst
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 10.10.2007 (Ср) 12:23

Re: Передать в модуль управление контролами из формы

Сообщение konst » 23.03.2015 (Пн) 12:36

Спасибо, Vi! Это именно то, что мне было нужно. Вопрос исчерпан.

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

Re: Передать в модуль управление контролами из формы

Сообщение Хакер » 23.03.2015 (Пн) 13:16

konst писал(а):Для разрешения ввода в textBox только числовых значений, при вводе в textBox, вызываю

Если нужно разрешить ввод только целочисленных значений, то вообще не нужно делать подобные вещи вручную. Нужно контролу включить стиль ES_NUMBER.

konst писал(а):данные о форме (не знаю, как это называется) и текст из textBox-а.

Ты передаёшь не данные о форме.
Ты передаёшь ссылку на ссылку на объект, олицетворяющий экземпляр формы.

Именно так, и никак иначе не может называться то, что ты делаешь.

У тебя каша в голове, и это видно.

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

Что такое объект, что такое класс, а что такое экземпляр класса? Класс и экземпляр класса — это одна и то же? А объект — это всегда экземпляр класса или не всегда? Что такое ссылка на объект? Бывают ли ссылки на класс? Как работает подсчёт ссылок?

Пока не сможешь чётко отвечать на эти вопросы — нет смысла идти дальше и писать какой-то код, который «передаёт данные о форме»...

konst писал(а):модуле, после некоторых действий, вызываю форму.

Фраза «вызываю форму» вообще бессмысленная.
Вызывать можно духов, дождь, милицию, лифт.
Вызывать в программировании можно функции, процедуры и методы объектов.

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

С экземпляром формы — можно. Но по прежнему «вызвать экземпляр формы» остаётся бессмысленной фразой.

Экземпляр формы можно создать. Можно показать, скрыть, подвинуть на экране. У экземпляра формы можно вызвать какой-либо из его методов или обратиться к какому-либо его свойств.

konst писал(а):И в текущий textBox, благо, что он является активным, заношу все, что мне нужно. Это работает:
Public Sub Chk_Num(KeyAscii As Integer, F_Name As Form, Txt_text As String)


Ох-ох-ох. Лучше б это не работало.

Во-первых, судя по твоему коду ты вообще понятия не имеешь о ByVal- и ByRef-передаче аргументов, потому как у тебя везде неявный ByRef, хотя причин делать так в твоём случае — нет. Поэтому пойди и изучи, что такое ByVal и ByRef, какая между ними разница, что и в каком случае нужно применять, и только потом продолжай писать то, что пишешь.

Во-вторых, идея передавать двумя отдельными аргументами отдельно ссылку на экземпляр формы и отдельно текст из TextBox-а — совершенно неразумная и ничем не обоснованная. Достаточно было бы передавать одним аргументом ссылку на TextBox, из которой можно получить и ссылку на родительский экземпляр формы и значение текста в этом TextBox-е.

Код: Выделить всё
Public Sub Chk_Num(KeyAscii As Integer, ByVal tb as TextBox)
    tb.Text = "0,"
    tb.SelStart = 2  'перемещение курсора в конец текста
End Sub


Или, если всё-таки хочется делать (по-моему абсолютно бессмысленный) трюк со свойством ActiveControl:
Код: Выделить всё
Public Sub Chk_Num(KeyAscii As Integer, ByVal tb as TextBox)
    With tb.Parent.ActiveControl
        .Text = "0,"
        .SelStart = 2  'перемещение курсора в конец текста
    End With
End Sub


В-третьих, я вижу тут свидетельство, опять таки, большого непонимания.
Что такое F_Name As Form? Что здесь обозначает F_Name? Как расшифровывается? Я подозреваю, что Form Name, и если так (а скорее всего именно так), то это ужасно.

Потому что ты вообще не понимаешь, что происходит.

Ты передаёшь не имя. Ты передашь ссылку на объект, олицетворяющий окно. Есть окно, а есть объект, олицетворяющий это окно. Ты передаёшь ссылку на этот объект.

Вообще-то, поскольку ты забыл про ByVal, про который ты видимо и не знаешь, ты передаёшь не просто ссылку на объект, а ссылку на ссылку на объект.

Но в любом случае речь идёт о ссылке на экземпляр формы.
Ты передаёшь не форму.
Ты передаёшь не экземпляр формы.
Ты передаёшь не объект.
Ты передаёшь не имя формы.
Ты передаёшь не имя экземпляра формы.
Ты передаёшь не имя объекта.
Ты передаёшь ссылку на экземпляр формы.

Вообще, там не никаким именем не пахнет даже!

Я примерно понимаю, что происходит. От чтения дурацких статеек, самоучителей и прочей дряни сформировалось понимание, что VB оперирует именами.

Такие дебильные текстики пишут что-то вроде:
У вас есть форма с именем Form1, а на ней лежит контрол с именем Text1. Если вы хотите сделать его невидимым, напишите Form1.Text1.Visible = False.


У человека возникает представление, что есть некая иерархия объектов, у каждого из которых есть имя, и чтобы добраться до нужного объекта надо написать его «полный путь» (как в файловой системе), разделяя текстовые имена точкой.

Мол, есть нечто с именем Form1, внутри которого есть нечто с именем Text1, значит полное имя получим склеиванием имён через точку: Form1.Text1.

Так вот, это абсолютная чушь. Вообще всё устроено и работает совершенно иначе, диаметрально противоположенным образом. Не оперирует VB именами так, как ты думаешь, и никаких полных имён не существует в принципе.

То, что ты думаешь, что всё крутится вокруг имён объектов и склеивании имён в полные длинные имена для возможности обращения к объектам видно отсюда:
Код: Выделить всё
With F_Name
         .Txt_1.Text = "5555555"

И то, что у тебя аргумент называется F_Name, и то, что справа от F_Name ты пытаешься приписать какое-то Txt_1 — говорит о том, что в голове поселилась эта дурацкая ложная идея.

Но это именно дурацкая ложная идея, и ничего больше. Всё работает совершенно не так, а то, что ты написал — лишено смысла.

Начиная с того, что нет там никакого имени формы (а есть ссылка на экземпляр формы), заканчивая тем, что раз есть ссылка на контрол (а в контексте той процедуры Txt_1 — это именно ссылка на контро), то чтобы к нему обратиться с использованием этой ссылки ВООБЩЕ больше ничего не нужно. Не нужно знать не имя формы, ни ссылки на экземпляр формы не нужно, не нужно ничего приписывать слева от Txt_1. Вообще ничего из этого не нужно. Есть Txt_1 — значения этой переменной (которое является вовсе не такстом) абсолютно достаточно для обращения к свойствам. И ссылку на экземпляр формы можно успешно получить из этой ссылки на контрол.

_____________

konst писал(а): Call Mod_Txt(Me, ctl2, ctl2)

К сведению: не нужно писать Call перед вызовом Sub-а. Call необходим только для устранения неоднозначностей.
Ну или эстеты могут использовать его, если им хочется обязательно аргументы заключать в скобочки. Но о каком эстетизме тут вести речь, если в остальном код ужасен?

konst писал(а):Но не могу передать в процедуру данные о другом textBox-е, и внести потом что-то в него. Пробовал так (процедура другая, но смысл тот же, txtR1 и txtR2 - имена текстбоксов):

Код: Выделить всё
        Dim ctl1 As Control
        Dim ctl2 As Control
         
    Private Sub btnCalc_Click()
        Set ctl1 = Me.txtR1
        Set ctl2 = Me.txtR2
        Call Mod_Txt(Me, ctl2, ctl2)
    End Sub


Ну опять же, просвечивает вредная ложная идея, что ты передаёшь имена, а вызываемая процедура их склеит через точку и обратиться к нужным контролам. Это бредятина и совершенно не то, как всё устроено на самом деле.

Не имена ты передаёшь, а ссылки на контролы. Ссылки на контрол достаточно, чтобы сделать с ним всё, что можно.
Не нужно передавать в Mod_Txt ссылку Me.

И абсолютно, совешенно не нужны переменные ctl1 и ctl2.
И у тебя там опечатка, потому что в вызове стоит дважды ctl2.

Выше, прочем, в чужих постах, сказано, что можно передавать и имена контролов, а вызываемой процедуре искать нужные контролы по именам используя коллекцию Controls. Тогда да, понадобится передавать ссылку на экземпляр формы и имя контрола в виде строчки. Но это в данной ситуации абсолютно ненужный вредный неэффективный способ решения.

Можно передавать только ссылку на экземпляр формы, из которого можно будет извлечь ссылки а соответствующие контролы. Но это оправдано только тогда, когда наличие у формы определённой пары контролов является хорошо-документированной особенностью внешнего программного интерфейса этой формы (этого класса).

_______

Кроме того, даже если ты исправишь эти косячки, остаётся много «неправильностей», в том, как код написан и как вообще всё спроектирвоано.

Начиная с того, что скорее всего, в твоём случае нужно использовать более конкретные типы для переменных и аргументов (вместо типа Control использовать тип TextBox, вместо типа Form использовать тип, имя которого соответствует имени формы), и заканчивая тем, что для реализации ввода только чисел никоим образом в обработчике события KeyPress не надо трогать свойство Text у контрола TextBox.

_________

Jack Ferre писал(а):Сон одолел?

Работа ододела. Я ту ночь спать лёг только через 7 часов после того, как написал тот пост.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Передать в модуль управление контролами из формы

Сообщение alibek » 23.03.2015 (Пн) 15:20

Я так понял, что автору нужно что-то подобное.
Lasciate ogni speranza, voi ch'entrate.

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

Re: Передать в модуль управление контролами из формы

Сообщение Хакер » 23.03.2015 (Пн) 15:32

alibek писал(а):Я так понял, что автору нужно что-то подобное.

Да он просто учится пока. Тем более в твоей ссылке дотнет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 23.03.2015 (Пн) 15:54

Хакер писал(а):Тем более в твоей ссылке дотнет.

Уверен? Что-то не похоже, по-моему...

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

Re: Передать в модуль управление контролами из формы

Сообщение Хакер » 23.03.2015 (Пн) 15:56

Qwertiy писал(а):Уверен? Что-то не похоже, по-моему...

Ошибся.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

konst
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 10.10.2007 (Ср) 12:23

Re: Передать в модуль управление контролами из формы

Сообщение konst » 23.03.2015 (Пн) 16:00

Хакер, спасибо за развернутый и доброжелательный ответ.
Off-topic:
Несколько лет назад, я написал на VB около десятка маленьких программок, в помощь себе и коллегам-конструкторам. Потом отошел от темы. Сейчас с удивлением обнаружил, что почти все они работают на 64-х битной 8-ке. Мало того, есть еще живые форумы, вроде вашего, где можно проконсультироваться. Захотел сделать еще пару полезных утилит, да и старая одна нуждается в доработке.

Я и тогда, будучи погружен в тему, насколько это возможно для непрофессионала, далеко не все понимал. А уж сейчас-то и того не помню. Посмотрел ответы - что-то вспомнилось, чего-то и не знал. Из того, о чем ты написал, я со многим знаком. Но эти знания отрывочны. Нет общей картины, и, поэтому, нет понимания как это применять. А незнание терминологии мешает правильно задавать вопросы.

konst
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 22
Зарегистрирован: 10.10.2007 (Ср) 12:23

Re: Передать в модуль управление контролами из формы

Сообщение konst » 23.03.2015 (Пн) 16:05

2 alibek : таки да, это не совсем то, о чем я спрашивал. Но, кажется я понял, о чем там, и это тоже интересно.


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

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

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 19

    TopList