Работа со списками и комбинированными полями

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

1. Создайте новый проект, поместите на форму список и задайте его свойству Name значение IstGroceries.

2. Создайте под списком комбинированное поле и установите значение его свойства Name в cboProducts, а значение Caption — в Хлеб.

3. Разместите на форме две надписи. Первая надпись должна находиться над списком, ее свойству Caption следует присвоить значение Заказ продуктов.

4. Расположите вторую надпись между списком и комбинированным полем. Ее свойство Caption должно иметь значение Склад.

5. Создайте кнопку в середине нижней части формы. Задайте ее свойству Name значение cmdAdd, а свойству Caption - значение &Добавить.

6. Отредактируйте процедуру события Form_Load:

Private Sub Form_Load()

‘Очистить список

LstGroceries.Clear

' Добавить строки в комбинированное поле

cboProducts.AddItem "Хлеб"

cboProducts.AddItem "Мука"

cboProducts.AddItem "Мясо"

cboProducts.AddItem "Макароны"

cboProducts.AddItem "Конфеты"

cboProducts.AddItem "Лимонад"

End Sub

7. Добавьте следующий фрагмент в процедуру события cmdAdd_Click:

Private Sub cmdAdd_Click()

IstGroceries.AddItem cboProducts.Text

End Sub

8. Запустите программу. Выберите продукт из комбинированного поля. Чтобы включить его в заказ, нажмите кнопку Добавить.

9. Обратите внимание — на складе нет мороженого. Вы можете ввести его в текстовом поле и нажать кнопку Добавить. Наверное, для вас придется сделать специальный заказ.

ПОДСКАЗКА

Чтобы вызвать в программе процедуру события другого элемента, достаточно ввести ее имя, например cmdAdd_Click: Однако для вызова событий Click кнопок существует и другая возможность — присвоить значение True свойству Value данной кнопки (например, cmdAdd.Value = True).

Рисунки

работа со списками и комбинированными полями - student2.ru Рисунок (стандартный префикс — img) является упрощенным вариантом графического поля, о котором будет рассказано в следующем разделе. В отличие от графических полей рисунки не могут выполнять функции контейнера и содержать другие объекты. В некоторых ситуациях их возможностей не хватает, однако они прекрасно подходят для простейшего вывода изображений на форме. Рисунок занимает гораздо меньше памяти, чем графическое поле.

Элемент-рисунок, входящий в комплект Visual Basic, может отображать растровые файлы (.BMP), значки (.ICO), метафайлы (.WMF), а также файлы в формате JPEG (.JPG) и GIF (.GIF). Он упрощает вывод графики, полученной из World Wide Web или созданной в популярных графических редакторах.

Свойства рисунков

По количеству свойств рисунки уступают графическим полям, о которых будет рассказано далее.

Appearance BorderStyle Container DataField
DataFormat DataMember DataSource DragIcon
DragMode Enabled Height Index
Left MouseIcon MousePointer Name
OLEDragMode OLEDropMode Parent Picture
Stretch Tag Top Visible
WhatsThisHelpID Width    

Как и в большинстве графических элементов, файл для рисунка задается свойством Picture. Вероятно, самое интересное из перечисленных свойств -Оно имеет логический тип, то есть может принимать только значения True или False. В случае False (по умолчанию) размеры элемента автоматически подгоняются под размер изображения. Если позднее они изменяются, то изображение обрезается, окружается пустым местом или происходит и то и другое, в зависимости от направлений масштабирования по горизонтальной и вертикальной осям. Если же установить значение свойства Stretch в True, изображение масштабируется вместе с элементом. У графических полей ближайшим аналогом свойства Stretch является AutoSize. Если установить значение свойства AutoSize графического поля в True, размеры элемента автоматически подгоняются под размеры содержимого. Тем не менее в отличие от изображений с установленным свойством Stretch при масштабировании графического поля изображение остается на месте и не «растягивается» вместе с ним.

События рисунков

