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

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

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

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

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

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

10. Обработка ошибок. Условные операторы
11. «Сборка» проекта
12.  Создание формы для вывода справки
13. Добавление окон-заметок. Наборы и циклы
14. Циклы VB
15. Основы отладки программ. Пользовательская процедура

9. Программирование формы для управления данными.

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

Уже можно делать пробный запуск программы и наблюдать, что получается.

Но сначала следует изменить стартовый объект проекта.

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

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

Для того, чтобы стартовала другая форма, следует сделать так:

  • Выполните команду меню ProjectOrganizer Properties... (Свойства проекта Organizer).

Появится окно свойств проекта (Project Properties):

 

 

Мы будем работать с вкладкой General (Главная).

Используя другие вкладки, Вы сможете корректировать параметры построения готовой программы. Этот материал выходит за пределы нашего курса, впоследствии Вам придется исследовать это самим.

  • В списке Startup Object (Стартовый объект) выберите имя формы frmPhoneBook.

  • Сразу введите в поле Project Description (Описание проекта) строку – коротенькое описание программы.

  • Щелкните OK.

  • Теперь запустите программу (если забыли – [F5]).

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

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

Что произошло? Да, изменения значений в текстовых контролах автоматически переходят в сетку. Более того, если вы откроете БД, например, в Access, то увидите, что эти изменения уже внесены в БД!

  • Пощелкайте на кнопках формы.

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

  • Пощелкайте на кнопочках со стрелками, расположенными по бокам контрола dtPhoneBook.

Как видите, при этом происходит переход на другие записи БД.

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

Некрасиво, правда?

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

Начнем с определения поведения формы при изменении ее размеров.

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

У объектов – практически у всех – есть свойства, отвечающие за их позиционирование. Это – свойства Left (Левая [граница]), Top (Верхняя [граница]), Width (Ширина), Height (Высота). Они используются при указании внешних координат объекта относительно контейнера, т.е. объекта, на котором они располагаются.

  • При размещении контролов внутри объекта для указания границ контейнера используются свойстваScaleLeft,ScaleTop,ScaleWidth,ScaleHeight.

Займемся изменениями размера формы.

  • Перейдите в окно редактирования кода формы frmPhoneBook.

  • В левом списке выберите объект Form.

  • В правом списке выберите событие Resize (ИзменениеРазмера).

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

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

txtNames.Width=Me.ScaleWidth – txtNames.Left

При исполнении строки будут происходить действия:

  1. Определяется ширина формы-контейнера (который обозначается словом Me):

Me.ScaleWidth

  1. Определяется координата левой границы текстового окна (она ведь будет оставаться на том же месте относительно левой границы формы-контейнера):

txtNames.Left

  1. Ширина текстового поля определяется как разница между шириной контейнера и левой границей текстового окна:
   

Me.ScaleWidth – txtNames.Left

  1. И, наконец, рассчитанное значение присваивается свойству txtNames.Width.

Обратите внимание, как обозначается принадлежность свойства тому или иному объекту:

<объект>.<свойство>

  • То есть, имя объекта, к чьему свойству обращаются, отделяется от имени свойства точкой.

Напишите строку кода для изменения ширины другого текстовогополя txtPhone.

Запустите программу, попробуйте изменить размеры формы.

Как видите, текстовые поля изменяют ширину одновременно с формой.

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

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

Добавьте строку для изменения ширины сетки.

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

  • Эта строка должна выглядеть так:

dbgrPhoneBook.Width = Me.ScaleWidth

  • И такая же строка для изменения ширины контрола dtPhoneBook:

dtPhoneBook.Width = Me.ScaleWidth

Код примет вид:

Private Sub Form_Resize ()
	txtNames.Width = Me.ScaleWidth - txtNames.Left
	txtPhone.Width = Me.ScaleWidth – txtPhone.Left
	dbgrPhoneBook.Width = Me.ScaleWidth
	dtPhoneBook.Width = Me.ScaleWidth
End Sub

Опять запустите программу. Измените размеры формы.

Следует добавить код для изменения вертикальных размеров и для перемещения кнопок. Это можно сделать аналогично описанному выше, и Вы уже знаете достаточно для этого.

Но мы сейчас познакомимся с другими возможностями контролов.

Свойство Align (Выравниваемость) при установке в одно из значений заставляет элемент «прилипать» к стороне контейнера и вместе с ним изменять размеры. Свойством Align обладают контролы Data, DBGrid и PictureBox.

Вернитесь в окно визуального проектирования формы frmPhoneBook.

  • Перенесите фокус на dtPhoneBook.

  • Измените свойствоAlign (Выровнять) на значение « 2 - Align Bottom» (Вдоль Дна).

Как видите, контрол «прилип» к нижнему краю формы (другие значения заставят его «прилипать» к другим краям контейнера).

Но что же делать с кнопками? У них нет такого свойства, а писать придется множество строк кода…

Щелкните на заготовке  одной из кнопок на форме.

  • Нажмите и удерживайте [Ctrl].

  • Щелкните по разу на остальных двух кнопках.

Они должны – все три – стать окруженными маркерами:

   

Теперь Вы можете производить некие действия с группой объектов-контролов.

Выполните команду меню EditCut (РедактироватьВырезать).

Кнопки исчезли – они перенесены в буфер обмена Windows, откуда их можно вставить в другое место.

Теперь мы добавим на форму контейнер, обладающий свойством Align.

Контейнером, кроме формы, могут служить контролы Frame и PictureBox. А свойство Align есть у PictureBox, именно его мы и будем использовать.

  • Добавьте на форму контрол PictureBox, вот так:
   

