9. Программирование формы для управления данными.При изучении этого раздела Вы вновь столкнетесь с написанием обработчиков событий, углубите свои познания в области работы со свойствами, познакомитесь с методами. Уже можно делать пробный запуск программы и наблюдать, что получается. Но сначала следует изменить стартовый объект проекта. В один проект VB может входить множество форм. По умолчанию при запуске программы стартует форма, которая была создана при первом появлении проекта, у нас это форма frmAbout. Вы можете назначить стартовым другой компонент проекта, используя диалоговое окно свойств проекта. Для того, чтобы стартовала другая форма, следует сделать так:
Появится окно свойств проекта (Project Properties): Мы будем работать с вкладкой General (Главная). Используя другие вкладки, Вы сможете корректировать параметры построения готовой программы. Этот материал выходит за пределы нашего курса, впоследствии Вам придется исследовать это самим.
Как видите, в сетке – уже введенные нами раньше значения полей, в текстовых контролах – значения текущих записей.
Что произошло? Да, изменения значений в текстовых контролах автоматически переходят в сетку. Более того, если вы откроете БД, например, в Access, то увидите, что эти изменения уже внесены в БД!
Ничего не происходит, потому, что мы не внесли код.
Как видите, при этом происходит переход на другие записи БД.
Некрасиво, правда?
Начнем с определения поведения формы при изменении ее размеров. Событие Resize происходит в ответ на изменение размеров объекта, и при обработке его мы можем приказать изменять размеры других объектов (или делать другие действия). У объектов – практически у всех – есть свойства, отвечающие за их позиционирование. Это – свойства Left (Левая [граница]), Top (Верхняя [граница]), Width (Ширина), Height (Высота). Они используются при указании внешних координат объекта относительно контейнера, т.е. объекта, на котором они располагаются.
Займемся изменениями размера формы.
В нашем случае будем изменять ширину текстовых полей так, чтобы они всегда «доставали» до правого края формы. Внесите в обработчик события Form_Resizeстроку: txtNames.Width=Me.ScaleWidth – txtNames.Left При исполнении строки будут происходить действия:
Me.ScaleWidth
txtNames.Left
Me.ScaleWidth – txtNames.Left
Обратите внимание, как обозначается принадлежность свойства тому или иному объекту: <объект>.<свойство>
Запустите программу, попробуйте изменить размеры формы. Как видите, текстовые поля изменяют ширину одновременно с формой.
В дальнейшем не будет специальных указаний об остановке программы. Привыкните, что, как правило, все изменения в коде делаются тогда, когда программа остановлена. Добавьте строку для изменения ширины сетки. Эта задача еще проще. Левая граница сетки совпадает с левой границей формы, и дополнительных расчетов делать не надо.
dbgrPhoneBook.Width = Me.ScaleWidth
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.
Как видите, контрол «прилип» к нижнему краю формы (другие значения заставят его «прилипать» к другим краям контейнера). Но что же делать с кнопками? У них нет такого свойства, а писать придется множество строк кода… Щелкните на заготовке одной из кнопок на форме.
Они должны – все три – стать окруженными маркерами: Теперь Вы можете производить некие действия с группой объектов-контролов. Выполните команду меню EditCut (РедактироватьВырезать). Кнопки исчезли – они перенесены в буфер обмена Windows, откуда их можно вставить в другое место. Теперь мы добавим на форму контейнер, обладающий свойством Align. Контейнером, кроме формы, могут служить контролы Frame и PictureBox. А свойство Align есть у PictureBox, именно его мы и будем использовать.
Назовите его 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.LefttxtNames.Width = Me.ScaleWidth - txtNames.LeftdbgrPhoneBook.Width = Me.ScaleWidthdbgrPhoneBook.Height = Me.ScaleHeight _- dbgrPhoneBook.Top _- (dtPhoneBook.Height + picButtons.Height) End Sub Обратите внимание на то, чем мы стали пользоваться интуитивно, без объяснения сути явления.
Этот список появился после введения строки cmdAdd. (с точкой). В этом списке Вы можете найти имена всех (почти) свойств, доступных во время выполнения, и имена т.н. методов объекта (о них разговор будет потом). Теперь давайте займемся обработкой событий нажатия на кнопки. Кнопка cmdAdd должна добавить к нашему набору записей телефонов еще одну, пустую. VB позволяет это сделать очень просто. Всякий элемент Data, подключенный к БД, имеет в своем составе объект Recordset(НаборЗаписей). Доступ к этому объекту производится так же, как и к свойствам, по сути это – свойство-объект.
Методобъекта – некоторое действие, которое объект может выполнять. Обращение к методу производится так же, как и обращение к свойству.
В нашем случае прим éним метод AddNew.
dtPhoneBook.Recordset.AddNew
Текстовые поля очистятся, готовые к вводу нового значения.
Как видите, введенные в текстовые поля значения появились в сетке! Можно заметить, что обновление сетки (и БД) происходит после перехода на другую запись. Кнопка cmdUpdate позволит делать это без перемещения по набору.
В обработчик события cmdUpdate_Click добавьте строку: dtPhoneBook.Recordset.Update
Как видите, появилось окно с сообщением об ошибке – метод Update нельзя применять без применения перед этим метода AddNew. Программа остановлена. Нажмите [Esc]. Сообщение об ошибке исчезнет. Обработкой ошибок займемся на следующем занятии. Не забудьте сохранить проект. Вопросы
Задания
|