С рисунками связано относительно мало событий, причем полезных среди них оказывается еще меньше.

Click DblClick DragDrop DragOver
MouseDown MouseMove MouseUp OLECompleteDrag
OLEDragDrop OLEDragOver OLEGiveFeedback OLESetData
OLEStartDrag      

Иногда рисунки хорошо подходят на роль приемника для операций перетаскивания. Дело в том, что по рисунку можно судить о том, что произойдет при «сбрасывании» перетаскиваемого объекта на этот элемент. Операция перетаскивания рассматривается в уроке 11

Методы рисунков

Рисунки обладают следующими методами:

Drag Move OLEDrag
Refresh ShowWhatsThis ZOrder

Скорее всего, вам не придется использовать эти методы в своих приложениях.

ПОДСКАЗКАВ комплект Visual Basic входит немало заранее подготовленных значков. Они находятся в подкаталоге \Graphics\Icons основного каталога Visual Basic, а также на компакт-диске.

Работа с рисунками

Давайте рассмотрим пример практической работы с рисунками:

1. Откройте уже знакомый проект Controls.vbp из подкаталога \MSDN98\98vs\1033\ Samples\VB98\Controls\.

2. Запустите программу и нажмите кнопку Images.

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

работа со списками и комбинированными полями - student2.ru

Рис. 3.11. Работа с рисунками

Private Sub imgClub_Click()

shpCard.Left = imgClub.Left

picStatus.Cls

picStatus.Print "Трефы" End Sub Private Sub imgDiamond_Click()

shpCard.Left = imgDiamond.Left

picStatus.Cls

picStatus.Print "Бубны" End Sub Private Sub imgHeart_Click()

shpCard.Left = imgHeart.Left

picStatus.Cls

picStatus.Print "Червы" End Sub private Sub imgSpade_Click()

shpCard.Left = imgSpade.Left

picStatus.Cls

picStatus.Print "Пики"

End Sub

Контур карты представляет собой специальный элемент, который во время выполнения программы сдвигается за левый край формы. Это обеспечивается строкой shpCard. Left = -500 в коде события Load формы. Того же эффекта можно достичь, установив значение свойства Visible в False.

Графические поля

Как нетрудно догадаться по названию, графические поля (см. рисунок) часто используются для отображения графических файлов (например, растров, значков, файлов в формате JPEG или GIF). В этом отношении они похожи на только что рассмотренные нами рисунки. Тем не менее эти элементы обладают различными свойствами и по-разному ведут себя. Если вы хотите просто вывести картинку на форме, то рисунок обычно оказывается удобнее графического поля. Рисунки занимают меньше памяти и фактически являются упрощенными вариантами графических полей. С другой стороны, если картинка должна перемещаться по форме, графические поля обеспечивают более высокое качество вывода. Кроме того, во время выполнения программы в графическом поле можно выводить текст и рисовать при помощи различных методов. Графические методы рисуют линии, круги и прямоугольники во время выполнения программы. Но самое главное заключается в том, что графическое поле может выполнять функции контейнера. Следовательно, в него можно поместить кнопку или другой элемент. В этом отношении графические поля действуют как «формы внутри форм».

Свойства графических полей

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

Align Appearance AutoRedraw
AutoSize BackColor Borderstyle
CausesValidation ClipControls Container
CurrentX CurrentY DataChanged
DataField DataFormat DataMember
DataSource DragIcon DragMode
DrawMode Height RightToLeft
DrawStyle HelpContextID ScaleHeight
DrawWidth hWnd ScaleLeft
Enabled Image ScaleMode
FillColor Index ScaleTop
FillStyle Left ScaleWidth
Font Linkltem Tablndex
FontBold LinkMode TabStop
FontItalic LinkTimeout Tag
FontName LinkTopic ToolTipText
FontSize MouseIcon Top
FontStrikethru MousePointer Visible
FontTransparent Name WhatsThisHelpID
FontUnderline OLEDragMode Width
ForeColor OLEDropMode HasDC
Parent hDC Picture

