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 именами так, как ты думаешь, и никаких полных имён не существует в принципе.
То, что ты думаешь, что всё крутится вокруг
имён объектов и склеивании имён в полные длинные имена для возможности обращения к объектам видно отсюда:
И то, что у тебя аргумент называется 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 часов после того, как написал тот пост.