Найти в Дзене
Alyona Verden. Поговорим...

"Игла - в яйце, яйцо - в ларце..." Пространства имён Visual Basic. NET

И небольшая программа (проект), даже, скорее, заготовка для будущих проектов.

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

Итак, смотрим на первую... нет, на вторую картинку. Первая - обложка . а вторая - это внешний вид окна проектирования среды Visual Studio (далее VS) сразу после создания нового проекта. В VS два основных окна - Form1.vb (Design) (это и есть окно проектирования, которое я дальше буду называть окном дизайна) и Form1.vb - окно кода. Переключаться между этими окнами можно в левом верхнем углу (третья картинка). Слева вы видите панель инструментов - обычно она скрыта, но стоит навести на неё указатель мыши - она тут же "выезжает". Также в окне дизайна отображается форма, а на ней - кнопка Button1, которую я как раз только что туда "перетащила" той же мышью. Остальные окна имеют вспомогательные функции, облегчая доступ к наиболее востребованным вещам. Если они не нужны - их можно закрыть.

"Рабочее пространство" VS
"Рабочее пространство" VS
-3

Так вот, того, что мы видим в окне дизайна, попросту нет. Это всего лишь визуальное отображение будущей программы. И после её запуска может выглядеть совсем не так. На самом деле существуют лишь строки программного кода, которые и создают эту видимость. Поэтому и Basic - Visual, и программирование на нём - визуальное. Однако, даже перейдя в окно кода, кода мы не увидим. Код, создающий форму, кнопку, прочие элементы управления скрыт от глаз программиста, он ему по большей части не нужен, и даже мешает, занимая место на экране. Кое-что можно включить, а кое-кто - нет.

Если говорить совсем просто, VB - это инструмент, который открывает коробку с кубиками, где кубики - это формы, кнопки и т.д., а коробка - платформа Framework.NET. Только кубики в ней не простые, даже не кубики, а скорее матрёшки. И все разномастные.

Коробка VB разделена всего на два отделения, два пространства имён - Microsoft и System. В свою очередь, в каждое из этих пространств имён входят другие пространства имён, помельче, и другие объекты. Чтобы было проще ориентироваться - каждому виду объектов соответствует своя пиктограмма. На рисунке ниже - пиктограммы и соответствующие им объекты.

Вот они, мои "кубики" и "матрёшки"
Вот они, мои "кубики" и "матрёшки"

Здесь нет только пространств имён, они обозначаются фигурными скобками {}.

Теперь, каким путём добраться до того, что нам нужно? А вот это и напоминает сюжет сказки - "пойди туда, не знаю куда, принеси то, не знаю что". И поиски смерти Кощеевой, "игла в яйце, яйцо в ларце, ларец в утке..." Нужно знать, где находится то, что тебя интересует, иначе можно очень долго блуждать по всем этим пространствам имён, классам, перечислениям и пр. И более того, в разных пространствах имён могут оказаться объекты с одинаковыми именами, но выполняющие абсолютно разные функции. Вот, наверное, почему справочная система MSDN занимает чуть ли не столько же места на жёстком диске, сколько и сама VS.😏

Зато при её помощи поиск нужных объектов существенно облегчается.

Поиск объектов через справку

На примере метода(функции) Beep - подачи звукового сигнала. Я знаю, что он находится в пространстве имён Microsoft, в котором есть ещё четыре пространства имён, из которых мне нужно Visual Basic. Ну а уже в нём, собственно, сам Beep. А если бы не знала - просто набрала бы Beep в окне кода, навела на него курсор и нажала F1. И получила бы полную справку о том, где он находится, и как его применять. Правда, на английском языке 😲.

Вызов справки VS
Вызов справки VS

Просто оглавление справки можно вызвать так же, нажав F1, или "Help" в главном меню VS.

Поиск объектов через Object Browser

В VS есть браузер объектов ("Object Browser") с помощью которого их можно не только искать, но и получить наглядное представление об их местонахождении. Окно браузера объектов включается тоже через главное меню в "View" (вид), как и прочие окна. Впрочем, пиктограммы многих дополнительных окон вынесены на панель быстрого доступа главного меню.

Браузер объектов
Браузер объектов

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

-7

Обращение к объектам

Конечным итогом поиска всегда является метод (функция), событие либо свойство, и именно с конца, можно сказать, следует начинать обращение к нему. Вот, например, Beep, полный путь вызова пишется так:

Microsoft. Visual Basic. Beep ()

Все "матрёшки" разделяются точками, пока мы не доберемся до "кубика". Однако во многих случаях VB позволяет не упоминать в записи большую часть "матрёшек", а в случае с Beep - вообще все, оставив только "кубик". Поэтому для подачи звукового сигнала достаточно просто написать Beep, а VB даже круглые скобки сам поставит. Если просто набрать Microsoft и поставить точку - откроется меню, в котором можно выбрать объект, нужный для продолжения записи, выделить его и нажать "Tab" - он вставится автоматически.