Как видите, на этот раз свойств довольно много. Содержимое графического поля отображается в соответствии со своими нормальными размерами. Если картинка не помещается в поле, ее края обрезаются. Если присвоить свойству AutoSize значение True, графическое поле подгоняется под размеры содержимого. Содержимое графического поля определяется свойством Pictuге - его можно изменять 1 как в режиме конструирования, так и в режиме выполнения. У графических полей есть еще одно свойство с похожим названием — Image. Оно доступно только в 1 режиме выполнения и применяется для копирования картинки из одного графического поля в другое. Данная операция имеет следующий синтаксис:

Picture2. Picture = Picture!. Image

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

Приведенная выше строка помещает копию содержимого первого графического 1 поля во второе (через свойство Picture). Кроме того, картинку можно изменять непосредственно во время выполнения. Это делается так:

Picture1. Picture = LoadPicture ("filename")

Чтобы очистить графическое поле, можно вызвать функцию Visual Basic Load

Picture() без параметров:

Picture1. Picture = LoadPicture()

События графических полей

События графических полей перечислены далее:

Change KeyPress MouseDown OLESetData
Qlick KeyUp MouseMove OLEStartDrag
DblClick LinkClose MouseUp Paint
DragDrop LinkError OLECompleteDrag Resize
DragOver LinkNotify OLEDragDrop Validate
GotFocus LinkOpen OLEDragOver KeyDown
LostFocus OLEGiveFeedback    

Из всех событий, связанных с графическими полями, чаще всего используются Click и DragDrop. Надеюсь, смысл события Click вам уже понятен. Событие DragDrop подробно рассматривается в уроке 11, «Работа с мышью».

Методы графических полей

Графическое поле обладает большим количеством методов, чем его упрощенный аналог, рисунок. В приведенной далее таблице важнейшие методы, как обычно, выделены полужирным шрифтом.

Circle LinkRequest PSet TextHeight
Cls LinkSend Refresh TextWidth
Drag Move ScaleX ZOrder
Line OLEDrag ScaleY LinkExecute
PaintPicture SetFocus LinkPoke Point
ShowWhatsThis      

Методы Circle, Cls, Line, PaintPicture, Print и PSet предназначены для вывода графики и текста в графических полях в режиме выполнения программы — разве что метод Cls (напоминающий старую команду DOS для очистки экрана) используется для стирания. Вызов метода ZOrder при выполнении программы приводит к тому же результату, что и команда Format > Order > Bring To Front или Format > Order > Send To Back. Пользуясь методом ZOrder, можно определить порядок перекрытия объектов. Тем не менее следует учесть, что на форме существует три графических «слоя», а метод ZOrder работает только в пределах слоя данного элемента. Все неграфические элементы, кроме надписей (например, кнопки), относятся к верхнему слою. Графические поля и другие графические элементы (а также надписи) принадлежат к среднему слою. Нижний слой содержит результаты вызова графических методов — например, круг, нарисованный методом Circle, окажется именно в нем. Этим он отличается от круга, образованного специальным управляющим элементом — контуром, который будет находиться в среднем слое. Все это означает, что вам не удастся расположить графическое поле над кнопкой методом ZOrder — оно всегда будет оставаться в нижнем слое. Метод ZOrder перераспределяет объекты лишь в пределах одного слоя.

ПРИМЕЧАНИЕ

Z-порядок определяет относительное расположение объектов внутри одного слоя, или уровня, формы. В режиме конструирования относительное расположение объектов можно изменить командами Format > Order > Bring to Front или Format > Order >. Send to Back, а во время выполнения программы следует пользоваться методом ZOrder.

Таймеры

работа со списками и комбинированными полями - student2.ru Таймер (см. рисунок) принадлежит к числу элементов, которые никогда не отображаются на экране в режиме выполнения. Это означает, что вам не придется выделять для него место на форме — он может располагаться где угодно, даже поверх существующих элементов. Фактически элемент-таймер выполняет всего одну функцию — проверяет показания системных часов и действует в соответствии с результатом.

