В начало
Статьи
Библиотека
Разное

Вот здесь - новый сайт, заходите немедленно!

kift - Коллекция Интересных Фактов и Теорий

А тут можно поболтать и побухтеть, милости просим:

kift - неизданное

Самоучитель Visual Basic

13. Добавление окон-заметок. Наборы и циклы
14. Циклы VB
15. Основы отладки программ. Пользовательская процедура

12.  Создание формы для вывода справки.

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

Добавьте к проекту еще одну форму (Конечно, вначале следует запустить VB и открыть проект).

  • Назовите ее frmHelp, свойство BorderStyle измените на 4 – Fixed ToolWindow (Фиксированное ОкноИнструментов).

  • Установите свойство BackColor как ToolTip (Подсказка), как показано на рисунке, а свойство ForeColor как ToolTip Text(Текст Подсказки), при этом форма справки цветом будет напоминать стандартные всплывающие подсказки Windows.
   
  • Сохраните проект.

Не забудьте правильно указать каталог, в который следует поместить новую форму – C:\VB Begin.

На этом визуальное проектирование формы закончено, далее мы будет программировать в коде.

Давайте представим, как будет работать форма, на которой должен отображаться текст справки.

  • Форма при загрузке должна считывать файл справки и «запоминать» его содержимое.

  • Форма должна самостоятельно подгонять свои размеры под размеры текста.

  • В нашем простейшем случае больше ничего не нужно.

Начнем мы с того, где форма будет «запоминать» текст справки.

  • Откройте окно кода (окно визуального редактирования можете совсем закрыть, оно нам уже не понадобится).

  • Убедитесь, что в левом списке выбрано « General», а в правом – « Declarations» (Объявления).

Вы находитесь в так называемой области глобальных объявлений кода.

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

  • Проверьте, что вверху имеется надпись Option Explicit, если ее нет – внесите вручную.

  • Внесите (ниже) строку:

Dim strHelpText As String

Это – объявление переменной.

Переменная – именованное хранилище определенной информации, из этого хранилища можно считывать информацию, и в него можно записывать.
  • Для того, чтобы переменной можно было пользоваться, ее надо создать (объявить). Это делается посредством слова Dim(Объявить). Затем находится имя переменной, а затем – указание типа переменной (вспомните о типах параметров).

  • Мы расположили переменную в области глобальных объявлений, чтобы она была доступна всей форме. Если бы мы написали так:

Public strHelpText As String

то эта переменная была бы доступна всему проекту (но нам этого не требуется). То есть, первое слово объявления характеризует область видимости переменной ( Public – англ. Общий, Публичный).

  • Выше нами объявлена переменная уровня модуля,ее смогут использовать все процедуры, находящиеся в этом модуле (иными словами, эта переменная видна в этом модуле и только в нем).

  • Типпеременной String (Строка) выбран нами потому, что он как раз и предназначен для хранения текста.

Кроме типа String, VB поддерживает следующие основные типы переменных:

  • Числовые типы в свою очередь подразделяются на целые и вещественные типы.

  • Целые типы – Byte (Байт), Integer (Целое) и Long (Длинное). Переменные этих типов могут содержать целые, как положительные, так и отрицательные числа (кроме типа Byte, предназначенного для хранения только положительных чисел). Разница между подтипами – в максимальной величине числа, которое может «поместиться» в переменную. Тип Byte может хранить число от 0 до 255, тип Integerпримерно от -32000 до +32000, а тип Long – примерно от -2000000000 до +2000000000.

  • ВещественныеSingle (Одинарный, Простой) и Double (Двойной). Могут содержать числа с дробной частью. Разница – как в максимальной величине хранимого числа, так и в максимальной точности. Тип Single позволяет точность около 8 знаков после запятой, а Double – около 16 знаков.

  • Тип Date (Дата) – разновидность числового типа. Такие переменные хранят значение даты и времени.

  • Логический (булевский) тип один, он так и называется – Boolean (Булевский). Переменные этого типа могут принимать лишь два значения – True (Истина) и False (Ложь). С логическим типом Вы уже встречались при обзоре условных операторов, единственное предназначение переменных этого типа – прямая или косвенная проверка условий.

  • Строковый (текстовый) тип – уже известный Вам String (Строка). Строковая переменная может содержать примерно до 2000000000 символов!

  • Уникальный тип, присущий VB – тип Variant. Переменная такого типа – универсальное хранилище, которое может содержать данные всех перечисленных выше типов, специальные значения и так называемые объектные данные. Одна и та же переменная типа Variant в процессе выполнения программы может поочередно принимать данные разных типов.

