Вы находитесь на странице: 1из 4

РАБОТАЕМ ГРАМОТНО

Советы тем, кто программирует


на Visual Basic Андрей Колесов
Ольга Павлова

Совет 182. Обычно информация о версиях программы ис-


Реализация функции «ожидания» в VB пользуется в форме About. Для этого просто добавь-
Здесь мы покажем, как можно реализовать функцию те метку с именем lblVersion и введите следующий код
ожидания в VB. Вначале поместите на форму таймер для вашей формы:
(Timer1) и установите его свойство Interval= 0 и свой- lblVersion.Caption = "Версия: " & App.Major & _
ство Enabled = False. "." & App.Minor & "." & App.Revision
Если для вашей программы номер Major равен 2,
Для тестирования процедуры добавьте две метки номер Minor — 1 и номер Revision — 12, то метка вы-
(Label1 и Label2) и командную кнопку (Command1) к ведет на экран: “Версия: 2.1.12”.
форме. Напишите следующую подпрограмму и код
события Timer для таймера: Совет 184.
Public Sub Wait(seconds) Создание собственного хранителя экрана
` включение таймера У вас никогда не было желания создать свой собствен-
Timer1.Enabled = True ный хранитель экрана в VB? Если да, то сейчас мы
` установка интервала для таймера приведем элементарный пример, как это можно сде-
Me.Timer1.Interval = 1000 * seconds лать. Идея очень проста — в качестве заставки будет
While Me.Timer1.Interval > 0 выдаваться форма размером с весь экран, на которую
DoEvents вы можете по собственному желанию нанести любые
Wend изображения.
' выключение таймера Для начала создайте новый проект Standard EXE.
Timer1.Enabled = False Поместите на форму элемент управления Label, содер-
End Sub жащий какой-либо текст. Затем добавьте туда элемент
управления Timer, для которого установите свойство
Private Sub Timer1_Timer() Interval как 1000 (то есть 1 с). Теперь введите следу-
Timer1.Interval = 0 ющий код для вашей формы:
End Sub Private Sub Form_Click()
Теперь можете использовать функцию Wait везде, ' хранитель экрана выгружается, если щелкнуть форму
где требуется какая-либо задержка, например: Unload Me
Private Sub Command1_Click() End Sub
Label1.Caption = Now
Wait (5) Private Sub Form_Load()
Label2.Caption = Now ' не разрешается загружать несколько
End Sub ' экземпляров хранителя экрана
If App.PrevInstance Then Unload Me
Совет 183. End Sub
Поддержка нумерации версий
ваших VB-программ Private Sub Timer1_Timer()
Нумерация версий программ, созданных на VB, мо- ' мигание метки каждую секунду
жет быть простой, если при создании EXE-модуля Label1.Visible = Not (Label1.Visible)
использовать функцию Version Numbering. Для это- End Sub
го щелкните кнопку Options диалогового окна Make После этого установите свойство WindowState для
Project, а затем установите флажок Auto Increment формы как Maximized, а свойство Border Style как
во вкладке Make диалогового окна Project None. Большинство хранителей экрана занимают
Properties. полный размер экрана и не имеют строки заголовка.
Номер версии программы состоит из трех элемен- Выберите команду File|Make EXE File и в появившем-
МАРТ 1999