Свойства таймеров

Как видно из следующей таблицы, у таймера относительно мало свойств:

Enabled Index Interval
Left Name Parent
Tag Тор  

Если не считать свойства Name (имена таймеров рекомендуется снабжать префиксом tmr), в этом списке имеется лишь два полезных свойства — Enabled и Interval. В самом деле, таймер начинает делать что-то полезное лишь после того, как будет задано значение последнего свойства (предполагается, что свойство Enabled имеет принятое по умолчанию значение True). Свойства Left и Тор избыточны — конкретное положение таймера на форме не имеет никакого значения. Значение свойства Interval задается в миллисекундах. Другими словами, чтобы таймер отсчитывал секунды, их число необходимо умножить на 1000. После истечения заданного срока (при условии, что таймер не был заблокирован) элемент генерирует событие Timer. Для этого он часто проверяет показания системных часов.

ПОДСКАЗКА

Значение свойства Interval задается в миллисекундах. Чтобы таймер отсчитал определенное количество секунд, необходимо задать для свойства Interval количество секунд, умноженное на 1000. Учтите, что свойство Interval может принимать значения от 0 (отключение таймера) до 65 535 (65,5 с).

События таймеров

C таймерами связано всего одно событие — Timer. Как было сказано ранее, оно наступает по истечении заданного интервала, определяемого свойством Interval. Чтобы оно не произошло после истечения указанного срока, задайте свойству Enabled таймера значение False.

Методы таймеров

Таймеры не обладают никакими методами.

Работа с таймером

Чтобы лучше понять, как работает таймер, мы создадим часы в заголовке формы:

1. Создайте новый проект командой File > New Project и выберите значок Standard EXE.

2. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption -значение Приложение-часы.

3. Разместите таймер на форме frmMain. Задайте свойству Name значение tmrTime.

4. Задайте свойству Interval значение 500. Состояние системных часов будет проверяться каждые полсекунды. Этот интервал был выбран из-за того, что таймер Visual Basic не отличается особой точностью, однако для нашего приложения подойдет и он.

5. Добавьте следующий фрагмент в секцию (General) (Declarations) формы frmMain:

Option Explicit

Private OldCaption As String

6. Добавьте следующий фрагмент в процедуру события Form_Load:

Private Sub Form_Load()

OldCaption = Me.Caption

End Sub

7. Теперь добавьте следующий фрагмент в процедуру события Timer таймера:

Private Sub tmrTimer_Timer() Dim msg As String

msg = OldCaption & " : " & Time$ Caption = msg

End Sub

8. Сохраните приложение и запустите его командой Run > Start. Примерный вид окна приложения показан на рис. 3.12.

работа со списками и комбинированными полями - student2.ru

Рис. 3.12. Приложение-часы

Возможно, вы заметили, что заголовок приложения слегка мерцает. Чтобы избавиться от этого неприятного эффекта, следует свести к минимуму количество обновлений заголовка в процедуре события Timer:

Private Sub tmrTimer_Timer()

Dim msg As String

msg = OldCaption & ": " & Time$

If msg<>Caption Then

Caption = msg

End If

End Sub

Оператор If...Then проверяет, изменилось ли время, возвращаемое функцией Time$ Если строка msg отличается от Caption, мы обновляем свойство Caption в соответствии с новым значением времени. В противном случае мы ничего не делаем и не] изменяем Caption — мерцание исчезает.

ПОДСКАЗКАВы можете воспользоваться функцией Format, чтобы изменить формат представления времени. Данная функция получает ряд именованных параметров, а также некоторые параметры, которые вы определяете сами. Ее возможности не ограничиваются форматированием даты и времени — эта функция работает с числами и строками. Функция Format подробно описана в электронной документации — найдите раздел Format Function и щелк-ните на ссылке See Also в верхней части окна.