Точка после Visual Basic - появился целый список возможных вариантов
Точка после Visual Basic - появился целый список возможных вариантов

И, пожалуй, на этом стоит остановиться, и так объем получился изрядный. А я ещё даже не начала рассказывать о своём новом проекте😊.

Новый проект

Это "Ходячая кнопка". Ну, на самом деле это не кнопка (Button), а метка (Label), но "кнопка" звучит лучше.

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

А теперь о том, как это сделано.

Всю программу можно разделить на три блока.

  1. Объявление переменных. О самих переменных на канале будет отдельная статья, так что останавливаться на них я не буду. Мне понадобится 2 переменных для задания размера формы, 2 для задания размера метки, 1 для шага перемещения метки, все они целочисленного типа (integer). Можно было обойтись без переменных, но в этом случае для изменения, например, размера метки пришлось бы менять этот размер во всех строках программы, где он присутствует, а их достаточно много даже в моём проекте. Что уже говорить о серьёзных разработках. Поэтому привыкать к нормальному программированию лучше сразу.
  2. Следующий блок - свойства формы, её размер, размер метки, то есть присваивание переменным значений. Вот на свойствах остановлюсь подробнее. Во-первых, убираю с формы лишние элементы - кнопки минимизации и сворачивания в правом верхнем углу. Me.Minimize Box = False и Me.MaximizeBox = False. И ещё одна строка - Me.KeyPreview = False. Эта строка заставляет VB в первую очередь обрабатывать события нажатий на клавиши, связанные с формой. Иначе будут обрабатываться события, связанные с объектом, находящимся в фокусе, а когда на форме есть хотя бы один объект, в фокусе будет именно он. И напоследок - красим метку в красный цвет, чтобы её было хорошо видно - Player. BackColor = Color.Red. Метку я переименовала, заменив стандартное Label1 на Player, сделала я это в окне свойств, изменив свойство Name. На видео показано, как это сделать, а заодно и заголовок формы изменить с Form1 на "Ходячая кнопка Алёны"🤗. Все остальные строки - присвоение переменным их значений. Делается это в процедуре Private Sub Form1_Load, то есть во время загрузки формы.
  3. Обработка нажатий на клавиши. Здесь я буду работать с объектом е класса KeyEventArgs. Этот объект - конечная "матрёшка", а принадлежащие ему свойства и есть те "кубики", которые мне нужны.

Теперь о событиях. При нажатии почти любой клавиши происходит три события - KeyDown (клавиша нажата), KeyPress (введение символа) и KeyUp (клавиша отпущена). Причём, если удерживать клавишу нажатой, KeyDown и KeyPress происходят несколько раз в секунду, постоянно, пока клавиша удерживается. Событие KeyUp происходит один раз, после того как клавиша отпущена. Я буду использовать KeyDown, потому что нажимаемые мной клавиши никаких символов вводить не будут, и чтобы метка могла "бегать", многократно перемещаясь при удерживании нажатой клавиши. А откуда моя программа узнает, какая именно клавиша была нажата? Из свойства KeyCode вышеупомянутого объекта е.

Так, надо объяснить, где этот объект находится. Для обработки события KeyDown служит процедура Private Sub Form1_KeyDown - а далее, в скобках, помимо всего прочего, написано ByVal e as System.Windows.Forms.KeyEventArgs, то есть прописаны все "матрёшки", начиная с пространства имён System. Почему объект называется "е" а не "в" или "с"? А почему эмблема Apple - надкушенное яблоко? Вот по этой самой причине.

И вот теперь перехожу непосредственно к обработке нажатий на клавиши. Самая первая и самая длинная строка блока If - Else проверяет, точно ли была нажата клавиша со стрелкой (их кодировка Up, Down, Left и Right). If e.KeyCode = Right Or e.KeyCode = Left Or e.KeyCode = Down Or e.KeyCode = Up Then - эта строка проверяет сразу четыре условия, разделённые ключевым словом Or (или). Если хотя бы одно из них истинно, начинает выполняться следующий блок If, а если нет - управление переходит на строку после ключевого слова Else, где прописан Exit Sub - "щадящий" режим завершения процедуры, который срабатывает, если нажать не ту клавишу.

Ну а за перемещение метки в ту или другую сторону отвечают четыре блока If - Else, в каждом из которых проверяется корректность её положения на форме - то есть, не вышла ли она за её пределы. Вот в этом пункте я изрядно накосячила, и с размерами формы тоже не угадала - теперь-то всё работает, но не совсем так, как я хотела. Заданный мной размер оказался маловат, и вместо поля 20×20 получилось 19×18. Только о том, какие проблемы у меня возникли, и как я их решила - расскажу в следующей записи. А на сегодня у меня всё, и я с вами прощаюсь. До встречи!

Bye-bye.