тов: Major, Minor и Revision. Функция Auto Increment, ся диалоговом окне Make Project щелкните кнопку
если она выделена, будет автоматически увеличивать Options. В диалоговом окне Project Properties в тексто-
номер Revision на единицу при каждом запуске коман- вом поле Application Title введите прописными бук-
ды Make Project для конкретного проекта. вами строку SCRNSAVE:. (Например, мы можем назвать

1
РАБОТАЕМ ГРАМОТНО

наше приложение SCRNSAVE:TestApp1.) При задании Для класса Class1 введите такой код:
имени исполняемого файла не забудьте поменять Private WithEvents txt As TextBox
расширение: оно должно быть .SCR вместо .EXE. (Для
нашего примера назовите исполняемый файл как Public Property Set TextBoxCtl(OutsideTextBox_
TestApp1.scr.) Щелкните OK. As TextBox)
Вот и все. Теперь не забудьте поместить SCR-файл Set txt = OutsideTextBox
в каталог \Windows\System и поменяйте хранитель End Property
экрана, как обычно, с помощью Control Panel.
Private Sub txt_KeyPress(KeyAscii As Integer)
Совет 185. ' преобразует в прописные буквы
Используйте WithEvents для добавления KeyAscii = Asc(UCase$(Chr$(KeyAscii)))
новых функций к элементу управления End Sub
Когда-нибудь вы можете столкнуться с тем, что у
стандартных элементов управления отсутствуют Private Sub txt_MouseMove(Button As Integer,
какие-либо полезные функции. Для этого можно Shift As Integer, X As Single, Y As Single)
использовать традиционный способ: написать нуж- txt.ToolTipText = "X:" & X & " Y:" & Y
ный код для соответствующего события каждого End Sub
элемента управления. Однако в VB5 и VB6 имеет- Используя такую программную конструкцию, вы
ся команда WithEvents, которая предоставляет про- добавите новые функциональные возможности для
стое решение с использованием классов. всех четырех текстовых полей. Но обратите внима-
Предположим, вы хотите вводить в текстовое окно ние, что событие KeyPress для элемента управления
только прописные буквы с тем, чтобы все вводимые выполняется раньше, чем происходит обращение к
строчные буквы автоматически преобразовывались классу. Поэтому в поле TextBox4 вместо «a» будет вво-
в прописные. Кроме того, вам необходимо, чтобы при диться «z», которая сразу же преобразуется в «Z».
попадании курсора мыши внутрь текстового окна на
экране появлялась всплывающая подсказка Совет 186.
ToolTipText, содержащая координаты курсора внут- Изменение набора изображений в элементе
ри данного текстового окна. управления ImageList, связанном
Создайте новый проект Standard EXE, размести- с элементом управления Toolbar
те на форме четыре элемента управления TextBox В режиме разработки проекта вам может пригодить-
с именами Text1, Text2, Text3, Text4 и добавьте мо- ся возможность свободно добавлять изображения
дуль класса. Введите следующий код для формы в элемент управления ImageList, связанный с эле-
Form1: ментом управления Toolbar, или удалять их оттуда.
' общие объявления И поскольку VB не позволяет изменять набор изоб-
Private clsTextBox1 As Class1 ражений в ImageList, пока он связан с панелью ин-
Private clsTextBox2 As Class1 струментов, мы покажем вам способ, как обойти
Private clsTextBox3 As Class1 данное ограничение.
Private clsTextBox4 As Class1 Шаг 1. Заполнение элемента управления ImageList.
Поместите элемент управления ImageList на форму.
Private Sub Form_Load() (Если данный компонент не входит в комплект инст-
Set clsTextBox1 = New Class1 рументальных средств вашего проекта, то его можно
Set clsTextBox1.TextBoxCtl = Text1 добавить так, как показано в Совете 187.) Щелкните
Set clsTextBox2 = New Class1 по нему правой кнопкой мыши, а затем выберите ко-
Set clsTextBox2.TextBoxCtl = Text2 манду Properties для открытия диалогового окна
Set clsTextBox3 = New Class1 Property Pages. Выберите вкладку Images и щелкните
Set clsTextBox3.TextBoxCtl = Text3 кнопку Insert Picture. В диалоговом окне Select Picture
Set clsTextBox4 = New Class1 найдите изображение, которое хотите добавить в эле-
Set clsTextBox4.TextBoxCtl = Text4 мент управления ImageList. Присвойте ему уникаль-
End Sub ное свойство Key. Повторите эти операции, пока не
заполните элемент управления ImageList так, как вам
Private Sub Text4_KeyPress(KeyAscii As Integer) хочется.
' этот код выполняется перед событием KeyPress Шаг 2. Добавление кнопок к панели инструментов.
' для класса Class1 Щелкните правой кнопкой мыши элемент управления
МАРТ 1999