Полосы прокрутки

работа со списками и комбинированными полями - student2.ru Полосы прокрутки (см. рисунок) на формах не следует путать с полосами про- крутки, которые автоматически вставляются в большие текстовые поля или \ списки. Элемент полосы прокрутки представляет собой совершенно независимый объект, не привязанный к другим элементам (текстовым полям или спискам). Горизонтальная и вертикальная полосы прокрутки ничем не отличаются друг от друга, кроме ориентации. Оба элемента обладают одинаковыми свойствами, событиями и методами. Термин «полоса прокрутки» в этом разделе относится как к горизонтальным, так и к вертикальным полосам.

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

Единственная проблема с полосами прокрутки заключается в том, что при получении фокуса они могут мерцать на экране. Чтобы избавиться от мерцания, передайте фокус другому элементу.

ПОДСКАЗКАЧтобы избавиться от мерцания, передайте фокус другому элементу при помощи метода Set Focus. Оператор, содержащий вызов этого метода, должен завершать процедуру события Change полосы прокрутки.

Свойства полос прокрутки

Некоторые свойства полос прокрутки заслуживают внимания:

CausesValidation Container DragIcon DragMode
Enabled Height HelpContextID hWnd
Index LargeChange Left Max
Min MouseIcon MousePointer Name
Parent RightToLeft SmallChange Tablndex
TabStop Tag Top Value
Visible WhatsThisHelpID Width  

Обычно для полос прокрутки задаются свойства Max, Min, LargeChange и SmallChange. Свойства Min и Мах определяют минимальное и максимальное значения, принимаемые свойством Value. Свойству Min следует присвоить наименьшее допустимое значение (например, 0), а свойству Мах — наибольшее. Например, следующий фрагмент может применяться для определения минимальной и максимальной громкости звука в вашем приложении:

Private Sub Form_Load()

hscVolume.Min = 0 ‘Минимальная громкость

hscVolume.Max = 255 ‘ Максимальная громкость

End Sub

Свойство LargeChange показывает, как должно изменяться значение свойства Value, когда пользователь щелкает на полосе прокрутки. Свойство SmallChange определяет изменение Value при щелчке на одной из стрелок в концах полосы. Вам не придется беспокоиться о направлении изменения, важна лишь величина смеще-ния^ В зависимости от того, где вы щелкнули, Visual Basic сам определяет что необходимо сделать - увеличить или уменьшить величину. Полосы прокрутки не имеют свойства, которое бы отвечало за перетаскивание бегунка мышью - не возможно предсказать, как именно он будет перемещаться. Тем не менее, при перетаскивании бегунка происходит автоматическое обновление свойства Value Новое значение свойства можно получить в процедуре события Change полосы прокрутки. Кроме того, свойство Value можно задать в режиме конструирования, чтобы поместить бегунок в нужную позицию. Например, чтобы в предыдущем примере установить исходную громкость на половину максимума, можно воспользоваться следующим фрагментом:

Private Sub Form_Load()

hscVolume.Min = 0 ‘Минимальная громкость

hscVolume.Max = 255 ’ Максимальная громкость

hscVolume.Value = 128 ' Установить громкость на половину максимума

End Sub

Значения свойств Value, LargeChange и SmallChange должны принадлежать диапазону, определяемому свойствами Min и Мах. Обычно свойству Value присваивается значение Min или Мах, чтобы бегунок находился в одном из концов полосы. Значение LargeChange чаще всего выбирается кратным SmallChange. В принципе, Мах может быть меньше Min, хотя это противоречит здравому смыслу. И Мах, и Min могут быть отрицательными.

События полос прокрутки

Ниже перечислены события, поддерживаемые горизонтальными и вертикальными полосами прокрутки:

Change DragDrop DragOver GotFocus
KeyDown KeyPress Keyllp LostFocus
Scroll Validate    

Наиболее важны события Change и Scroll. Первое происходит при изменении свойства Value полосы во время выполнения программы. В свою очередь, свойство Value изменяется, когда пользователь щелкает на стрелке (SmallChange) или прямо на полосе (LargeChange) или перестает перетаскивать бегунок. В последнем случае изменение Value зависит от длины перетаскивания, хотя оно никогда не превышает разности между Мах и Min.

Хотя событие Change происходит в тот момент, когда пользователь отпускает бегунок, оно никогда не генерируется при перетаскивании. Если вы хотите сгенерировать событие Change во время перетаскивания, вызовите его из процедуры события Scroll. Событие Scroll обычно генерируется во время перетаскивания бегунка. Вызывая из его процедуры событие Change, вы тем самым сгенерируете его. Если того не сделать, то для обработки результатов придется ждать, пока пользователь отустит бегунок. С другой стороны, любой щелчок на полосе прокрутки приводит к немедленному вызову события Change.

Методы полос прокрутки

Перечисленные ниже методы полос прокрутки не особенно важны и используются довольно редко.

Drag Move Refresh
SetFocus ShowWhatsThis ZOrder

Работа с полосами прокрутки

Мы рассмотрим работу с полосами прокрутки на примере формы с горизонтальной полосой. Поступите так:

1. Создайте новый проект командой File > New Project.

2. Поместите на форму Form! горизонтальную полосу прокрутки. Задайте свойству Name полосы значение hscVolume.

3. Задайте свойству Min полосы hscVolume значение 0, а свойству Мах — значение 100. Задайте свойству Value значение 50.

4. Задайте свойству SmallChange значение 1, а свойству LargeChange — значение 10.

5. Создайте на форме надпись, задайте ее свойству Name значение IblVolume, а свойству Caption — значение 50.

6. Щелкните в окне свойств на строке Font и задайте свойству FontSize надписи значение 24.

7. Задайте свойству AutoSize надписи значение True. Выровняйте элемент по центру формы над полосой прокрутки.

В результате ваша форма должна быть похожа на рис. 3.13.

работа со списками и комбинированными полями - student2.ru

Рис. 3-13. Окно с полосой прокрутки

8. Дважды щелкните на полосе прокрутки, чтобы открыть окно программы. Добавьте следующий фрагмент в процедуру события Change полосы:

Private Sub hscVolume_Change()

IblVolume.Caption = Trim$(Str$(hscVolume.Value))

End Sub

10. Запустите приложение командой Run > Start.

Наша программа чрезвычайно проста. Она всего лишь отображает текущую позицию бегунка на шкале. Позицию можно изменять — для этого следует щелкнуть на стрелке, перетащить бегунок или щелкнуть на полосе между бегунком и стрелкой. Особого внимания заслуживают разве что функции Trim$ и Str$. Функция Str$ преобразует числовое значение в строку. Такое преобразование необходимо, потому что свойству Caption надписи IblVolume можно присвоить только строковую переменную или переменную типа Variant, а свойство Value полосы прокрутки относится к целому типу. Следовательно, преобразованная величина

Str$(hscVolume.Value)

подойдет для свойства Caption. Функция Trim$ удаляет пробелы в начале и конце строки, которые могут возникнуть в процессе преобразования. Чтобы выводимое значение выглядело аккуратнее, используется следующая комбинация:

Trim$(Str$(hscVolume.Value))

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

Списки дисков

работа со списками и комбинированными полями - student2.ru Список дисков (см. рисунок) обычно используется вместе с другими элементами списками каталогов и файлов (см. далее). Эти три элемента помогают пользователю выбрать файл, находящийся в конкретном каталоге дискового устройства. Переход на другое устройство выполняется с помощью списка дисков. Список каталогов предназначен для изменения каталога, а список файлов - для выбора файла. Списки дисков и каталогов также позволяют задать каталог для сохраняемого файла. Хотя информацию о файле иногда удобнее получать при помощи стандартного диалогового окна, в ближайших разделах будут рассмотрены все три элемента. По мере накопления опыта вы найдете и другие способы применения этих элементов.

