Использование класса диалоговых окон
В предыдущем примере мы разработали простейший класс для работы с диалоговыми окнами. После знакомства со следующим примером вы поймете, как библиотеки ActiveX DLL используются в приложениях. После этого вы сможете продолжить работу над классом и приспособить его к своим целям. Давайте создадим небольшое приложение для проверки класса:
1. Создайте новый проект командой File > New Project. B окне Project Wizard выберите значок Standard EXE.
2. Задайте следующие свойства формы Form1.
Name: | Caption: |
FrmDialogs | Создание диалоговых окон |
3. Поместите на фоpмy.frmDialogs две надписи. Задайте их свойства.
Name: | Caption: |
IblTitle IblMsg | Заголовок: Сообщение: |
4. Добавьте два текстовых поля и задайте их свойства.
Name: | Text: | |
txtTitle | Пустое поле | |
txtMsg | Пустое поле |
5. Добавьте на форму три кнопки и задайте их свойства.
Name: | Caption: |
cmdYN | &Да/нет |
cmdErr | &0шибка |
cmdLogin | &Регистрация |
Примерный вид формы показан на рис. 10.1.
Рис. 10.1. Форма для работы с классом диалоговых окон
6. Выполните команду Project > References.
7. Установите флажок слева от строки Класс для работы с диалоговыми окнами (рис. 10.2), затем нажмите кнопку ОК.
Рис. 10.2. Создание ссылки на класс
8. Откройте окно программы и введите следующий фрагмент в секции (Gene-ral)(Declarations):
Option Explicit
Dim dlg As clsDialogs
9. Первое, что необходимо сделать в приложении для работы с классом, — создать экземпляр соответствующего объекта. Для этого в процедуру Form_Load() добавляется следующий фрагмент:
Private Sub Form_Load()
Set dlg = New clsDialogs
End Sub
10. Если ваша программа создает экземпляр объекта, она должна уничтожать его, когда он становится ненужным. Поскольку класс используется на протяжении всего жизненного цикла приложения, уничтожать его следует при выходе из приложения. Добавьте следующий фрагмент в процедуру Form_Unload():
Private Sub Form_Unload(Cancel As Integer)
Set dlg = Nothing
End Sub
11. Добавьте следующий фрагмент, предназначенный для тестирования логических окон (YNBox):
Private Sub cmdYN_Click()
Dim rc As Integer
rc = dlg.YNBox(txtTitle.Text, txtMsg.text)
If rc = vbYes Then
MsgBox "Нажата кнопка Yes"
Else
MsgBox "Нажата кнопка No"
End If
End Sub
12. Добавьте фрагмент, предназначенный для тестирования окон ошибок (ErrMsg):
Private Sub cmdError_Click()
dlg.ErrMsg txtTitle.Text, txtMsg.text
End Sub
13. Добавьте фрагмент, предназначенный для тестирования окон регистрации (LoginBox):
Private Sub cmdLogin_Click()
Dim UserID As String
UserID = dlg.LoginBox(txtTitle.Text, txtMsg.Text, "")
If UserID <> "" Then
MsgBox UserID & " успешно зарегистрирован!"
End If
End Sub
14. Сохраните и запустите проект.
Если все было сделано правильно, вы сможете ввести текст в полях Заголовок и Сообщение. Чтобы проверить, как работают логические окна:
1. Введите в поле Заголовок строку Выход?.
2. Введите в поле Сообщение строку Вы уверены?.
3. Нажмите кнопку Да/Нет.
На экране появляется диалоговое окно, изображенное на рис. 10.3.
Рис. 10.3. Диалоговое окно YNBox
Сейчас мы воспользуемся окном ErrMsg для вывода фиктивного сообщения об ошибке. Вы можете отображать это диалоговое окно в процедурах обработки ошибок ваших приложений. Чтобы проверить, как работают окна ошибок:
1. Введите в поле Заголовок строку Системная ошибка.
2. Введите в поле Сообщение строку Диск не удается отформатировать!
3. Нажмите кнопку Ошибка.
Появляется диалоговое окно, изображенное на рис. 10.4.
Рис. 10.4. Диалоговое окно ErrMsg
Хотя диалоговое окно LoginBox станет полезным лишь после основательной доработки, простейший тест из этого примера показывает, как работать с окном ввода. Чтобы проверить, как работают окна LoginBox:
1. Введите в поле Заголовок строку Регистрация.
2. Введите в поле Сообщение строку Введите имя пользователя:.
3. Нажмите кнопку Регистрация.
Появляется диалоговое окно, изображенное на рис. 10.5.
Рис. 10.5. Диалоговое окно для регистрации пользователей
Мы рассмотрели пример использования нестандартных диалоговых окон в приложениях. Когда ваши приложения станут более стандартными, вы сможете включить в класс и другие окна.
В этом примере мы не только научились пользоваться диалоговыми окнами, но и вкратце познакомились с тем, как в Visual Basic создаются объекты. Более подробно об объектах рассказывается в уроках 15 и 17.
Что нового мы узнали?
В этом уроке мы научились:
Использовать стандартные окна сообщений Visual Basic для вывода информации.
Использовать окна ввода для простейшего сбора информации.
Создавать нестандартные диалоговые окна.
Интегрировать класс диалоговых окон в будущих приложениях.
УРОК
Работа с мышью
Обработка событий мыши
Перетаскивание
Перетаскивание OLE
Создание «пасхального яйца»
События мыши
До сих пор нам приходилось иметь дело с двумя событиями, связанными с мышью, — Click и DblClick (двойной щелчок). В этом уроке будет рассказано и о других событиях мыши, используемых в Visual Basic. K их числу относятся перемещение мыши и нажатия кнопок — самостоятельно или одновременно с клавишами Shift, Alt и Ctrl Эти события обрабатываются в процедурах MouseDown и MouseUp, а также MouseMove. В последнем событии удобно отображать и скрывать подсказки, когда указатель мыши проходит над кнопками панели инструментов. Различные элементы поддерживают разные события мыши. В этом уроке рассматриваются основные события мыши вместе со способами их применения. В частности, мы напишем небольшую программу, обрабатывающую процедуру перетаскивания. После этого вы будете хорошо представлять себе, какие события мыши следует использовать в ваших элементах.
Событие Click
Событие Click генерируется при щелчке мышью на элементе. Почти все элементы Visual Basic, отображаемые во время выполнения программы, поддерживают событие Click, но чаще всего оно используется для кнопок. Код, находящийся в процедуре события Click кнопки, выполняется при нажатии этой кнопки мышью. Например:
Private Sub cmdOK_Click()
Unload Me
End Sub
Событие DblClick
Событие двойного щелчка, DblClick, вызывается при двух быстрых последовательных щелчках мышью. Чувствительность двойного щелчка задается при настройке параметров мыши в Панели управления Windows. B списках это событие часто применяется для просмотра свойств, а также для добавления и удаления выделенных строк. Например:
Private Sub lstmembers_DblClick()
Dim m As clsMember
Set m = New clsmember
m.MemberName = lstMembers.Text
m.ShowMemberProperties Set m = Nothing
End Sub
Обычно двойной щелчок мышью используется для ускоренного выполнения команды меню или нажатия кнопки.
Событие DragDrop
Событие DragDrop генерируется при сбрасывании объекта, перетаскиваемого мышью. Процедура события DragDrop имеет следующий синтаксис:
Private Sub target_DragDrop(Source As Control, X As Single, Y As Single)
Обратите внимание на три параметра — перед тем как выполнять любые дальнейшие действия, можно проверить их значения. Параметр Source содержит имя элемента, сброшенного на текущий объект. Параметры X и Y определяют координаты указателя мыши на момент генерации события DragDrop(). Пользуясь ими, можно задать расположение элемента на приемнике. Более подробная информация о перетаскивании приведена в следующем разделе этого же урока.
Coбытие DragOver
Событие DragOver генерируется при протаскивании объекта над элементом. Процедура события имеет следующий синтаксис:
Private Sub target_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
Source — имя протаскиваемого объекта. Параметры X и Y определяют координаты указателя мыши. Целая переменная State определяет состояние перетаскиваемого объекта по отношению к приемнику события.
Параметр State | Назначение |
Объект входит в границы источника | |
Объект покидает границы источника | |
Объект перетаскивается внутри границ источника |
С помощью этого события удобно сообщать пользователям, можно ли в настоящий момент сбросить перетаскиваемый объект. Например, вряд ли стоит разрешать сбрасывание объекта на кнопке; при генерации события DragOver() кнопки можно проверить параметр Source и задать свойству DragIcon значок «сбрасывание запрещено».
Событие MouseDown
Если нажать кнопку мыши и не отпускать ее, генерируется событие MouseDown. Процедура события MouseDown() имеет следующий синтаксис:
Private Sub target_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single).
Как и в других событиях мыши, параметры X и Y определяют положение указателя. Целый параметр Button принимает одно из трех значений.
Параметр Button | Описание |
Левая кнопка мыши | |
Правая кнопка мыши | |
Средняя кнопка мыши |
По значению этого параметра можно узнать, какая кнопка была нажата. Это удобно в тех случаях, когда при нажатии кнопки должно открываться контекстное меню элемента. Например:
Private Sub lstMembers_MouseDown(Button As Integer, Shift As Integer,
X As Single, Y As Single)
If Button = 2 Then
PopupMenu mnuMembers
End If
End Sub
Целочисленный параметр Shift описывает состояние клавиш Shift, Ctrl и Alt на момент нажатия кнопки. Он принимает следующие значения.
Параметр Shift | Описание |
Клавиша Shift | |
Клавиша Ctrl | |
Клавиша Alt |
Сумма этих величин определяет различные сочетания клавиш. Например, значение 6 означает, что были нажаты Ctrl и Alt, a значение 7 показывает, что все три управляющие клавиши были нажаты одновременно. При проверке параметра Shift часто используется ключевое слово And. C помощью вложенных конструкций If...Then можно отслеживать разные клавиши. Например, фрагмент:
If Shift = 6 Then
MsgBox "Нажаты клавиши Ctrl и Alt"
End If
эквивалентен следующему:
If Shift And 6 Then
MsgBox "Нажаты клавиши Ctrl и Alt"
End If
Событие MouseMove
Событие MouseMove генерируется при перемещении мыши над элементом. В его процедуре можно изменить состояние элемента, находящегося под указателем мыши, например перекрасить в зеленый цвет незаблокированную кнопку при прохождении указателя мыши. Процедура события имеет следующий синтаксис:
Private Sub cmdExit_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Параметры этого события идентичны параметрам события MouseDown. В следующем примере заголовок формы изменяется, когда указатель мыши проходит над кнопкой Exit:
Private Sub cmdExit_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Me.Caption = "Нажмите, чтобы закрыть приложение"
End Sub
Аналогичный код можно включить и в процедуры событий MouseMove других элементов. До появления механизма подсказок я часто пользовался этим событием для вывода в строке состояния справочных сообщений.
Событие MouseUp
Если отпустить нажатую кнопку мыши над элементом, генерируется событие MouseUp(). Процедура события имеет следующий синтаксис:
Private Sub target_MouseUp(Button As Integer, Shift As Integer,
X As Single, Y As Single)
Его параметры совпадают с параметрами MouseDown и MouseMove. Во многих новых приложениях для Windows 95 это событие используется вместо Click. Например, в процедуру события MouseUp можно включить оператор End, чтобы пользователь мог продолжить работу с приложением даже после нажатия кнопки выхода. Чтобы отменить выход, следует отвести указатель мыши от кнопки и отпустить нажатую кнопку мыши. В этом случае оператор End не выполняется, поскольку событие MouseUp генерируется для другого объекта.
Перетаскивание
Перетаскивание все чаще используется в Windows-приложениях (например, для регулировки положения разделительной полосы в Windows Explorer). Благодаря ему многие операции выполняются быстрее и проще. Наделить приложение Visual Basic возможностью перетаскивания не так уж сложно. Следующий пример показывает, как это делается:
1. Создайте новый проект типа Standard EXE.
2. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption — значение Перетаскивание.
3. Поместите на форму два списка одинакового размера. Один должен находиться в верхней, а другой — в нижней частях формы.
4. Задайте свойству Name верхнего списка значение lstA, а свойству DragIcon — значение \Graphics\Icons\DragDrop\Draglpg.ico.
5. Задайте свойству Name нижнего списка значение lstB, а свойству DragIcon -значение \Graphics\Icons\DragDrop\Draglpg.ico. Примерный вид формы показан на рис. 11.1.
Рис. 11.1. Приложение с поддержкой перетаскивания
6. Добавьте в процедуру события Form_Load() следующий фрагмент:
Private Sub Form_Load()
lstA,AddItem "Яблоки"
lstA.AddItem "Персики"
lstA,AddItem "Апельсины"
End Sub
7. Добавьте в процедуру события lstA_MouseDown() следующий фрагмент:
Private Sub lstA_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If lstA.ListCount > 0 Then
lstA.Drag 1
End If
End Sub
8. Добавьте в процедуру события lstA_DragDrop() следующий фрагмент:
Private Sub lstA_DragDrop(Source As Control, X As Single, Y As Single)
If Source = lstB Then
lstA.Additem lstB.Text
lstB.RemoveItem lstB.ListIndex
End If
End Sub
9. Добавьте в процедуру события lstB_MouseDown() следующий фрагмент:
Private Sub lstB_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If lstB.ListCount > 0 Then
lstB.Drag 1
End If
End Sub
10. Добавьте в процедуру события lstB__DragDrop() следующий фрагмент:
Private Sub lstB_DragDrop(Source As Control, X As Single, Y As Single)
If Source = lstA Then
lstB.Additem lstA.Text
lstA.RemoveItem lstA.ListIndex
End If
End Sub
11. Сохраните и запустите проект.
Верхний список содержит несколько строк с названиями фруктов. Вы можете щелкнуть на любой строке и перетащить ее в нижний список. Когда указатель мыши окажется над ним, отпустите кнопку мыши. Затем строки можно перетащить обратно в верхний список (рис. 11.2).
Рис. 11.2. Перетаскивание строк
Ключевым для этой программы является метод Drag. Обратите внимание — в процедуре события MouseDown() он вызывается с параметром 1, который сообщает элементу о начале перетаскивания. Если параметр равен 0, перетаскивание прекращается. Иными словами, чтобы прекратить перетаскивание, следует присвоить свойствам Тор и Left значения координат x и у указателя мыши и вызвать метод Drag 0. При этом имитируется перемещение объекта, тогда как на самом деле оно выполняется в процедуре события DragDrop().
Наш разговор о перетаскивании подходит к концу. Попробуйте немного поэкспериментировать — развлекайтесь и заодно следите за происходящим. Возможно, вам захочется использовать перетаскивание в своих проектах. Обратите внимание на свойство DragIcon источника, то есть перетаскиваемого объекта. Если не задать его значение, вы увидите лишь контур перетаскиваемого объекта.
Перетаскивание OLE
В Windows 95 появился новый, более универсальный, тип перетаскивания — так называемое «перетаскивание OLE» (OLE drag-and-drop). Сокращение OLE означает Object Linking and Embedding, то есть «связывание и внедрение объектов». Этот тип перетаскивания позволяет перемещать текст, файлы и объекты между элементами, которые выполняют функции контейнеров OLE, — списками, текстовыми и графическими полями. В окне программы Visual Basic предусмотрены некоторые возможности, построенные на основе перетаскивания OLE. При перемещении файлов из Проводника Windows в папку диска С вы также выполняете операцию перетаскивания OLE.
При перетаскивании OLE создается глобальный объект, содержащий перетаскиваемые данные. В процедуре события OLEDragDrop можно получить доступ к содержимому объекта DataObject. Давайте поближе познакомимся с методами и событиями перетаскивания OLE.
Метод OLEDrag
Метод OLEDrag начинает операцию перетаскивания OLE. Он вызывается в тех случаях, когда вы хотите скопировать или переместить данные OLE между двумя контейнерами OLE. Метод имеет следующий синтаксис:
объект.0LЕDrаg
где объект — объект-контейнер OLE, который является источником для операции перетаскивания.
Свойство OLEDragMode
С помощью свойства OLEDragMode можно узнать, способен ли объект выполнять функции источника перетаскивания OLE и в каком режиме будет выполняться операция OLEDrag — в ручном или автоматическом. Свойство может принимать следующие значения.
vbOLEDragManual - 0 | Принимается по умолчанию. Используется при создании ваших собственных обработчиков перетаскивания OLE в приложениях |
VbOLEDragAutomatic - 1 | Используется в тех случаях, когда Visual Basic организует автоматическую обработку операций перетаскивания OLE. Это самый простой способ обеспечить поддержку перетаскивания OLE в ваших приложениях |
Свойство OLEDropMode
Свойство OLEDropMode похоже на OLEDragMode. Задавая его значение, вы определяете тип обработки событий сбрасывания OLE в вашем приложении. Свойство может принимать одно из трех значений.
vbOLEDropNone - 0 | Принимается по умолчанию. Не позволяет контейнеру OLE выполнять функции приемника для событий сбрасывания OLE |
VbOLEDropManual - 1 | Используется при создании ваших собственных обработчиков сбрасывания OLE в приложениях |
VbOLEDropAutomatic - 2 | Используется в тех случаях, когда Visual Basic организует автоматическую обработку операций сбрасывания OLE. Это самый простой способ обеспечить поддержку сбрасывания OLE в ваших приложениях |
Свойство OLEDropAllowed
По значению свойства OLEDropAllowed можно определить, позволяет ли контейнер OLE выполнять операции сбрасывания OLE. Свойство может принимать следующие значения.
True | Операции сбрасывания OLE в данном контейнере разрешены |
False | Значение по умолчанию. Операции сбрасывания OLE в данном контейнере запрещены |
Событие OLEDragDrop()
Событие происходит при выполнении сбрасывания OLE в контейнере OLE c разрешенной поддержкой сбрасывания. Процедура события имеет следующий синтаксис:
Private Sub объект_OLEDragDrор(данные As DataObject, действие As Long, кнопки As Integer, клавиши As Integer, x As Single, у As Single)
У этой процедуры много параметров, смысл которых необходимо понимать. В параметре данные передается объект OLE DataObject, o котором говорилось ранее. Для получения от этого объекта сброшенных данных можно воспользоваться методом GetData.
Параметр действие сообщает компоненту-приемнику, какое действие должно выполняться с данными. Именно в нем вы указываете источнику OLE, как поступить с перетаскиваемыми данными (например, удалить их из источника после копирования в приемник, то есть переместить данные). Параметр действие может принимать следующие значения.
vbDropEffectNone – 0 | Приемник не принимает данные OLE |
VbDropEffectCopy - 1 | Данные копируются из источника в приемник |
VbDropEffectMove - 2 | Данные перемещаются из источника в приемник |
VbDropEffectScroll -2147483648 | Значение представляет собой маску, которая показывает, требуется ли прокрутка приемника при сбрасывании на него данных.Это значение используется очень редко и только в самых сложных приложениях |
Параметр кнопка определяет кнопку мыши, нажатую во время операции перетаскивания OLE. Он может представлять собой произвольную комбинацию следующих значений.
Нажата левая кнопка мыши | |
Нажата правая кнопка мыши | |
Нажата средняя кнопка мыши |
По значению параметра клавиши можно узнать, были ли нажаты во время перетаскивания служебные клавиши Ctrl, Shift или Alt. При проверке можно воспользоваться оператором AND (для поразрядного сравнения) или проверить целочисленные значения из следующей таблицы.
Нажата клавиша Shift | |
Нажата клавиша Ctrl | |
Нажата клавиша Alt |
Параметры x и у определяют точную позицию курсора мыши. Они пригодятся в тех ситуациях, когда сбрасывание должно происходить в конкретной точке приемника.
Событие OLECompleteDrag()
Событие OLECompleteDrag происходит при сбрасывании данных из источника и успешном выполнении операции копирования или перемещения, а также при отмене операции. В операциях перетаскивания OLE это событие вызывается последним. Вы можете сообщить источнику, какая операция была выполнена приемником, чтобы он поступил должным образом.
Событие обладает всего одним параметром: действие. Этот параметр аналогичен одноименному параметру события OLEDragDrop, за исключением того, что он не может принимать значение vbDropEffectScroll.
Событие OLEStartDrag()
Событие происходит при выполнении перетаскивания OLE для источника с выбранным ручным режимом перетаскивания (свойство OLEDragMode - vbOLEDrag Manual). Кроме того, оно происходит в тех случаях, когда компонент-источник иницииру-етоперацию перетаскивания OLE c автоматическим режимом перетаскивания (свойство OLEDragMode = vbOLEDragAutomatic).
Параметр данные определяет объект DataObject с перемещаемыми или копируемы-миданными OLE или форматы данных, которые будут предоставлены источни-ком позднее.
Параметр возможные-действия определяет операции перетаскивания, разрешенные для источника данной операции. Он может принимать одно из следующих значений: vbDropEffectNone, vbDropEffectCopy или vbDropEffectMove.
Событие OLEDragOver()
Событие происходит при перемещении указателя мыши над контейнером OLE во время операции перетаскивания OLE. По значениям параметров события можно определить, как действовать дальше. Процедура события имеет следующий синтаксис:
Private Sub объект_OLEDragOver(данные As DataObject, действие As Long, _
кнопки As Integer, клавиши As Integer,
x As Single, у As Single, состояние As Integer)
Первые шесть параметров эквивалентны параметрам события OLEDragDrop, рассмотренным выше. Дополнительный параметр состояние определяет состояние перетаскиваемого объекта по отношению к приемнику события и принимает те же значения, что и для рассмотренного ранее события DragOver.
Событие OLESetData()
Событие OLESetData происходит в тот момент, когда компонент-приемник вызывает метод GetData для объекта DataObject источника. Процедура события имеет следующий синтаксис:
Private Sub oбъект_OLESetData(данные As DataObject,
формат-данных As Integer)
Процедура события имеет два параметра. Параметр данные определяет объект DataObject, содержащий необходимые данные. Параметр формат-данных описывает формат данных, которые хранятся в параметре данные.
Событие OLEGiveFeedback()
Событие OLEGiveFeedback происходит после каждого события OLEDragOver. Оно предназначено в первую очередь для создания визуальных признаков, которые показывают, какие действия разрешены для перетаскиваемых данных. Например, в процедуру этого события можно вставить код для изменения перетаскиваемого значка или обновления панели строки состояния.
Приложение с поддержкой перетаскивания OLE
Рассмотрим процесс перетаскивания OLE на следующем примере:
1. Создайте новый проект командой File > New Project. Выберите в диалоговом окне New Project значок Standard EXE и нажмите кнопку ОК.
2. Задайте свойству Name формы Form1 значение frmMain, а свойству Caption -значение Перетаскивание OLE.
3. Поместите на форму два текстовых поля. Разместите их рядом друг с другом так, чтобы их высота примерно совпадала с высотой формы.
4. Задайте свойству Name левого текстового поля значение txt1 и очистите его свойство Text. Задайте свойству OLEDragMode значение 1 - Automatic, a свойству MultiLine - значение True. Задайте свойству ScrollBars значение 2 - Vertical.
5. Задайте свойству Name правого текстового поля значение txt2 и очистите его свойство Text. Задайте свойству OLEDragMode значение 1 - Automatic, a свойству MultiLine - значение True. Задайте свойству ScrollBars значение 2 - Vertical.
6. Вставьте следующий фрагмент в процедуру события OLEDragDrop поля txt1:
Private Sub txt1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Shift > 0 Then
Effect = vbDropEffectCopy
Else
Effect = vbDropEffectMove
End If
txt1,Text = Data.GetData(vbCFText)
End Sub
7. Вставьте следующий фрагмент в процедуру события OLEStartDrag поля txt1:
Private Sub txt1_OLEStartDrag(Data As DataObject, _
AllowedEffects As Long)
Data,SetData txt1.Text, vbCFText
End Sub
8. Перейдем к текстовому полю txt2 и наделим его поддержкой перетаскивания. Сначала вставьте следующий фрагмент в процедуру события OLEDragDrop поля txt2:
Private Sub txt1_OLEDragDrop(Data As DataObject, _
Effect As Long, Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Shift > 0 Then
Effect = vbDropEffectCopy
Else
Effect = vbDropEffectMove
End If
txt2.Text = Data.GetData(vbCFText)
End Sub
9. Вставьте следующий фрагмент в процедуру события OLEStartDrag поля txt2:
Private Sub txt2_OLEStartDrag(Data As DataObject, _
AllowedEffects As Long)
Data.SetData txt2.Text, vbCFText
End Sub
10. Сохраните и запустите проект.
Введите какой-нибудь текст в левом текстовом поле. Вы можете скопировать или переместить его в правое поле путем перетаскивания. Но чтобы увидеть действительно эффектный номер, запустите WordPad или Microsoft Word и попробуйте перетащить данные из txt1 в окно другого приложения (не перепутайте WordPad с Блокнотом (Notepad) — Блокнот не поддерживает операций перетаскивания OLE). Затем попробуйте перетащить данные из WordPad в ваше приложение. Результат показан на рис. 11.3.
Рис. 11.3. Перетаскивание данных между приложениями
Создание «пасхального яйца»
Давайте спрячем в нашем приложении простейшее «пасхальное яйцо». Если вы не знаете, что этот термин означает на жаргоне программистов, позвольте мне объяснить. Многие приложения Windows обладают скрытыми возможностями для отображения справочной информации или картинки. В сообщениях обычно перечисляется состав команды, работавшей над проектом, или выводится их оцифрованная фотография. Иногда в «пасхальном яйце» прячется ролик, порочащий продукт конкурентов.
Такие скрытые функции называются «пасхальными яйцами»потому, что их приходится разыскивать. Чаще всего они прячутся в диалоговом окне About и вызываются только определенной последовательностью щелчков и нажатий клавиш. Мы воспользуемся диалоговым окном About, созданным Form Wizard, и включим в него простейшее «пасхальное яйцо».
Если проявить некоторую изобретательность при программировании, диалоговое окно с «пасхальным яйцом» можно будет использовать и в других приложениях.
1. Создайте новый проект типа Standard EXE.
2. Задайте свойству Caption формы Form1 значение Пасхальное яйцо.
3. Создайте меню на форме Form1. Задайте свойству Caption значение &About, а свойству Name — значение mnuAbout.
4. Щелкните правой кнопкой мыши в окне проекта и выберите из контекстного меню команду Add > Form. В открывшемся окне Form Wizard выберите значок About Dialog и нажмите кнопку Open (рис. 11.4).
Рис. 11.4. Создание формы диалогового окна About
5. Дважды щелкните на значке, расположенном в левом верхнем углу окна About, чтобы открыть окно программы.
6. В окне программы перейдите к процедуре события picIcon_MouseUp() и добавьте в нее следующий фрагмент:
Private Sub picIcon_MouseUp(Button As Integer,
Shift As Integer, X As Single, Y As Single)
If Button = 2 And Shift = 6 Then
MsgBox "Вы нашли пасхальное.яйцо!"
End If
End Sub
7. Дважды щелкните на форме Form1 в окне проекта, чтобы открыть окно программы.
8. Добавьте в процедуру события mnuAbout_Click() следующий фрагмент:
Private Sub mnuAbout_Click()
frmAbout.Show vbModal
End Sub
9. Сохраните и запустите программу.
10. Найдите «пасхальное яйцо» — для этого следует...
Нет, я не скажу, как отыскать «пасхальное яйцо» — если вы поняли код этого примера, это и так очевидно. Когда сюрприз будет найден, вы увидите нечто похожее на рис. 11.5. На самом деле наше «яйцо» получилось довольно скучным. Чтобы поразить воображение пользователя, придется создать нестандартную форму с графикой и даже звуком. Если вас интересует, как воспроизвести файл формата .wav, прочитайте урок 19, «Использование DLL и Windows API», — в нем содержится весь необходимый код.
Рис. 11.5. «Пасхалъное яйцо» найдено
Что нового мы узнали?
В этом уроке мы научились:
Управлять мышью на программном уровне.
Наделять приложения поддержкой перетаскивания.
Использовать операции перетаскивания OLE между приложениями.
Создавать «пасхальные яйца» в диалоговом окне About.
УРОК 12
Отладка приложений
Документирование программы
Отладочные средства Visual Basic
Создание тестовых утилит
Прежде чем распространять свое приложение среди пользователей, здравомыслящий программист тестирует его и старается устранить как можно больше ошибок. В этой главе описаны некоторые приемы, которые сводят к минимуму вероятность появления ошибок в программе, а также помогают выловить существующие ошибки. К числу таких приемов относятся настройка среды, документирование кода с подробными комментариями, работа с отладочными средствами и разработка тестовых утилит. К концу этого урока вы научитесь документировать и отлаживать свои программы, чтобы сделать их воистину «несокрушимыми».
Документирование программ
Прежде чем подробно рассматривать отладочные средства Visual Basic, давайте в общих чертах познакомимся с тем, что я называю «профилактическими средствами». Хотя на первый взгляд это кажется неочевидным, но ясное, четкое и последовательное документирование — залог хорошей работы программы.
ПОДСКАЗКАПри документировании программы необходимо соблюдать единый стиль. Иначе говоря, в комментариях должны использоваться одинаковые заголовки и стандартное оформление. Профессиональный подход к документированию сокращает время, потраченное на отладку.
Комментарии в программе
Комментарии в приложениях играют почти такую же важную роль, как и программный код. Комментарии помогают понять, какую задачу выполняют строка программы, процедура, модуль или все приложение. Они неоднократно встречались в примерах многих уроков. Самый очевидный признак комментария — символ «апостроф» (') в начале строки. Весь текст справа от этого символа (если он не входит в строковую константу) представляет собой комментарий и выводится другим цветом. По умолчанию для комментариев используется зеленый цвет. Использование комментариев — дело привычки и стиля, однако в последующих разделах приведены некоторые рекомендации по поводу эффективного документирования программ. Начнем с документирования на уровне приложения.
Уровень приложения
Недавно один из моих коллег предложил мне задачу. Его интересовал следующий вопрос: как проще всего узнать, какие нестандартные элементы необходимы для нормальной компиляции и работы приложения? Казалось бы, ответить очень просто, ведь приложение написано вами, не так ли? Однако в данной ситуации это были не так.
Программисты разделились на группы для работы над разными проектами, и в каждой группе использовалась своя система построения — центральный компьютер, на котором устанавливались все нестандартные элементы, а также различные версии Visual Basic.
Проблема с компонентами была особенно важной из-за того, что программа установки не всегда могла определить наличие всех необходимых ресурсов, особенно в трехуровневой архитектуре «клиент — сервер». В результате мы решили создавать отдельный программный модуль, который не содержал ничего, кроме сведений о проекте в следующем формате:
' Имя приложения:
' Версия:
' Copyright:
Товарные знаки:
' Автор/организация:
' Назначение:
' Требования:
После заполнения всех полей комментарий должен выглядеть примерно так:
' Имя приложения: Программа для работы с файлами журналов
Версия: 1.1
'Copyright: 1998-ABCSoftware
All Rights Reserved
'Товарные знаки: Нет
'Автор/организация: Джейн Доу/АВС Software
'Назначение: Приложение читает и анализирует файлы журналов.
'Может использоваться для централизованного управления системными журналами через единый интерфейс с общим набором инструментов
'Требования:
Клиент: Windows 95 / Windows NT 4.0
Сервер: MS SQL Server 6.5
MS Transaction Server 2.0
Файл с комментариями включается в приложение. Если кому-нибудь потребуется проверить приложение, из файла с описанием проекта можно узнать, что необходимо для успешной компиляции и работы приложения. Сначала эти файлы приходилось создавать вручную, но потом я написал специальную надстройку, которая автоматизировала выполнение этой задачи. Эта надстройка рассматривается в уроке 16, «Расширение IDE c помощью надстроек».
ПОДСКАЗКАЕсли приложение использует нестандартные компоненты или предъявляет какие-либо особые требования (например, наличие сервера баз данных), в проект следует включать подобный файл с комментариями. Для этого файла всегда следует выбирать стандартное имя, чтобы все разработчики точно знали, где можно получить спецификацию приложения.
Уровень модуля
Описание всех программных модулей, входящих в проект, может оказаться не менее важным, чем документирование конкретных деталей и требований всего приложения. Такие описания становятся особенно актуальными в ситуациях, когда центральные программные модули, выполняющие особые функции приложения, используются в нескольких рабочих группах.
Ниже показан стиль комментариев, которыми я предпочитаю пользоваться на уровне модулей. В них содержится вся основная информация, необходимая для использования модуля в приложении. Комментарии сокращают время разработки и обеспечивают последовательный, стандартный вид приложения.
'Имя файла:
' Автор:
'Дата:
'Описание:
'Зависимости:
'Обновления:
Готов<