If KeyAscii = Asc("a") Then Toolbar и затем выберите команду Properties. В рас-


KeyAscii = Asc("z"): Beep крывшемся диалоговом окне Property Pages выбери-
End If те вкладку Buttons. Щелкните кнопку Insert Button и
End Sub в текстовом поле Key введите уникальное имя, при-

2
РАБОТАЕМ ГРАМОТНО

своенное изображению в элементе управления Toolbar


ImageList. Каждая кнопка с изображением должна StatusBar
иметь то же свойство Key, что и соответствующее
ProgressBar
изображение в компоненте ImageList. Каждая кнопка
без изображения, например tbrSeparator или TreeView
tbrPlaceholder, не должна иметь свойства Key. ListView
Шаг 3. В событии Load для формы установите связь
ImageList
элементов управления ImageList и Toolbar:
Set ToolBar1.ImageList = ImageList1 Slider
Шаг 4. Присвойте изображения кнопкам на пане- ImageCombo
ли инструментов: Microsoft Windows Common Animation
Dim myButton as Variant Controls-2
UpDown
For Each myButton in ToolBar1.Buttons
MonthView
If myButton.Key <> Empty Then
myButton.Image = myButton.Key DTPicker
' если значение свойство Key имеет FlatScrollBar
' какой-либо смысл, используйте его Microsoft Windows Common CoolBar
' для описания и текста подсказки Controls-3
myButton.Description = myButton.Key
Microsoft MAPI Controls MAPISession
myButton.ToolTipText = myButton.Key
End If MAPIMessages
Next Microsoft Data Bound List Controls DBList
DBCombo
Совет 187.
Microsoft DataList Controls DataList
Загрузка элементов управления ActiveX
Для использования элементов управления ActiveX, DataCombo
поставляемых с VB 5.0/6.0, необходимо добавить их Microsoft Direct Animation Media PathControl
к комплекту инструментальных средств Toolbox. Controls
Шаг 1. В меню Project выберите команду Com- StructuredGraphicsControl
ponents или щелкните правой кнопкой мыши панель
SpriteControl
инструментов для вызова диалогового окна Com-
ponents. SequencerControl
Шаг 2. Элементы, приведенные в этом диалоговом Microsoft Internet Controls WebBrowser
окне, включают все зарегистрированные встроенные ShellFolderViewOC
объекты, проектировщики и элементы управления
ActiveX.
Шаг 3. Установите флажок, находящийся слева от Подробнее о новых и усовершенствованных эле-
имени элемента управления, который вы хотите до- ментах управления, поставляемых вместе VB 6.0, см.
бавить. КомпьютерПресс № 1’99, стр. 154.
Шаг 4. Щелкните OK для закрытия диалогового
окна Components. Теперь все выбранные элементы Совет 188.
управления ActiveX появятся в комплекте инструмен- Использование типа Date
тальных средств Toolbox. с источником данных ADO
Такая процедура очень проста, если вы знаете точ- Первое, что приходит в голову при работе с дата-
ное имя добавляемого элемента управления. Пробле- ми в VB, — использовать переменную типа Date. Од-
ма возникает тогда, когда элемент, приведенный в нако в действительности такой подход оказывается
диалоговом окне Components, содержит несколько неверным, если вы имеете дело с датами Null, по-
компонентов или его название отличается от имени лучаемыми из источника данных ADO. Причина
компонента. Здесь вам поможет приведенная ниже заключается в том, что поведение внутреннего типа
таблица c перечнем элементов управления ActiveX, данных Date отличается от типа данных adDate
поставляемых с VB 5.0/6.0: ADO.
Чтобы увидеть эту разницу между Date и adDate,
МАРТ 1999

Элемент диалогового окна Имя компонента внимательно изучите следующий код (для VB6 не за-
Components будьте установить ссылку Microsoft ActiveX Data
Microsoft Windows Common TabStrip Objects Recordset 2.0 Library, но то же самое верно и
Controls для Microsoft ActiveX Data Objects 2.0 Library):

3
РАБОТАЕМ ГРАМОТНО