Свойства списков дисков

В следующей таблице перечислены свойства, которыми обладают списки дисков

Appearance BackColor CausesValidation Container
DragIcon DragMode Drive Enabled
Font FontBold FontItalic FontName
FontSize FontUnderline ForeColor Height
HelpContextID ListIndex Tablndex Visible
hWnd MouseIcon TabStop WhatsThisHelpID
Index MousePointer Tag Width
Left Name ToolTipText  
List OLEDropMode Top  
ListCount Parent Toplndex  

Имена списков дисков (свойство Name) обычно начинаются с префикса drv. Самым важным из всех перечисленных (не считая Name) является свойство Drive, доступное только во время выполнения программы. Оно показывает, какое дисковое устройство выбрано пользователем. Программа должна правильно реагировать на выбор нового устройства, это почти всегда происходит в процедуре события Change списка дисков (см. следующий раздел).

События списков дисков

Списки дисков поддерживают ряд событий, которые не представляют особого интереса для начинающего программиста.

Change KeyDown OLECompleteDrag OLESetData
DragDrop KeyPress OLEDragDrop OLEStartDrag
DragOver KeyUp OLEDragOver Scroll
GotFocus LostFocus OLEGiveFeedback Validate

Чаще всего в программах используется событие Change. Оно происходит в тот момент, когда пользователь выбирает в элементе новое устройство. В его процедуре по свойству Drive обновляется содержимое списка каталогов. Таким образом, отображаемые каталоги всегда относятся к текущему выделенному устройству. О том, как это делается, подробно рассказано в разделе, посвященном спискам файлов (см. далее).

Методы списков дисков

Ниже перечислены все методы данного элемента.

Drag Move OLEDrag Refresh
SetFocus ShowWhatsThis ZOrder  

Эти методы используются достаточно редко.

Списки каталогов

работа со списками и комбинированными полями - student2.ru Как было сказано ранее, список каталогов (см. рисунок) обычно используется вместе со списком дисков (см. предыдущий раздел) и списком файлов. Из списка каталогов пользователь может выбрать каталог на текущем устройстве. Если пользователь выбирает новое устройство в списке дисков, программа должна обновить содержимое списка каталогов. Кроме того, необходимо обновить список файлов. Для этих целей используется свойство Path и событие Change списка каталогов.

Свойства списков каталогов

Ниже перечислены свойства, которыми обладают списки каталогов.

Appearance FontName List. Tablndex
BackColor FontSize ListCount TabStop
CausesValidation FontStrikethru ListIndex Tag
Container FontUnderline MouseIcon ToolTipText
DragIcon ForeColor MousePointer Top
DragMode Height Name Toplndex
Enabled HelpContextID OLEDragMode Visible
Font hWnd OLEDropMode WhatsThisHelpID
FontBold Index Parent Width
FontItalic Left Path  

Имена списков каталогов (свойство Name) обычно начинаются с префикса dir. Свойство Path, доступное только во время выполнения программы, задает или возвращает путь к каталогу, выбранному из списка. Чаще всего это свойство используется в процедуре Change списка дисков — то есть там, где список каталогов приводится в соответствие выбранному устройству. Свойство Path также используется в процедуре события Change списка каталогов для обновления списка файлов при изменении устройства или каталога.

События списков каталогов

Далее перечислены события, используемые списками каталогов.

Change GotFocus LostFocus OLECompleteDrag
Click KeyDown MouseDown OLEDragDrop
DragDrop KeyUp OLEDragOver OLEStartDrag
DragOver MouseMove OLEGiveFeedback Scroll
KeyPress MouseUp OLESetData Validate

Хотя в программах можно использовать событие Click, списки файлов обычно обновляются в процедуре события Change.

Методы списков каталогов

Вероятно, вам почти не придется работать с методами, которые поддерживаются списками каталогов:

Drag OLEDrag SetFocus ZOrder
Move Refresh ShowWhatsThis  

Списки файлов

работа со списками и комбинированными полями - student2.ru Списки файлов (см. рисунок) завершают цепочку «диск — каталог — файл». В них перечисляются имена файлов из каталога, определяемого свойством Path (рис. 3.14).

работа со списками и комбинированными полями - student2.ru

Рис. 3.14. Списки дисков, каталогов и файлов

На всякий случай напомню, что списки файлов обновляются в процедуре события Change списка каталогов. В свою очередь, список каталогов обновляется в тот момент, когда пользователь выбирает новый каталог в списке каталогов, а также при выборе нового устройства в списке дисков. Чтобы эти связи работали нормально, вам придется правильно написать две процедуры событий (см. пример из следующего раздела).

Свойства списков файлов

Списки файлов обладают множеством свойств, причем многие из них достаточно полезны.

Appearance FontName ListCount Readonly
Archive FontSize ListIndex Selected
BackColor FontStrikethru MouseIcon System
CausesValidation FontUnderline MousePointer Tablndex
Container ForeColor MultiSelect TabStop
DragIcon Height Name Tag
DragMode HelpContextID Normal ToolTipText
Enabled Hidden OLEDragMode Top
FileName hWnd OLEDropMode Toplndex
Font Index Parent Visible
FontBold Left Path WhatsThisHelpID
FontItalic List Pattern Width

Мы рассмотрим лишь некоторые из этих свойств. Свойство Path жизненно важно для работы элемента. Оно доступно только во время выполнения программы, его можно как задавать, так и получать. По свойству Path Visual Basic определяет путь к файлу, выбранному из списка файлов. Объединяя значения свойств Path и FileName, вы получаете так называемое полное, или уточненное, имя файла. Полное имя может использоваться для открытия файлов.

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

Свойство Path приходится задавать при выборе нового диска (в списке дисков) или каталога (в списке каталогов). Чтобы эта схема работала, вам придется правильно закодировать всю последовательность возможных событий. Давайте немного поэкспериментируем, оставляя имена элементов, принятые по умолчанию:

1. Добавьте в процедуру события Drive1_Change следующую строку:

Did.Path = Drivel.Drive

Эта строка обновляет список каталогов в соответствии с выбранным диском. Дело в том, что при программном изменении свойства Path также будет сгенерировано событие Change для списка каталогов. То же самое происходит и при «ручном» изменении каталога в списке.

2. Добавьте в процедуру события Change списка каталогов следующую строку:

Filel.Path = Dirl.Path

В этом случае отображаемые файлы (состав которых определяется свойством Path списка файлов) будут соответствовать текущему выбранному устройству и каталогу. При смене диска автоматически выбирается новый каталог.

Свойство Pattern можно задавать как в режиме конструирования, так и в режиме выполнения. По умолчанию свойство Pattern имеет значение *. *, что соответствует отображению всех файлов из списка. Вы можете сократить число отображаемых файлов, применив к ним некоторый фильтр, — например, при выборе шаблона *. txt будут отображаться только текстовые файлы.

Свойства Archive, Hidden, Normal, Readonly и System позволяют увеличить или уменьшить количество файлов в списке. По умолчанию свойства Hidden и System имеют значение False — обычно пользователь даже не догадывается о наличии системных и скрытых файлов.

ПОДСКАЗКАЕсли вы пишете программу для системного или сетевого администратора, скрытые и системные файлы должны входить в список. Для этого достаточно задать свойствам Hidden и System значение True.

Приведенный ранее код также синхронизирует содержимое элементов при запуске приложения.

События списков файлов

Ниже перечислены события, поддерживаемые списками файлов.

Наши рекомендации

Click KeyPress OLECompleteDrag PathChange
DblClick KeyUp OLEDragDrop PatternChange
DragDrop LostFocus OLEDragOver Scroll
DragOver MouseDown OLEGiveFeedback Validate
GotFocus MouseMove OLESetData