Первое знакомство с управляющими элементами
Управляющие элементы (или просто элементы) — «кирпичи», из которых строятся приложения в Visual Basic. Благодаря элементам ваши формы могут делать нечто большее, чем просто занимать место на экране. Некоторые элементы, например кнопки и текстовые поля, предназначены для взаимодействия с пользователем. Другие остаются невидимыми для пользователя и выполняют вспомогательные задачи. Примером невидимого элемента служит таймер. С помощью элементов вы без особого труда наделите свои программы различными возможностями. Чтобы разместить элемент на форме, можно дважды щелкнуть на нужном значке в панели элементов или же «нарисовать» элемент на форме — для этого следует щелкнуть на нем мышью и растянуть контур на форме (в этом случае перетаскивание указателя мыши определяет размеры элемента).
После размещения элементов можно задать их свойства. Щелкните на элементе, чтобы сделать его активным, и измените нужные значения в окне свойств. Панель элементов представляет собой окно, внутри которого находятся значки различных элементов, используемых в приложениях (рис. 3.1). В этом уроке мы рассмотрим некоторые элементы, которыми вы сможете пользоваться в своих приложениях.
В комплект Visual Basic 6 входит ряд дополнительных элементов, многие из которых были усовершенствованы по сравнению с предыдущими версиями. Некоторые из них предназначены для работы с мультимедиа, другие (например, элементы Winsock и Internet Control) ориентированы на работу в Internet. Существует также несколько дополнительных элементов для работы с базами данных. Более того, теперь вы можете создавать собственные элементы ActiveX и включать их в панель элементов. Нестандартные элементы также можно распространять среди других разработчиков. Более подробная информация о создании и распространении таких элементов приведена в уроке 17, «Использование ActiveX».
Рис. 3.1. Панель элементов Visual Basic
Кнопки
Наверное, самым распространенным управляющим элементом в приложениях для Windows являются кнопки (см. рисунок). Это в полной мере относится и к Visual Basic. Кнопки используются для решения самых разных задач — от простейшего ввода информации до вызова специальных функций, связанных с формами. Конечно, вам уже приходилось встречаться с кнопками хотя бы на примере ОК и Cancel в диалоговых окнах.
В ближайших разделах мы рассмотрим важнейшие свойства, методы и события этого простого, но очень полезного элемента. Общий принцип работы кнопок описан в разделе «Методы кнопок», а приведенный в нем пример поможет перейти от теории к практике.
ПРИМЕЧАНИЕНапоминаю: свойства описывают атрибуты объекта. Методами называются действия, которые объект может выполнять по вашему приказу, а при помощи событий элемент сообщает о том, что с ним происходит.
Свойства кнопок
Далее перечислены все свойства кнопок. Свойства, используемые чаще других, выделены жирным шрифтом. Если вас заинтересует свойство, не описанное далее, выберите его в окне свойств и вызовите справку клавишей F1.
Appearance | Enabled | hWnd | Style |
BackColor | Font | Index | Tablndex |
Cancel | FontBold | Left | TabStop |
Caption | FontItalic | MaskColor | Tag |
CausesValidation | FontName | MouseIcon | ToolTipText |
Container | FontSize | MousePointer | Top |
Default | FontStrikethru | Name | UseMaskColor |
DisabledPicture | FontUnderline | OLEDropMode | Value |
DownPicture | ForeColor | Parent | Visible |
DragIcon | Height | Picture | WhatsThisHelpID |
DragMode | HelpContextID | RightToLeft | Width |
Два самых важных свойства любой кнопки — Name и Caption. По значению первого Visual Basic отличает одну кнопку от других. Нам придется довольно часто встречаться со свойством Name на страницах этой книги. Свойство Caption определяет текст, который должен находиться на кнопке. Символ «амперсенд» (&) позволяет работать с кнопкой при помощи клавиш вместо щелчков мышью. Для этого следует нажать клавишу Alt вместе с подчеркнутой буквой в надписи того элемента, к которому вы желаете обратиться. Кроме того, пользователь может перейти к кнопке клавишей Tab и затем имитировать щелчок мыши клавишей Пробел.
ПОДСКАЗКАВы должны хорошо разбираться в том, как работают клавиши ускоренного доступа, потому что не все пользователи предпочитают работать с мышью. Например, те, кому приходится набирать большие объемы текста, не любят снимать пальцы с клавиатуры, чтобы сменить шрифт и затем продолжить ввод. Старайтесь при любой возможности создавать клавиши ускоренного доступа, и пользователям будет удобнее работать с вашей программой.
У кнопок имеется еще два полезных свойства — Cancel и Default. Если задать свойству Default значение True, пользователь сможет имитировать нажатие кнопки при помощи клавиши Enter. Если свойство Cancel имеет значение True, нажатие клавиши Esc приводит к закрытию формы.
ПРИМЕЧАНИЕЕсли на форме находится несколько кнопок, лишь у одной из них свойство Default может иметь значение True; эта кнопка используется по умолчанию на данной форме. Аналогично, лишь у одной кнопки свойство Cancel может быть равно True.
Выбирая значение свойства Style, вы можете оставить кнопку чисто текстовой или поместить на нее рисунок. Если вы хотите, чтобы в нормальном, ненажатом состоянии на кнопке присутствовал рисунок, задайте имя графического файла в свойстве Picture. Рисунки для других состояний кнопки (заблокированного и нажатого) задаются в свойствах DisabledPicture и DownPicture. Еще два свойства, Enabled и Visible, позволяют ограничить доступ к кнопке. Если какое-либо из них равно False, кнопка становится недоступной. Блокировка кнопок может пригодиться в тех случаях, когда пользователь должен выполнить определенные действия (скажем, заполнить текстовые поля) и лишь затем нажать кнопку для перехода к следующей стадии процесса.
ПОДСКАЗКАЕсли вы хотите заблокировать кнопку, значение False следует задать для свойства Enabled, а не для Visible. В первом случае заблокированная кнопка остается на экране, и пользователь понимает, что при определенных обстоятельствах она станет доступной; во втором случае кнопка просто исчезает.
Свойство Tablndex определяет порядок перебора элементов клавишей Tab. Элемент, у которого свойство Tablndex равно 0, получает фокус первым (при условии, что он не был заблокирован или сделан невидимым). При изменении свойства Tablndex одного элемента изменяется порядок перебора и у других элементов. Если вы не хотите, чтобы пользователь мог перейти к элементу клавишей Tab, задайте свойству TabStop значение False; впрочем, это не помешает пользователю перейти к элементу, щелкнув на нем мышью. Чтобы исключить и такую возможность, воспользуйтесь описанными ранее свойствами Enabled и Visible.
События кнопок
Несомненно, из всех событий, связанных с кнопками, чаще всего используется Click. Ниже перечислены все события кнопок.
MouseUp | OLECompleteDrag | OLEDragDrop | OLEDragOver |
OLEGiveFeedback | OLESetData | OLEStartDrag | Click |
KeyPress | DragDrop | KeyUp | DragOver |
LostFocus | GotFocus | MouseDown | KeyDown |
MouseMove |
Вероятно, на первых порах вас будет в основном интересовать событие Click. Именно оно чаще всего используется для кнопок, а остальные события понадобятся лишь после того, как вы освоите программирование на Visual Basic. С другой стороны, вместо события Click можно воспользоваться событием MouseUp. Во многих приложениях для Windows 95 используется именно это событие, поскольку после нажатия кнопки мыши пользователь может передумать и отказаться от возбуждения события Click.
Методы кнопок
Далее перечислены различные методы кнопок, самым распространенным из которых является SetFocus.
Drag | Move | OLEDrag | Refresh |
SetFocus | ShowWhatsThis | ZOrder |
Метод SetFocus используется для передачи фокуса конкретной кнопке. Например, с его помощью можно вернуться к кнопке по умолчанию после того, как будет закончено редактирование текстового поля на форме. В этом случае код будет выглядеть так:
cmdMyButton.SetFocus
А располагается он обычно в процедуре события Change текстового поля.
Работа с кнопками
Работу с кнопками лучше всего рассматривать на практическом примере:
1. Если вы установили примеры приложений с компакт-диска Visual Basic, откройте проект \MSDN98\98vs\1033\Samples\VB98\Controls\Controls.vbp[3].
ПРИМЕЧАНИЕЕсли вы еще не установили примеры с компакт-диска, обратитесь к разделу «Работа с несколькими проектами» из урока 1 — в нем рассказано, как это сделать. Эти примеры понадобятся вам во многих упражнениях этого урока.
2. Запустите приложение командой Run > Start. В диалоговом окне Control Examples нажмите кнопку Test Buttons — на экране появится форма, изображенная на рис. 3.2.
Рис. 3.2. Работа с кнопками
3. Нажмите кнопку Сменить сигнал и проследите, как изменяется сигнал светофора. Когда тестирование будет завершено, нажмите кнопку Закрыть.
Мы усовершенствуем это приложение и поместим изображение светофора прямо на кнопку Сменить сигнал.
4. Завершите работу приложения командой Run > End.
5. Активизируйте форму Test Buttons, дважды щелкнув на строке frmButton в окне проекта.
6 Растяните кнопку Сменить сигнал до таких размеров, чтобы в ней могло поместиться изображение светофора. В окне свойств установите значение свойства Style кнопки в 1 - Graphical.
7. Задайте свойствам Visible элементов imgGreen, imgYellow и imgRed значение False.
8 Включите в процедуру события Load формы следующий фрагмент:
Private Sub Form_Load()
cmdChange.Picture = imgGreen.Picture
End Sub
9. Измените код процедуры ChangeSignal:
Private Sub ChangeSignal()
Static signal As Integer
signal = signal + 1
If signal > 3 Then signal = 1
Select Case signal
Case Is = 1
Case Is = 1
cmdChange.Picture = imgYellow.Picture
Case Is = 2
cmdChange.Picture = imgRed.Picture
Case Is = 3
cmdChange.Picture = imgGreen.Picture
End Select
End Sub
10. Еще раз запустите программу (Run > Start). Снова нажмите кнопку Test Buttons, чтобы вызвать одноименное диалоговое окно. Теперь при нажатии кнопки Сменить сигнал изображение светофора на кнопке изменяется точно так же, как раньше изменялся рисунок над кнопкой.
Невзирая на простоту, этот пример наглядно демонстрирует основные принципы работы с кнопками. Вы можете включить в процедуру события Click другие команды, чтобы кнопка выполняла дополнительные задачи. Например, если кнопка должна закрывать приложение, процедура Click будет выглядеть так:
Private Sub cmdChangeSignal_Click()
End
End Sub
ПОДСКАЗКАЧтобы поместить графическое изображение на кнопку, необходи-мо сначала установить значение свойства Style в 1 - Graphical. Затем в свойстве Picture указывается имя графического файла с нужным рисунком.
Текстовые поля
Практически в любом проекте Visual Basic присутствует хотя бы одно текстовое поле (см. рисунок). Обычно эти элементы применяются для ввода данных или получения информации от пользователя. Разумеется, свойства текстовых полей были отобраны специально для этих целей. Если вы ограничиваетесь простейшим вводом информации, попробуйте воспользоваться функцией InputBox — она отображает диалоговое окно, в котором пользователю предлагается ввести нужные данные, а затем возвращает их приложению. Функция Visual Basic InputBox и родственная ей функция MsgBox (для окон сообщений) рассмотрены в уроке 10, «Использование диалоговых окон». Функция MsgBox служит для вывода простейших текстовых сообщений.
Свойства текстовых полей
Ниже перечислены все свойства текстовых полей. Наиболее важные, как и ранее, выделены жирным шрифтом.
Alignment | Font | Linkltem | RightToLeft |
Appearance | FontBold | LinkMode | ScrollBars |
BackColor | FontItalic | LinkTimeout | SelLength |
BorderStyle | FontName | LinkTopic | SelStart |
CausesValidation | FontSize | Locked | SelText |
Container | FontStrikethru | MaxLength | Tablndex |
DataChanged | FontUnderline | MouseIcon | TabStop |
DataField | ForeColor | MousePointer | Tag |
DataFormat | Height | MultiLine | Text |
DataMember | HelpContextID | Name | ToolTipText |
DataSource | HideSelection | OLEDragMode | Top |
DragIcon | hWnd | OLEDropMode | Visible |
DragMode | Index | Parent | WhatsTnisHelpID |
Enabled | Left | PasswordChar | Width |
Как всегда, все начинается с задания свойства Name. По умолчанию для текстовых полей это свойство начинается с префикса txt. Обратите внимание — у текстовых полей нет свойства Caption, а содержимое поля определяется свойством Text. Задавая значение свойства Text, можно определить содержимое поля по умолчанию. Иногда требуется, чтобы текстовое поле изначально было пустым. В этом случае достаточно удалить содержимое поля Text. Свойство MaxLength ограничивает длину вводимого текста заданным количеством символов и часто используется в сочетании со свойством PasswordChac, задающим символ, который отображается на экране при вводе пароля (обычно для этой цели используется символ «звездочка», *). Свойства MaxLength и PasswordChar часто используются для текстовых полей на формах, предназначенных для регистрации пользователя. Свойство Multiline позволяет ввести текст, состоящий из нескольких строк. Если оно применяется в сочетании со свойством ScrollBars, то поле практически без всякого кодирования превращается в простейший текстовый редактор (впрочем, вам все же придется написать пару строк программы для сохранения введенной информации).
Свойства SelLength, SelStart и SelText предназначены для работы с выделенным текстом. Например, свойство SelText возвращает содержимое выделенного фрагмента текста. Полученную строку можно легко скопировать или вырезать в буфер обмена.
Обратите внимание — свойство Readonly из предыдущих версий Visual Basic заменилось свойством Locked. Если установить его значение в True, текстовое поле будет служить только для вывода информации, а редактирование текста в нем запрещается. Возможно, вы обращали внимание на текстовые поля с лицензионным соглашением, которые отображаются при установке программ, — они относятся именно к этой категории. Содержимое заблокированного поля можно выделять и копировать, но нельзя удалить или ввести новый текст. Чтобы изменить порядок перебора текстовых полей (или любых других элементов на форме), измените значение свойства Tablndex. Если вы не хотите, чтобы пользователь мог перейти к текстовому полю во время перебора элементов, задайте свойству TabStop значение False. Чтобы пользователь не мог перейти к полю, щелкая на нем мышью, следует задать значение False свойству Enabled. В некоторых ситуациях требуется запретить пользователю любой доступ к содержимому поля. Скажем, в программе для работы с электронной почтой пользователю можно запретить ввод текста сообщения до тех пор, пока он не введет адрес. По мере освоения Visual Basic вы увидите другие примеры использования этой возможности.
События текстовых полей
Текстовые поля поддерживают несколько событий, перечисленных далее.
Change | KeyDown | LinkOpen | OLEDragQiter |
Click | Keypress | LostFocus | OLEGiveFeedback |
DblClick | KeyUp | MouseDown | OLESetData |
DragDrop | LinkClose | MouseMove | OLEStartDrag |
DragOver | LinkError | OLECompleteDrag | Validate |
GotFocus | LinkNotify | OLEDragDrop |
Событие Change происходит каждый раз, когда пользователь вставляет, заменяет или удаляет символы текстового поля. С событием Change можно связать простейшую проверку введенного текста и даже ограничить ввод определенными символами. Впрочем, эту задачу удобнее решать при помощи другого управляющего элемента — текстового поля с маской или одного из событий Key... Текстовое поле с маской позволяет задать шаблон, или маску ввода. Этот элемент относится к числу нестандартных, и чтобы пользоваться им, необходимо включить его в панель элементов. В электронной документации Microsoft Developer Network, которая поставляется на компакт-диске Visual Basic, имеются полные описания всех нестандартных элементов.
Методы текстовых полей
Ниже перечислены методы текстовых полей.
Drag | LinkRequest | OLEDrag | ShowWhatsThis |
LinkExecute | LinkSend | Refresh | ZOrder |
LinkPoke | Move | SetFocus |
Большинство методов используется довольно редко, однако методы Link... пригодятся, если ваше текстовое поле участвует в динамическом обмене данными через протокол DDE (Dynamic Data Exchange). DDE позволяет установить связь между приложениями и по мере того, как пользователь работает с одним приложением, посылать информацию другому приложению. К сожалению, детальное рассмотрение DDE выходит за рамки книги. Если эта тема заинтересует вас, обращайтесь к электронной документации.
Напротив, метод SetFocus очень часто используется в приложениях. Когда пользователь нажимает кнопку (скажем, Обновить данные), фокус остается у кнопки. Если процедура события Click кнопки завершается методом SetFocus, то фокус можно передать текстовому полю для ввода данных, благодаря чему пользователь избавляется от необходимости лишний раз щелкать мышью или нажимать клавишу Tab. Оператор выглядит так:
txtMyTextBox.SetFocus
Работа с текстовыми полями
Следующий пример показывает, как используется на практике метод SetFocus:
1. Откройте проект \MSDN98\98vs\1033\Samples\VB98\Controls\Controls.vbp, если он не был открыт ранее.
2. Запустите приложение командой Run > Start. В диалоговом окне Control Examples нажмите кнопку Text Box. На экране появляется форма, похожая на рис. 3.3.
Устанавливая различные переключатели в рамке, можно выполнять некоторые операции с левым текстовым полем. Свойство Multiline правого поля установлено в True, в этом нетрудно убедиться по внешнему виду текста. В приложениях, работающих с текстами, нередко используются текстовые поля с активизированными свойствами Multiline и ScrollBars. В таких случаях текстовое поле растягивается
Рис. 3.3. Работа с текстовыми полями
на всю форму, а ее размер фиксируется (свойством BorderStyle). Если форма должна иметь переменные размеры или является дочерней формой интерфейса MDI, вам придется динамически изменять размеры текстового поля при изменении размеров формы. Например, можно включить следующий фрагмент в процедуру события Resize формы:
txtText1.Top = frmForm1.ScaleTop
txtText1.Left = frmForm1.Scaleleft
txtText1.Width = frmForm1.Width
txtText1.Height = frmForm1.ScaleHeight
Свойства Scale... относятся к внутренним размерам формы. Следовательно, свойства Height и ScaleHeight формы имеют различные значения. В значении ScaleHeignt не учитывается пространство, занимаемое заголовком и границами формы.
3. Завершите работу приложения и активизируйте форму frmText в окне дизайнера.
4. Дважды щелкните на переключателе Установить курсор после 5 символа, чтобы вызвать окно программы с кодом процедуры:
Private Sub optInsert_Click()
‘установить курсор после 5 символа
txtDisplay.SelStart = 5
‘ передать фокус текстовому полю,
‘чтобы изменения были наглядно видны
txtDisplay.SetFocus
End Sub
Свойство SelStart определяет начальную позицию (в символах) выделенного фрагмента текстового поля. В данном случае выделение должно начинаться с 5-го символа. Метод SetFocus возвращает фокус ввода текстовому полю txtDisplay.
5. Откройте процедуру события Click переключателя optSelect:
Private Sub optSelect_Click()
‘установить курсор в начало
txtDisplay.SelStart = 0
‘ определить длину строки и выделить
‘соответствующее количество символов
txtDisplay.SelLength = Len(txtDisplay.Text)
‘передать фокус текстовому полю,-
‘чтобы изменения были наглядно видны
txtDisplay.SetFocus
End Sub
На примере этого фрагмента видно, как выделить все содержимое текстового поля в программе. Если бы в меню присутствовала команда Select All, ее процедура была бы похожа на этот фрагмент. Если вы хотите узнать, какой текст выделен в поле, обращайтесь к свойству SelText.
6. Замените процедуру события cmdClose_Click следующей:
Private Sub cmdClose_Click()
If txtDisplay.SelLength > 0 Then
MsgBox "Выделен текст" & txtDisplay.SelText
End If
End ' Выгрузить форму
End Sub
7. Запустите приложение. В диалоговом окне Text Box Properties выделите слово Multiline и нажмите кнопку Close. Примерный вид экрана изображен на рис. 3.4.
Рис. З.4. Выделенный фрагмент в свойстве SelText
Надписи
Надпись (см. рисунок) отчасти похожа на текстовое поле — она тоже используется для вывода текста. Главное отличие заключается в том, что пользователь не может изменить текст надписи по своему усмотрению (хотя его можно изменить как свойство во время выполнения программы).
Самое важное свойство надписи — Caption (а не Text, в отличие от текстового поля). Надписи часто содержат справочную информацию. Они могут использоваться как самостоятельно, так и в виде «подсказок» для текстового поля, списка или другого элемента. В последнем случае надпись кратко описывает элемент. Например, если на вашей форме находится текстовое поле для ввода имени клиента, слева или сверху от него можно разместить надпись и установить ее свойству Caption значение Имя клиента.