Private Sub Date_handling() Например, AppPath(“test.txt”) будет правильно до-


Dim lDate As Date бавлять имя файла независимо от того, в каком ката-
Dim lDateVar As Variant логе находится приложение.
Dim lRs As ADOR.Recordset
' Совет 190. Экспорт содержимого элемента
' инициализация управления Grid в текстовый файл
Set lRs = New ADOR.Recordset Здесь приводится подпрограмма, которая использу-
lRs.Fields.Append "MyDate", adDate, , ется для экспорта содержимого элементов управле-
adFldIsNullable ния MSGrid или MSFlexGrid в ASCII-файл неограничен-
lRs.Open ного размера. В качестве разделителя вы можете за-
lRs.AddNew давать любой нравящийся вам символ. Кроме того, у
lRs!MyDate = Date вас есть возможность указывать символ, в который
MsgBox lRs!MyDate будет заключаться содержимое каждой ячейки. Ис-
' пользуя, например, следующий вызов подпрограммы,
' хранение даты вы заключите содержимое ячеек в двойные кавычки:
lDate = lRs!MyDate GridExport(grdEmployees, "c:\test.cvs", ",", Chr$(34))
lDateVar = lRs!MyDate А так выглядит сама подпрограмма:
' Public Sub GridExport(GridToExport As Object, _
' установка даты FileName As String, Optional Delimiter As Variant, _
'lDate = Null ' этот оператор не работает Optional EncloseStrings As Variant)
lDateVar = Null ' этот оператор будет работать ' GridToExport -- имя экспортируемого элемента
' ' управления MSGrid или MSFlexGrid;
lRs!MyDate = lDateVar ' FileName -- полное имя файла, куда экспортируется
'lRs!Update ' содержимое сетки;
lRs.Close ' Delimiter -- символ-разделитель (необязательный
End Sub ' параметр, по умолчанию используется Tab);
Переменная типа String — тоже не лучший вариант, ' EncloseStrings -- символ, в который заключается
поскольку строковая переменная Null не является ' содержимое каждой ячейки (необязательный
представлением даты Null. К сожалению, согласно ' параметр, по умолчанию ничего не используется)
установке, используемая по умолчанию в DataEnvi- Dim iNumRows As Integer
ronment в VB6, при перемещении поля Date с помо- Dim iNumCols As Integer
щью метода drag-and-drop на форму помещается эле- Dim iFileNumber As Integer
мент управления TextBox. '
Таким образом, чтобы получить правильное внут- If IsMissing(Delimiter) Then
реннее представление даты, следует использовать Delimiter = vbTab
переменную типа Variant. End If
If IsMissing(EncloseStrings) Then
Совет 189. EncloseStrings = ""
Правильная обработка обратной косой черты End If
при использовании свойства App.Path iFileNumber = FreeFile
Свойство App.Path может использоваться для полу- Open FileName For Output As #iFileNumber
чения пути к текущему исполняемому файлу прило- For iNumRows = 0 To GridToExport.Rows - 1
жения. Будьте, однако, осторожны, так как при этом GridToExport.Row = iNumRows
возможен небольшой «ляп». Если приложение выпол- For iNumCols = 0 To GridToExport.Cols - 1
няется в корневом каталоге, то в конце пути добав- GridToExport.Col = iNumCols
ляется обратная косая черта. Однако если приложе- ' если это не первый столбец, то
ние выполняется в каком-либо другом каталоге, то ' перед значением ставится разделитель
обратной косой черты на конце не окажется. Исполь- If iNumCols > 0 Then
зование следующей функции поможет решить дан- Print #iFileNumber, Delimiter;
ную проблему: End If
Public Function AppPath(sFileName As String) As String Print #iFileNumber, EncloseStrings & _
If Right$(App.Path, 1) = "\" Then GridToExport.Text & EncloseStrings;
AppPath = App.Path & sFileName Next iNumCols
МАРТ 1999

Else Print #iFileNumber, ""


AppPath = App.Path & "\" & sFileName Next iNumRows
End If Close #iFileNumber
End Function End Sub