Есть особенность в объявлении типа Variant. Объявление может выглядеть так:

Dim var As Variant

  • а может и так:

Dim var

так как тип Variant считается основным в VB, и используется по умолчанию (то есть – без специальных указаний).

Недостаток типа Variant в том, что обилие переменных такого типа могут замедлить работу программы.

Теперь займемся чтением текста справки из файла. Логично делать это во время загрузки формы-справки.

Создайте обработчик Form_Load. (Не забудьте, сейчас Вы работаете с формой frmHelp).

Нам потребуется вспомогательная переменная целого типа.

Внесите в обработчик события строку:

Dim intW As Integer

Внутри процедуры объявляется переменная, доступная лишь внутри этой процедуры (частная), поэтому можно не заботиться об уникальности ее имени.

  • Не следует, чтобы имя внутренней переменной совпадало с именем глобальной переменной или переменной уровня модуля, могут быть сложности. То есть, если в разделе глобальных объявлений модуля есть переменная по имени, предположим, varQ, то в составляющих этого модуля не следует объявлять другие переменные с именем varQ. Если Вы это сделаете, Вы обязаны тщательно контролировать ситуацию и предвидеть возможные конфликты имен.

Следующей строкой внесите:

intW = FreeFile

FreeFile – функция VB, используемая при работе с файлами.

Функция– логически завершенный участок программы, выполняющий некоторые действия и оповещающий вызвавший функцию код о результатах своей деятельности. Это оповещение происходит при помощи того, что функция возвращает некоторое значение.

  • Так, функция FreeFile (СвободныйФайл) возвращает число, которое используется VB для дальнейшей работы с другими файловыми функциями. Во внесенной нами строке возвращенное значение присваивается переменной intW (и сохраняется в ней для дальнейшего использования).

Далее внесите строку:

Open App.Path & "\Help.txt" For Input As intW

Слово Open (Открыть) приказывает программе прочитать файл и начать работу с ним.

  • При этом следует придерживаться синтаксиса:

Open <путь_и_имя_файла> For <режим_доступа> As <число>

  • Выражение <путь_и_имя_файла> нам уже знакомо, в данном случае это App.Path & “\Help.txt”. После слова For (Для) обязательно указывается тип доступа к файлу. VB различает следующие основные типы доступа:

Слово

Пояснение

Input (Ввод [из файла в программу])

Последовательное чтение данных.

Output (Вывод [из программы в файл])

Последовательная запись с начала файла (старые данные удаляются).

Random (Произвольный)

И чтение и запись.

  • Слово As (Как) предваряет число, определенное нами с помощью функции FreeFile.

Если вы пишете в файл, используя тип доступа Output или Random, а указанный файл не существует – он будет создан.

Далее произведем чтение из файла:

strHelpText = Input(LOF(intW), #intW)

Здесь мы используем две файловые функции VB: Input (как видите, она применяется в другом контексте, нежели слово Input в составе предыдущей строки) и LOF (от англ. LenghtOfFile – ДлинаФайла).

  • Функция LOF возвращает длину файла, предварительно открытого оператором Open (длина в байтах, тип возвращаемого значения Long). Параметр функции – номер файла, возвращенный функцией FreeFile.

Если надо определить длину файла, не открывая его, используется функция FileLen.

  • Функция Input возвращает строку, содержащую значения из открытого файла (открытого в режиме Input). Синтаксис функции:

Input (<число_символов>, <номер_файла>)

  • Параметр <число_символов> получен из функции LOF, а <номер_файла> – из функции FreeFile.

  • В результате значение присваивается определенной нами заранее строковой переменной strHelpText

Корректная работа с файлами подразумевает их закрытие по окончании работы:

Close intW

Слово Close (Закрыть) приказывает VB завершить работу с файлом под номером intW.

Таким образом, код обработчика события Form_Load примет вид:

Private Sub Form_Load()
Dim intW As Integer
intW = FreeFile
Open App.Path & "\Help.txt" For Input As intW
strHelpText = Input(LOF(intW), #intW)
Close intW
End Sub

Обратите внимание на то, как используется функция LOF. Более понятная эквивалентная запись:

Private Sub Form_Load()
Dim intW As Integer
Dim lngValue As Long
intW = FreeFile
Open App.Path & "\Help.txt" For Input As intW
lngValue = LOF (intW)
strHelpText = Input(lngValue, #intW)
Close intW
End Sub

То есть, VB сам, «втайне» от программиста как бы создает переменную, куда читает значение функции, и затем подставляет эту переменную вместо функции. Но наше предыдущее решение – подставить в строку саму функцию – проще, и поэтому предпочтительнее.

Сделаем еще одно информационное отступление и поясним упрощенную схему именования VB.

  • Имена переменных VB могут состоять из букв английского алфавита, цифр и знаков подчеркивания “_”. Начинаться имя должно с буквы.

  • Допускается, но не рекомендуется использование русских букв (могут быть проблемы при работе программы в версиях Windows, не поддерживающих русский язык).

  • То есть, вполне законными будут имена « Q», « kkk» и тому подобные.

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

  • Рекомендуется к применению (и используется в этой книге) схема именования с использованием префиксов – приставок к именам, несущим информацию о типе или назначении переменной. Собственно имя также должно быть осмысленным.

  • Вспомните имя первой формы Вашего проекта: frmAbout. Префикс frm – сокращение от слова Form (Форма), слово About переводится как «О [чем-то]». Согласитесь, что это имя куда как более наглядно, нежели имя Form1, созданное VB по умолчанию.

Первая задача – чтение содержимого файла справки – нами выполнена успешно, теперь следует решить задачу подгонки размеров формы под размеры текста.

Мы используем методы, определяющие размеры выводимого текста. Эти методы присущи формам и контролам PictureBox, имена методов TextWidth (ТекстаШирина) и TextHeight (ТекстаВысота). Как параметр эти методы принимают строку, содержащую текст и возвращают размеры текста.

Создайте обработчик события Form_Resize.

Сперва объявим в этом обработчике две переменные для сохранения размеров текста:

Dim varWidth

Dim varHeight

Теперь определяем размеры текста:

varWidth = Me.TextWidth(strHelpText)

varHeight = Me.TextHeight(strHelpText)

Вспомните – в переменную strHelpText мы уже считали содержимое справочного файла.

  • И соответственно изменяем размеры формы:

Me.Move Me.Left, Me.Top, varWidth, varHeight

Метод Move (Двигать) присущ формам и некоторым контролам. Он передвигает объект в положение, указанное параметрами. Применение метода Move – альтернатива способу, рассмотренному нами раньше, при построении формы frmPhoneBook. Синтаксис:

<объект>.Move <левая_граница> [, <верхняя_граница>, <ширина>, <высота>]

  • Обязательно указывается <левая_граница>, остальные параметры могут быть опущены, тогда форма переместится, не изменяя размеров.

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

Теперь следует очистить форму.

Me.Cls

Метод Cls (от англ. ClearScreen – ОчиститьЭкран) присущ многим объектам. Он уничтожает предыдущий текст и рисунки и принуждает производить следующий вывод «с начала» – с левого верхнего угла.

  • Потом, когда форма будет закончена, не забудьте «закомментировать» эту строку и пронаблюдать, в чем разница.

  • И, наконец, производим вывод текста:

Me.Print strHelpText

Метод Print (Печатать) производит вывод текста, указанного в качестве параметра.

Код должен выглядеть примерно так:

Private Sub Form_Resize()
Dim varWidth
Dim varHeight
varWidth = Me.TextWidth(strHelpText)
varHeight = Me.TextHeight(strHelpText)
Me.Move Me.Left, Me.Top, varWidth, varHeight
Me.Cls
Me.Print strHelpText
End Sub

Как видите, происходит множество обращений к одному и тому же объекту Me. Вы можете использовать конструкцию With.

Внимание! Методы Print, Circle, Line и PSet «не поддаются» упрощению в блоке With, для них всегда должен указываться объект.

Преобразуйте код, используя конструкцию With.

Вот что должно получиться:

Private Sub Form_Resize()
Dim varWidth
Dim varHeight
With Me
varWidth = .TextWidth(strHelpText)
varHeight = .TextHeight(strHelpText)
.Move .Left, .Top, varWidth, varHeight
.Cls
Me.Print strHelpText
End With
End Sub

Сделайте форму frmHelp стартовым объектом.

  • Запустите ее.

Как видите, текст немного обрезается справа и снизу. Это из-за того, что при изменении размеров учитывается высота заголовка и ширина границы окна.

  • Внесите поправочные коэффициенты:

varWidth = .TextWidth(strHelpText) * 1.05

varHeight = .TextHeight(strHelpText) * 1.1

  • Проверьте, как выглядит форма.

  • Поэкспериментируйте с методом Cls (попробуйте «закомментировать» строку с вызовом этого метода).

  • А теперь запустите форму, и щелкните один раз на панели VB, чтобы наша форма «скрылась» под панелями языка.

  • Сверните окно IDE (а при надобности и другие программы), чтобы окно справки вновь появилось на экране.

Как видите, надпись на форме исчезла. Чтобы это не происходило, сделайте так:

Остановите программу.

  • Сделайте видимым окно визуального редактирования формы frmHelp.

  • В окне Properties для этой формы измените свойство AutoRedraw на True.

  • Вновь запустите программу и повторите описанные действия по «скрытию» и «появлению» формы.

Теперь надпись остается.

Свойство AutoRedraw (АвтоПерерисовка) заставляет саму Windows заботиться об обновлении надписей и рисунков. Правда, это заставляет программу занимать больше ресурсов.

В окне Properties перейдите на свойство StartUpPosition. Установите его в значение 1 – CenteredOwner.

Свойство StartUpPosition (СтартоваяПозиция) определяет, в каком положении будет выведено окно. Значение свойства CenteredOwner (ЦентрированиеВладельцем) заставит окно появиться примерно в центре формы, вызывающей это окно. В нашем случае вызывающая – главная форма программы.

Впоследствии не забудьте поэкспериментировать с этим свойством.

Вновь сделайте стартовой форму mfrmOrganizer.

  • Измените обработчик меню mnuHelpText так:

Private Sub mnuHelpText_Click()
	frmHelp.Show vbModal
End Sub

С этой конструкцией вы уже знакомы.

  • Попробуйте запустить программу и вызвать окно справки.

Вопросы

  1. Что такое переменная? Для чего она служит? Какие типы переменных Вам известны?

  2. Опишите синтаксис работы с файлом для чтения из него.

  3. Для чего применяется метод Cls? Есть ли параметры у этого метода? Если есть, то какие?

  4. Опишите схему именования, принятую в VB.

Задания

  1. Добавьте комментарии к созданному коду.

  2. Законспектируйте раздел.

  3. Напишите, как будет выглядеть объявление переменной по имени lngValue, если она имеет тип Long и должна быть доступна всему проекту? Подсказка – вспомните, какие слова VB могут участвовать в объявлении переменных, кроме Dim.

  4. Составьте список префиксов всех переменных и имен объектов (имена объектов – также переменные!), встречающихся в этой книге. Постарайтесь запомнить их и использовать в дальнейшей работе.

 

 

Hosted by uCoz