12. Создание формы для вывода справки.В этом занятии мы будем создавать специальную форму для вывода текста справки. Кроме того, Вы получите представление о работе с файлами в VB и познакомитесь с понятием переменной. Добавьте к проекту еще одну форму (Конечно, вначале следует запустить VB и открыть проект).
Не забудьте правильно указать каталог, в который следует поместить новую форму – C:\VB Begin. На этом визуальное проектирование формы закончено, далее мы будет программировать в коде. Давайте представим, как будет работать форма, на которой должен отображаться текст справки.
Начнем мы с того, где форма будет «запоминать» текст справки.
Вы находитесь в так называемой области глобальных объявлений кода. В области глобальных объявлений Вы можете разместить некоторые сущности, которые будут использоваться всеми составляющими модуля, а иногда – и всеми компонентами проекта.
Dim strHelpText As String Это – объявление переменной. Переменная – именованное хранилище определенной информации, из этого хранилища можно считывать информацию, и в него можно записывать.
Public strHelpText As String
Кроме типа String, VB поддерживает следующие основные типы переменных:
Есть особенность в объявлении типа Variant. Объявление может выглядеть так: Dim var As Variant
Dim var так как тип Variant считается основным в VB, и используется по умолчанию (то есть – без специальных указаний). Недостаток типа Variant в том, что обилие переменных такого типа могут замедлить работу программы. Теперь займемся чтением текста справки из файла. Логично делать это во время загрузки формы-справки. Создайте обработчик Form_Load. (Не забудьте, сейчас Вы работаете с формой frmHelp). Нам потребуется вспомогательная переменная целого типа. Внесите в обработчик события строку: Dim intW As Integer Внутри процедуры объявляется переменная, доступная лишь внутри этой процедуры (частная), поэтому можно не заботиться об уникальности ее имени.
Следующей строкой внесите: intW = FreeFile FreeFile – функция VB, используемая при работе с файлами. Функция– логически завершенный участок программы, выполняющий некоторые действия и оповещающий вызвавший функцию код о результатах своей деятельности. Это оповещение происходит при помощи того, что функция возвращает некоторое значение.
Далее внесите строку: Open App.Path & "\Help.txt" For Input As intW Слово Open (Открыть) приказывает программе прочитать файл и начать работу с ним.
Open <путь_и_имя_файла> For <режим_доступа> As <число>
Если вы пишете в файл, используя тип доступа Output или Random, а указанный файл не существует – он будет создан. Далее произведем чтение из файла: strHelpText = Input(LOF(intW), #intW) Здесь мы используем две файловые функции VB: Input (как видите, она применяется в другом контексте, нежели слово Input в составе предыдущей строки) и LOF (от англ. LenghtOfFile – ДлинаФайла).
Если надо определить длину файла, не открывая его, используется функция FileLen.
Input (<число_символов>, <номер_файла>)
Корректная работа с файлами подразумевает их закрытие по окончании работы:
Close intW Слово Close (Закрыть) приказывает VB завершить работу с файлом под номером intW. Таким образом, код обработчика события Form_Load примет вид: Private Sub Form_Load() Dim intW As Integer intW = FreeFileOpen App.Path & "\Help.txt" For Input As intWstrHelpText = Input(LOF(intW), #intW)Close intW End Sub Обратите внимание на то, как используется функция LOF. Более понятная эквивалентная запись: Private Sub Form_Load() Dim intW As Integer Dim lngValue As Long intW = FreeFileOpen App.Path & "\Help.txt" For Input As intWlngValue = LOF (intW)strHelpText = Input(lngValue, #intW)Close intW End Sub То есть, VB сам, «втайне» от программиста как бы создает переменную, куда читает значение функции, и затем подставляет эту переменную вместо функции. Но наше предыдущее решение – подставить в строку саму функцию – проще, и поэтому предпочтительнее. Сделаем еще одно информационное отступление и поясним упрощенную схему именования 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, varHeightMe.ClsMe.Print strHelpText End Sub Как видите, происходит множество обращений к одному и тому же объекту Me. Вы можете использовать конструкцию With. Внимание! Методы Print, Circle, Line и PSet «не поддаются» упрощению в блоке With, для них всегда должен указываться объект. Преобразуйте код, используя конструкцию With. Вот что должно получиться: Private Sub Form_Resize() Dim varWidth Dim varHeight With MevarWidth = .TextWidth(strHelpText)varHeight = .TextHeight(strHelpText).Move .Left, .Top, varWidth, varHeight.ClsMe.Print strHelpTextEnd With End Sub Сделайте форму frmHelp стартовым объектом.
Как видите, текст немного обрезается справа и снизу. Это из-за того, что при изменении размеров учитывается высота заголовка и ширина границы окна.
varWidth = .TextWidth(strHelpText) * 1.05 varHeight = .TextHeight(strHelpText) * 1.1
Как видите, надпись на форме исчезла. Чтобы это не происходило, сделайте так: Остановите программу.
Теперь надпись остается. Свойство AutoRedraw (АвтоПерерисовка) заставляет саму Windows заботиться об обновлении надписей и рисунков. Правда, это заставляет программу занимать больше ресурсов. В окне Properties перейдите на свойство StartUpPosition. Установите его в значение 1 – CenteredOwner. Свойство StartUpPosition (СтартоваяПозиция) определяет, в каком положении будет выведено окно. Значение свойства CenteredOwner (ЦентрированиеВладельцем) заставит окно появиться примерно в центре формы, вызывающей это окно. В нашем случае вызывающая – главная форма программы. Впоследствии не забудьте поэкспериментировать с этим свойством. Вновь сделайте стартовой форму mfrmOrganizer.
Private Sub mnuHelpText_Click() frmHelp.Show vbModal End Sub С этой конструкцией вы уже знакомы.
Вопросы
Задания
|