Назовите его picButtons.

  • Установите его свойство BorderStyle равным " 0 – None" (Нет) для того, чтобы контрол не был заметен на форме.

  • Установите его свойство Align равным " 2 – Align Bottom".

  • Убедитесь, что фокус на контроле (т.е., он окружен «квадратиками».

  • Выполните команду меню EditPaste (Вставить).

Кнопки появятся на контроле-контейнере.

Возможно, вам придется изменить высоту picButtons, чтобы кнопки в него полностью вошли.

  • Придайте контролу picButtons и кнопкам удобоваримый вид.

  • Удалите из кода строку:

dtPhoneBook.Width = Me.ScaleWidth

Мы уже сделали так, чтобы ширина контрола менялась автоматически. Если вы оставите эту строку, будет ошибка!

  • Испытайте программу.

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

Введите строку:

dbgrPhoneBook.Height = Me.ScaleHeight _
	- dbgrPhoneBook.Top _
	-(dtPhoneBook.Height + picButtons.Height)

Обратите внимание: VB позволяет переносить длинные строки, признак переноса строки – пробел + знак подчеркивания. При этом слова разрывать нельзя, разрывы должны быть в промежутках между словами языка.

Сами попробуйте разобраться в этой строке.

Итак, код обработчика события изменения размеров формы должен выглядеть так:

Private Sub Form_Resize()
txtPhone.Width = Me.ScaleWidth - txtPhone.Left
txtNames.Width = Me.ScaleWidth - txtNames.Left
dbgrPhoneBook.Width = Me.ScaleWidth
dbgrPhoneBook.Height = Me.ScaleHeight _
 - dbgrPhoneBook.Top _
 - (dtPhoneBook.Height + picButtons.Height)
End Sub

Обратите внимание на то, чем мы стали пользоваться интуитивно, без объяснения сути явления.

  • Раньше мы изменяли свойства объекта в окне Properties во время визуального проектирования формы – т. н. design-time – свойства (design-time – по англ. Время-Разработки).

  • А теперь мы узнали, что можно получать и изменять значения свойств в коде, исполняемом в работе программы (run-time – Время-Исполнения). Более того, для чтения и записи свойства применяются одни и те же слова, значение которых определяется VB в зависимости от контекста. Если вы были внимательны при написании кода, то заметили список, появляющийся в окне кода при внесении точки после имени объекта:
   

Этот список появился после введения строки

cmdAdd.

(с точкой).

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

Теперь давайте займемся обработкой событий нажатия на кнопки.

Кнопка cmdAdd должна добавить к нашему набору записей телефонов еще одну, пустую. VB позволяет это сделать очень просто.

Всякий элемент Data, подключенный к БД, имеет в своем составе объект Recordset(НаборЗаписей). Доступ к этому объекту производится так же, как и к свойствам, по сути это – свойство-объект.

  • Все манипуляции с БД происходят при посредстве объекта RecordSet.

  • В нашем случае объект Recordset создается автоматически, после того, как мы определяем свойства контрола dtPhoneBook.DatabaseName и dtPhoneBook.RecordSource.

  • Объект Recordset обладает такими важными свойствами, как BOF (BeginOfFile – НачалоНабора), EOF (EndOfFile – КонецНабора), AbsolutePosition (АбсолютнаяПозиция) и многими другими.

  • Объект Recordset также может производить некоторые действия. В терминах VB это означает, что объект Recordset имеет методы.

Методобъекта – некоторое действие, которое объект может выполнять.

Обращение к методу производится так же, как и обращение к свойству.

  • Важнейшие методы объекта Recordset:

    • AddNew (ДобавитьНовую [запись]),

    • Delete (Удалить [запись]),

    • Update (Обновить [набор]),

    • MoveFirst (ПерейтиНаПервую [запись]),

    • MoveLast (ПерейтиНаПоследнюю [запись]),

    • MoveNext (ПерейтиНаСледующую [запись]) и многие другие.

В нашем случае прим éним метод AddNew.

  • В окне кода формы frmPhoneBook, в левом списке выберите объект cmdAdd, при этом в правом списке окна кода появится заготовка обработчика события Click.

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

dtPhoneBook.Recordset.AddNew

  • Сохраните программу!

  • Запустите программу.

  • Щелкните на кнопке «Добавить» созданной Вами формы.

Текстовые поля очистятся, готовые к вводу нового значения.

  • Введите значения в оба (или одно) поля, затем с помощью мыши перейдите на какую-нибудь строку в сетке.

Как видите, введенные в текстовые поля значения появились в сетке!

Можно заметить, что обновление сетки (и БД) происходит после перехода на другую запись. Кнопка cmdUpdate позволит делать это без перемещения по набору.

  • Кроме того, метод Update (Обновить) объекта Recordset позволит увидеть изменения, сделанные другими пользователями, если ваша БД находится в коллективном пользовании.

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

dtPhoneBook.Recordset.Update

  • Запустите программу.

  • Нажмите кнопку «Обновить».

Как видите, появилось окно с сообщением об ошибке – метод Update нельзя применять без применения перед этим метода AddNew. Программа остановлена.

Нажмите [Esc].

Сообщение об ошибке исчезнет.

Обработкой ошибок займемся на следующем занятии.

Не забудьте сохранить проект.

Вопросы

  1. Что такое метод?

  2. Опишите синтаксис методов. Какие методы Вы знаете?

  3. Как можно группировать свойства относительно работы с ними во время проектирования программы?

  4. В чем разница между свойствами Left и ScaleLeft?

  5. В ответ на какие Ваши действия может произойти событие Form_Resize?

  6. Опишите основные методы объекта RecordSet.

Задания

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

 

Hosted by uCoz