- •Form2.Show
- •Integer ‘целое число со знаком от –32 768 до 32767
- •Interval – 1000 (время, в миллисекундах, через которое таймер срабатывает, если конечно включен). Таймер будет срабатывать каждые 1000 мск, т.Е. Каждую секунду, как в нормальных часах.
- •InputBox("сообщение", "заголовок окна", "данные по умолчанию", расстояние между левой границей экрана и левым краем экрана,то же для верхней границы, "имя Help-файла" , номер раздела Help-файла)
- •Input #номерФайла, списокПеременных
- •15,"Пятнадцать" #true#,#2004-07-20#
- •Shell ("путь до файла программы", "вид окна, в котором откроется программа")
- •Private Sub Command1_Click() Combo1.AddItem Combo1.Text End Sub
- •Массив - это сколько угодно значений, объединенных одним именем.
- •Объект.PopupMenu имяменю, флаг, позицияX, позицияY, выделеннаястрока
- •Form1.PrintForm
- •CommonDialog1.ShowOpen
- •Dim Name As String Dim Kolichestvo As Long Dim Cost As Single
CommonDialog1.ShowOpen
Раз и готово. Теперь, запуская программу и нажимая кнопку Command1, мы тем самым открываем диалоговое окно Open. И можем радостно шоркаться по дискам, папкам и файлам. Можно даже папку создать. Но, никакого файла это окно не откроет, сколько на OK не жми. Поскольку для работы окна нам надо написать программный код. Подумаем, какой программный код мы можем написать. Во-первых, нам надо, чтобы окно называлось так как мы хотим, а не как хочет Bill Gates. Для того, чтобы поменять название диалогового окна на твое собственное, можно использовать свойство.DialogTitle приблизительно так: CommonDialog1.DialogTitle = "Загрузить текстовой файл" Во-вторых, сейчас наше диалоговое окно показывает все файлы. А поскольку юзер имеет привычку тыкать во все файлы без разбора, надо ему эту возможность ограничить. Чтобы юзер случайно не пытался загружать графический файл в текстовое поле или наоборот, надо заставить наше окно показывать только те файлы, которые может корректно загружать наша программа. Для этого у нашего объекта CommandDialog есть свойство .Filter, которое и позволяет нам показывать в диалоговом окне файлы, соответствующие шаблону. Поскольку работать мы будем с текстовыми файлами, то и открывать надо именно их. Текстовые файлы имеют раширение, к примеру, .txt, или dat. Поэтому перед открытием окна мы должны написать например такое: CommonDialog1.Filter = "Текстовые файлы (*.txt)|*.txt" Как видишь, опции фильтра - строковые данные, взятые в кавычки. Они разделены вертикальной черточкой. Слева от черты - то что выведется в окне, т.е. то, что будет видеть юзер в диалоговом окне, а справа - указан шаблон, по которому происходит фильтрация. Указать здесь можно, что угодно, вплоть до конкретного файла. Теперь, допустим, мы хотим показать несколько типов файлов. Добавим, например, в наш фильтр файлы .dat. Тогда слева от вертикальной черты, дописываем как угодно информацию о новом формате, а справа, через точку с запятой дописываем новый шаблон: CommonDialog1.Filter = "Текстовые файлы (*.txt) Файлы данных (*.dat)|*.txt;*.dat" Теперь наше окно будет показывать оба типа файлов одновременно. И в выпадающем списке в диалоговом окне оба типа файлов будут на одной строчке. А вот если мы хотим предоставить юзеру право выбора, какие файлы ему просматривать, .dat или .txt, и чтобы они находились на разных строчках в выпадающем окне, надо написать следующее: CommonDialog1.Filter = "Текстовые файлы (*.txt)|*.txt|Файлы данных(*.dat)|*.dat" Здесь мы пишем пояснение для первого типа файла, отделяем вертикальной чертой, пишем первый шаблон, снова отделяем вертикальной чертой, затем пишем пояснение для второго типа, отделяем вертикальной чертой, пишем второй шаблон. В это случае, наши типы файлов в диалоговом окне будут в выпадающем списке на разных строчках и пользователь сможет выбрать, какие файлы будет показывать диалоговое окно, .dat или .txt. В-третьих, нам надо передать полный путь и имя файла в инструкцию Open (хочешь не хочешь, а файл придется открывать обычным оператором Open). Нет ничего проще. Eсть свойство .FileName, которое принимает значение полного пути + имя файла, то есть все, что нужно для оператора Open: Open CommonDialog1.FileName For Input As #F Далее организуем цикл Do...Loop (объявив необходимые переменные) и считываем тeкстовой файл в Text1. Вот что у нас должно приблизительно получиться в итоге: Option Explicit Private Sub Command1_Click() Dim F As Long Dim Stroka As String Text1.Text = "" CommonDialog1.Filter = "Текстовые файлы (*.txt) Файлы данных (*.dat)|*.txt;*.dat" CommonDialog1.ShowOpen F = FreeFile Text2.Text = CommonDialog1.FileName Open CommonDialog1.FileName For Input As #F Do While Not EOF(F) Line Input #F, Stroka Text1.Text = Text1.Text & Stroka Loop Close #F End Sub Радостно потирая руки запускаем нашу фигню. Вроде все работает. Однако если мы внимательно проанализируем код и работу диалогового окна, то в результате прийдем к неутешительному выводу: наша программа корректно работает только в одном-единственном случае - когда файл выбран (поле File Name (Имя файла) - не пустое) и юзер нажал кнопку Open (то же самое, что и при двойном щелчке по имени файла). То есть, когда все случилось удачно, путь и имя файла есть, после закрытия окна они передаются в оператор Open и все происходит как по маслу. Что же происходит в менее благополучных случаях: - юзер файл не выбрал, ну забыл, (поле File Name (Имя файла) - пустое), но тем не менее жмакает кнопку Open. Тогда диалоговое окно просто не закрывается, а ждет чего-нибудь более рационального. Наша программа ни взад, ни вперед. Тогда юзер плюет на открытие файла, решает, что лучше написать в Text1 новый текст, чем грузить старый файл (тем более, что не задалось) и естественно жмет кнопку Cansel. И в результате программа не получает имени файла, т.к. диалоговое окно передает в оператор Open пустую строку. Наш оператор Open, естественно,ничего открыть не может. Возникает ошибка "Run-time error 75. Ошибка доступа пути или файла". Фатал эррор. Таких бяк быть не должно.
Поэтому нам надо первым делом отследить нажатие пользователем кнопки Cansel. Для этого у нашего объекта CommonDialog есть свойство .CanselError. Его можно устанавливать и в окне свойств, но мы сделаем это программно. Работает оно так. Если значение свойства .CanselError равно True, то при щелчке мышью по кнопке Cansel в диалоговом окне всегда возникает ошибка. По умолчанию свойство .СanselError=False, т.е ошибка не возникает. То есть, иными словами, если мы поставим свойство .CanselError в состояние True, то показателем того, что юзер нажал кнопку Cansel является именно возникновение ошибки. Нам остается ее только отследить и грамотно обработать. Без установки и обработки этой ошибки отследить нажатие кнопки Cansel довольно затруднительно. Правда иногда в примерах или если программой пользуется сам разработчик, который заведомо не будет хулиганить и нажимать все кнопки правильно, для упрощения кода применяется такой прием. В большинстве случаев, при нормальном открытии файлов свойство .Flags возвращает значение 1024, а при нажатии кнопки Cansel - 0. Исходя из этой сомнительной посылки, можно взять операторы открытия файла в такой оператор If: If CommonDialog1.Flags = 1024 Then Операторы открытия и считывания файла End If Тогда ошибок открытия файла не возникнет, и в принципе все будет работать, кроме отдельных случаев, типа, когда наш предприимчивый юзер не удовлетворился выбранным именем файла и начал редактировать это имя в поле File Name. В результате этого может получится так, что в поле File Name будет записано имя несуществующего файла. Тогда свойство .Flags хоть и возвратит число 1024, но оператор Open открыть несуществующий файл не сможет, и все равно возникнет ошибка. Да мало-ли чего может натворить юзер. Поэтому здесь мы этот рабочий прием использовать не будем. Вообще свойство .Flags - очень большое и важное свойство. С его помощью можно управлять внешним видом окна, его поведением и собственно работой. Для управления работой разных диалоговых окон существует множество констант, каждая из которых задает окну какое-либо свойство. Эти константы можно посмотреть в меню VB - кнопка "Проводник объектов". Константы могут быть использованы либо в виде константы (что более понятно в коде), либо как число - десятичное или шестнадцатеричное. Если надо использовать несколько констант, то они записываются в одном операторе через логическое ИЛИ - Or. Например, чтобы диалоговое окно контролировало, выбрал ли юзер файл из существующих и одновременно контролировало правильность пути до файла, надо написать следующее: CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNPathMustExist Все константы мы перебирать не будем, а будем говорить лишь о самых необходимых в нашем нелегком деле. Вот некоторые, применительно к окнам Open и Save As. cdlCancel = 32755 (&H7FF3) - выбрана кнопка Cansel cdlInvalidFileName = 20477 (&H4FFD) - имя файла неправильно cdlOFNFileMustExist = 4096 (&H1000) - позволяет выбирать файлы только из существующих cdlOFNNoChangeDir = 8 - устанавливает текущую директорию для последующих вызовов cdlOFNOverwritePrompt = 2 - спрашивает пользователя, если файл уже существует cdlOFNPathMustExist = 2048 (&H800) - юзер может вводить только правильные пути для файла Теперь мы можем написать правильный код для окна открытия и считывания текстовых файлов.
Option Explicit 'Объявим переменную для номера открываемого файла Dim F As Long Private Sub Command1_Click() 'объявим переменную, в которую мы будем считавать строки из файла Dim Stroka As String 'напишем оператор для отслеживания ошибки и в случае возникновения переходим по метке Cansel On Error GoTo Cansel 'установим, чтобы возникала ошибка при щелчке по кнопке Cansel CommonDialog1.CancelError = True 'установим фильтры для текстовых файлов CommonDialog1.Filter = "Текстовые файлы (*.txt) Файлы данных (*.dat)|*.txt;*.dat" 'установим свойство .Flags, которое не позволяет открывать несуществующие файлы CommonDialog1.Flags = cdlOFNFileMustExist 'напишем наше собственное название диалогового окна CommonDialog1.DialogTitle = "Загрузить текстовой файл" 'а вот теперь окно можно и открыть CommonDialog1.ShowOpen
'открываем файл и считываем его содержимое в Text1 F = FreeFile Text1.Text = "" Open CommonDialog1.FileName For Input As #F Do While Not EOF(F) Line Input #F, Stroka Text1.Text = Text1.Text & Stroka Loop Close #F 'файл считан 'выход из процедуры до ее завершения, чтобы не обрабатывалась ошибка, если ее нет Exit Sub Cansel: 'анализируем номер ошибки. Если нажата Cansel, выходим из процедуры If Err.Number = cdlCancel Then Exit Sub Else 'в противном случае, если возникла какая-то другая ошибка, выводим ее описание MsgBox Err.Description End If ' заканчиваем процедуру End Sub
Ну вот, мы сделали это. А теперь, как говорится, на основании вышеизложенного, справиться с окном сохранения файлов очень просто.
Диалоговое окно сохранения файлов Save As (метод ShowSave). |
В кнопке Command2 пишем код для сохранения текста в файле из Text1. Код у нас будет совершенно такой же, как и для окна Open, ну конечно файл надо открывать для записи, а не для чтения. Наш прием для отслеживания кнопки Cansel мы будем использовать во всех окнах. Кроме того, раз мы записываем файл, то теперь нам нет необходимости выбирать файл из существующих. Зато есть необходимость предупреждать юзера, что он можеть записать новый файл, уничтожив старый (при совпадении их имен). Для предотвращения этого ужаса присвоим свойству .Flags такую константу CommonDialog1.Flags = cdlOFNOverwritePrompt Тогда при попытке записать файл под уже существующим именем, Windows будет выводить предупреждающее окно. И наш код будет выглядеть следующим образом: Private Sub Command2_Click() F = FreeFile On Error GoTo Cansel1 CommonDialog1.CancelError = True CommonDialog1.Filter = "Текстовые файлы (*.txt) Файлы данных (*.dat)|*.txt;*.dat" CommonDialog1.Flags = cdlOFNOverwritePrompt CommonDialog1.DialogTitle = "Сохранить текстовой файл как..." CommonDialog1.ShowSave Open CommonDialog1.FileName For Output As #F Print #F, Text1.Text Close #F Exit Sub Cansel1: If Err.Number = cdlCancel Then Exit Sub Else MsgBox Err.Description End If End Sub
Диалоговое окно выбора цвета Color (метод ShowColor). |
Ну с этим окном все предельно просто. Мы просто открываем окно (используя приемы, описанные выше). У CommonDialog есть свойство .Color, которое и определяет выбранный пользователем цвет. Нам надо только его передать какому-нибудь объекту нашего проекта и готово. Например, чтобы изменить цвет фона нашей формы пишем: Form1.BackColor = CommonDialog1.Color Конечно и здесь есть кое-какие значения свойства .Flags. Их всего четыре: cdlCCFullOpen = 2 'выводит полное диалоговое окно с настройкой цветов cdlCCPreventFullOpen = 4 'выводит часть окна с цветами по-умолчанию и делает недоступной кнопку Define Custom Colors (определение настраиваемых цветов) cdlCCHelpButton = 8 'делает видимой кнопку Help cdlCCRGBInit = 1 'выводит часть окна с цветами по-умолчанию но кнопка Define Custom Colors (определение настраиваемых цветов) доступна для расширения окна Напишем код, который будет менять цвет фона в Text1: Private Sub Command3_Click() CommonDialog1.Flags = cdlCCRGBInit On Error GoTo Cansel CommonDialog1.CancelError = True CommonDialog1.ShowColor Text1.BackColor = CommonDialog1.Color Exit Sub Cansel: If Err.Number = cdlCancel Then Exit Sub Else MsgBox Err.Description End If End Sub Хочу заметить, что поменять название этого окна, как мы делали с окнами Open и Save As с помощью свойства .DialogTitle не удасться.
Диалоговое окно изменения вида шрифта Font (метод ShowFont). |
Одним оператором CommonDialog1.ShowFont, как мы делали раньше, открыть окно шрифтов не удастся. Это лишь вызовет ошибку 24574 - "No font exist" - "Нет существующих шрифтов". Это происходит потому, что для окна необходимо определить, какие шрифты ему показывать - экранные, принтерные или оба. Это определяют параметры свойства .Flags: CommonDialog1.Flags=cdlCFScreenFonts 'экранные шрифты CommonDialog1.Flags=cdlCFPrinterFonts 'принтерные шрифты CommonDialog1.Flags=cdlCFBoth 'оба вида шрифтов Кроме того полезны для использования следующие константы свойства .Flags: cdlCFForceFontExist= 65536 (&H10000) - вызов сообщения об ошибке при выборе несуществующего шрифта или стиля cdCFLimitSize = 8192 (&H2000) - ограничивает размер показываемых шрифтов с размера, заданного свойством .Min по размер, заданный свойством .Max. cdlCFEffects = 256 (&H100) - отображает дополнительные параметры форматирования - подчеркивание, перечеркивание цвет.
Заданные в диалоговом окне параметры должны быть обработаны программой. Для этого имя шрифта, его размер, стиль, цвет передаются из CommonDialog1 соответствующими свойствами в свойства соответствующего объекта. В нашем примере мы будем менять шрифт нашего текста в Text1:
Private Sub Command4_Click() On Error GoTo Cansel CommonDialog1.CancelError = True 'Установим флаги экранного шрифта, дополнительных параметров форматирования ' и включим ограничение размера шрифтов CommonDialog1.Flags = cdlCFScreenFonts Or cdlCFEffects Or cdlCFLimitSize 'установим вывод шрифтов размером от 10 до 16 CommonDialog1.Min = 10 CommonDialog1.Max = 16 'открываем окно CommonDialog1.ShowFont 'передаем свойства окна свойствам Text1 Text1.Font.Name = CommonDialog1.FontName Text1.Font.Size = CommonDialog1.FontSize Text1.Font.Bold = CommonDialog1.FontBold Text1.Font.Italic = CommonDialog1.FontItalic Text1.Font.Strikethrough = CommonDialog1.FontStrikethru Text1.Font.Underline = CommonDialog1.FontUnderline Text1.ForeColor = CommonDialog1.Color Exit Sub Cansel: If Err.Number = cdlCancel Then Exit Sub Else MsgBox Err.Description End If End Sub
Диалоговое окно установки параметров принтера и печати Print (метод ShowPrinter). |
Это окно открывается командой : CommonDialog1.ShowPrinter С помощью этого окна юзер может выбрать принтер, номера печатаемых страниц, а также число копий. Некоторые полезные константы для свойства .Flags: cdlPDPageNums = 2 - устанавливает или возвращает статус радиокнопки Pages (Делает ее доступной при использовании свойств .Min и .Max) cdlPDCollate = 16 (&H10) - устанавливает или возвращает статус галочки Collate cdlPDNoSelection = 4 - выключает радиокнопку Selection cdlPDSelection = 1 - устанавливает или возвращает статус радиокнопки Selection cdlPDAllPages = 0 - устанавливает или возвращает статус радиокнопки All Pages cdlPDPrintSetup = 64 (&H40) - выводит на экран SetUp принтера раньше, чем диалоговое окно Чтобы управлять ориентацией листа (горизонтальная печать или вертикальная) , надо явно передать константу ориентации из диалогового окна окна в объект Printer. Printer.Orientation = CommonDialog1.Orientation Если свойству .Flags задать значение cdlPDPageNums, а затем установить свойства .Min и .Max (Минимальное и максимальное количество печатаемых страниц, то в диалоговом окне станет доступно поле Pages. По умодчанию в него можно задать номера страниц с помощью свойств .FromPage (начальная страница печати) и .ToPage (конечная страница печати): CommonDialog1.Flags = cdlPDPageNums CommonDialog1.Min = 0 ' минимальное количество страниц CommonDialog1.Max = 10 ' максимальное количество страниц CommonDialog1.FromPage = 1 'начальная страница печати CommonDialog1.ToPage = 5 'конечная страница печати Можно также по умолчанию задать количество копий с помощью свойства .Copies: CommonDialog1.Copies = 3 Вот приблизительно, как может выглядеть код для печати содержимого нашего Text1: Private Sub Command5_Click() On Error GoTo Cansel CommonDialog1.CancelError = True CommonDialog1.Flags = cdlPDPageNums Or cdlPDCollate Or cdlPDNoSelection Or cdlPDAllPages CommonDialog1.Copies = 2 'количество копий по умолчанию CommonDialog1.Min = 0 CommonDialog1.Max = 10 CommonDialog1.FromPage = 1 CommonDialog1.ToPage = 2 CommonDialog1.ShowPrinter
Printer.Orientation = CommonDialog1.Orientation 'ориентация листа Printer.Copies = CommonDialog1.Copies 'количество копий Printer.Print Text1.Text Printer.EndDoc Exit Sub Cansel: If Err.Number = cdlCancel Then Exit Sub Else MsgBox Err.Description End If End Sub
А вообще, как наверно стало понятно из главы 13 (если ты ее читал), то работа с принтером - дело непростое. Попробуй, исходя из этого поэкспериментировать со свойством .Flags и прочими делами.
Вместо методов .ShowOpen, .ShowSave и т. д. можно использовать свойство .Action. Это свойство не соответствует по своим признакам свойствам, так как заставляет объект выполнять действие (открывать диалоговое окно). Таким образом, метод .ShowOpen аналогичен свойству .Action: оператору CommonDialog1.ShowOpen соответствует оператор CommonDialog1.Action = 1 оператору CommonDialog1.ShowSave соответствует оператор CommonDialog1.Action = 2 оператору CommonDialog1.ShowColor соответствует оператор CommonDialog1.Action = 3 оператору CommonDialog1.ShowFont соответствует оператор CommonDialog1.Action = 4 оператору CommonDialog1.ShowPrinter соответствует оператор CommonDialog1.Action = 5
Что такое стандартный модуль? |
Обычно
программа, состоит из более, чем одной
форм. Часто возникает необходимость
использовать содержимое переменной,
полученной в одной форме для обработки
в другой. Однако переменные, объявленные
в форме в разеле General доступны только
внутри этой же формы (контейнера). Для
того, чтобы нужные переменные, подпрограммы,
функции были доступны во всей программе,
во всех формах, их объявляют в стандартных
модулях.
Стандартный
модуль в физическом смысле представляет
собой файл с расширением .bas. Чтобы
добавить стандартный модуль в exe-проект,
надо в меню Проект (Project) щелкнуть по
команде Добавить Модуль (Add Module) - рис.
26.
Рисунок
26.
После
этого появиться окно добавления модуля
рис.27
Рисунок
27.
в
котором надо щелкнуть по кнопке Open
(открыть). После этого в окне проекта вы
увидите новую папочку Модули, в которой
появиться наш первый модуль Модуль1.
Хотя его имя, конечно, можно поменять в
нижнем окне свойств Рис 28.
Рисунок
28.
После
этого ты можешь щелкнуть по Модуль1 в
окне проекта и перед тобой откроется
окно модуля, такое же как и окно кода
формы. В отличие от формы, модуль не
имеет вида Объект,
в него нельзя встраивать никакие другие
объекты, так как он контейнером не
является. В него лишь можно записывать
код абсолютно также, как и в форму. В чем
же радость от модулей, поскольку мы
вроде бы пока обходились и без них.
Ну
во-первых, как уже было сказано выше,
объявленные в модуле переменные могут
быть доступны во всем проекте, во всех
его формах. Для этого переменная
объявляется в разделе General с ключевым
словом Public.
Например
Public RazmerMassiva As
Long
Такие
переменные называются глобальными
переменными и срок их жизни такой же,
как и у всего проекта (т.е. пока программа
не закрыта). При этом в формах объявлять
эту переменную уже не надо.
Напоминаю:
если не указывать тип переменной, то по
умолчанию она будет типом Variant, и
соответственно памяти под нее будет
выделено по-максимуму.
Во-вторых, раз
написанный модуль можно подключать к
другим проектам. Это особенно актуально,
когда ты пишешь процедуру, которую можно
будет использовать в дальнейшем. Поэтому
такие процедуры оформляются в виде
функций или подпрограмм в модулях и
могут быть вызваны из любого места любой
твоей программы. Такие подпрограммы
называются процедурами общего назначения.
Эти процедуры не привязаны ни к каким
событиям и работают только по вызову
из программы. С их помощью можно создавать
собственные функции и подпрограммы,
которые расширяют возможности языка
VB (pardon, последнее предложение само
выскочило, наверно из учебника
какого-нибудь).
В-третьих,
разбитый на модули код гораздо удобней
отлаживать и читать, поскольку программа
делиться на логические блоки, а это
деляет код программы яснее и понятнее.
Итак, мы можем создать в модуле три вида процедур:
Function (функция) - выполняет действия и возвращает значение (значение функции) - как правило одно, являющееся результатом этих действий (например вычисления) Sub (подпрограмма) - выполняет действия, но значения, ассоциированного со своим именем не возвращает, хотя может возвращать значения нескольких переменных. (например действия ввода-вывода, изменения свойств и т.п.). Property (свойство) - создает определяемые пользователем свойства. Применяется при создании классов и здесь рассматриваться не будет. Поговорим об этом, когда/если будем делать какой-нибудь контрол.
Процедуры типа Function - функция. |
Синтаксис процедуры Function следующий: Function имя функции (аргументы) As тип функции операторы, выполняющие вычисления End Function Как видишь, синтаксис функции напоминает процедуры обработки событий, с которыми мы работали ранее. Начинается все ключевым словом Function, затем пишется имя функции, которое мы сами придумываем, далее следуют аргументы (необязательно), которые функция будет обрабатывать и которые передаются при вызове функции из программы. Затем можно определить тип возвращаемого функцией значения (по умолчанию - Variant). Далее в теле функции следуют операторы, выполняющие действия. И затем функция закрывается оператором End Function. Смысл работы с функциями точно такой же, как и со встроенными функциями Visual Basic. Тебе надо вызвать функцию и передать в нее значения, с которыми она будет работать. Далее функция производит определенные операторами тела функции действия с этими значениями и сама принимает значение результата этих действий, которое далее используется в основном коде. Чтобы вызвать свою функцию, надо использовать оператор типа:
Text1.Text=Имя функции (значения, передаваемые в функцию)
Теперь, в качестве примера, давай создадим собственную функцию, которая будет возвращать количество слов в тексте. Начнем новый Exe-проект. На форму положим Text1, куда запишем текст, который будет анализировать наша функция. Кроме того нам понадобиться Label1, куда мы выведем возврашаемое функцией значение и кнопка Command1, которой мы будем вызывать нашу функцию. После того, как мы всю эту хрень запихнули на форму, добавим в наш проект стандартный модуль Module1 (как добавить - см. выше). Откроем его и начнем писать код. Сперва нам надо придумать имя для функции. Пусть это будет CountWords. Затем нам надо определить аргумент, с помощью которого мы передадим в функцию текстовую строку, которую наша функция будет анализировать. Пущай это будет Stroka. Поскольку у нас количество слов безумно большим не будет, определим тип нашей функции как Long. Вот теперь можно написать нашу первую строчку функции. Function CountWords(Stroka) As Long 'Далее мы объявляем три необходимых нам переменных. Ну x - это просто для цикла, где мы 'будем перебирать каждую буковку и искать пробелы. NumWords - это как раз переменная, в 'которую мы будем записывать количество слов. FlagSlovo - это флаг, благодаря которому мы 'отследим, было ли слово перед тем, как был найден пробел. Таким образом мы избежим 'неправильного подсчета слов из-за того, что слова могут быть написаны через несколько 'пробелов, а кроме того сама строка может начинаться с пробела. Dim x As Long Dim NumWords As Long Dim FlagSlovo As Boolean 'Организуем цикл по количеству символов в строке ( Len(Stroka)) For x = 1 To Len(Stroka) 'Теперь, если значение символа - не пробел (код пробела - 32), присваиваем нашему флагу значение True If Mid(Stroka, x, 1) <> Chr(32) Then FlagSlovo = True 'А далее анализируем: если у нас нашелся пробел и значение флага True, значит можно считать, что этим пробелом 'закончилось слово и мы увеличиваем наш счетчик слов NumWords на единицу и сбрасываем ' значение флага FlagSlovo на False If Mid(Stroka, x, 1) = Chr(32) And FlagSlovo = True Then NumWords = NumWords + 1 FlagSlovo = False End If Next x 'А далее, поскольку последнее слово может не заканчиваться пробелом, делаем проверку флага и если ' его значение True увеличиваем значение счетчика еще на единицу. If FlagSlovo = True Then NumWords = NumWords + 1 'Далее мы тупо присваиваем значение счетчика нашей функции. CountWords = NumWords 'Вот и все. Простая функция с одним аргументом готова. End Function
Теперь нам как-то надо использовать нашу замечательную функцию. Сохраним проект и закроем модуль. Вернемся к нашей форме. В процедуре Form_Load присвоим Text1 какое-нибудь значение, чтобы нашей функции было с чем работать Private Sub Form_Load() Text1.Text = "Microsoft Visual Basic 6 Professional Edition " _ & "- это мощная система программирования, позволяющая быстро и" _ & " эффективно создавать приложения для Microsoft Windows и Microsoft Windows NT " End Sub Затем в процедуре кнопки Command1 напишем оператор вызова функции и присваивания его значения Label1: Private Sub Command1_Click() Label1.Caption = CountWords(Text1.Text) End Sub Теперь при нажатии кнопки Command1 мы в лейбле будем получать количество слов текстбокса. Конечно, как и в любой функции, можно вместо Text1.Text использовать переменную или просто написать любой текст. Естествено, в функцию можно передать несколько аргументов. Исключительно для иллюстрации: мы можем находить, например, количество слов, начиная с n-ого символа. Для этого в модуле в объявление функции надо добавить аргумент, обозначающий номер символа (назовем его Position): Function CountWords(Stroka, Position) As Long и изменить наш цикл, который будет работать не с x=1, а x=Position For x = Position To Len(Stroka) А в форме, соответственно, вызов функции для подсчета слов , например, с 30-ой позиции, будет выглядеть Label1.Caption = CountWords(Text1.Text, 30)
Это будет уже функция с двумя аргументами. Ну принцип, я думаю, ясен.
Процедуры типа Sub - подпрограмма. |
Синтаксис процедуры Sub следующий: Sub имя процедуры(аргументы) операторы, выполняющие действия End Sub Здесь, также как и в функции, имя процедуры мы придумываем сами, аргументы - это данные, которые мы передаем в подпрограмму и с которыми она будет работать. Однако, в отличие от функции, подрограмма не возвращает значение - результат своей работы, а сама производит какие-либо операции. Напишем подпрограмму, которая будет записывать в файл текст из Text1 нашей формы. Чтобы не путаться, добавим в наш проект еще один модуль Module2. Имя нашей процедуры будет AddFileText. В качестве аргументов мы должны передать в подпрограмму имя файла (NameF) и собственно текст (MyText). Пишем во втором модуле
Sub AddFileText(NameF As String, MyText As String) Dim F As Long F = FreeFile Open App.Path & "\" & NameF For Append As #F Print #F, MyText Close #F End Sub
Здесь все должно быть понятно - просто открываем файл с именем NameF и записываем содержимое переменной MyText. Положим на нашу форму вторую кнопку Command2 и в ее процедуре напишем оператор вызова подпрограммы для записи в файл bbb.txt текста из Text1:
Private Sub Command2_Click() AddFileText "bbb.txt", Text1.Text End Sub Теперь, при нажатии кнопки Command2, у нас в файл bbb.txt будет дописываться текст из текстбокса.
Ключевое слово ByVal. |
В вышеприведенном примере никаких изменений с передаваемыми значениями аргументов не происходило. И произойти не могло, потому, что мы передали конкретное значение, а не переменную. Такая передача данных называется передача по значению. Однако можно ведь использовать и переменные. Такой способ передачи - по ссылке, может привести к тому (не в нашем случае), что в процессе выполнения подпрограммы значение переменных изменится и в программу вернутся уже измененные значения. Иногда это даже нужно, а иногда это наоборот может привести к ошибке. Чтобы избежать изменения значения переменной в процедуре, используется ключевое слово ByVal. При его использовании VB сохраняет изначальное значение и после окончания процедуры возвращает первоначальное значение переменной, даже если оно было изменено в ходе работы подпрограммы. Синтаксис использования этого ключевого слова в подпрограмме таков: Sub AddFileText(ByVal NameF As String, MyText As String) Скачать исходник можно вверху страницы.
Справочно: Процедуры типа Property - свойство. |
Помимо процедур типа Function и Sub существуют процедуры типа Property. С их помощью можно определять свойства класса. Поскольку использование классов - дело будущего, то на процедурах Property мы сегодня останавливаться не будем.
Пользовательские типы данных. |
Иногда, при использовании некоторых операторов, API-функций, а также просто для своих нужд необходимо создавать собственные типы данных. Часто их называют структурами. По своей сути структура - это как бы одномерный массив , который мы запихиваем в одну переменную. Но в него могут входить данные разных типов. Создание собственного типа данных осуществляется с помощью инструкции Type, который используется в секции General кода формы. Например, для какого-нибудь условного прайса нам нужно хранить следующие данные: Name - наименование товара Kolichestvo - количество товара Cost - цена товара С одной строны мы можем просто объявить эти три переменные с необходимым нам типом и использовать их каждую в отдельность по необходимости:
