В этом разделе мы добавим к программе последний компонент – окна для ввода и просмотра записей дневника. Вы также познакомитесь с наборами VB.
Как Вы помните, при проектировании органайзера предусмотрена возможность просмотра и редактирования записей дневника на отдельных «страничках», независимо друг от друга.
-
Для реализации этой идеи следует:
-
Создать одну форму-страничку, которая будет «заготовкой» для включения в программу.
-
В процессе работы программы предусмотреть возможность создания произвольного количества экземпляров этой формы-странички.
-
Для того, чтобы не выводить по несколько страничек, соответствующих одной и той же записи БД (это может привести к неприятностям):
-
Каким-то образом подсчитывать и идентифицировать созданные странички.
- При закрытии странички «снимать» ее с «учета».
Начнем с создания «заготовки» формы-странички.
-
Добавьте к проекту стандартную форму.
-
Назовите ее frmSheet (от англ. Sheet – листок, страница), установите свойство MDIChild равным True.
-
Поместите на нее текстовое поле, назовите его txtSheet, установите его свойства MultiLine в True и ScrollBars в 3 – Both, свойство Text очистите, чтобы на текстовом поле не было надписи.
Свойство текстового поля MultiLine (МногоСтрок) позволяет выводить многострочный текст.
Свойство ScrollBars (ПолосыПрокрутки) может принимать несколько значений, в зависимости от которых на текстовом поле будут отображаться полосы прокрутки текста. Значение 3 – Both (Обе) заставляет изображать обе, и горизонтальную и вертикальную.
Сохраните проект (укажите, где сохранить новую форму!).
Добавьте обработчик события Form_Resize.
Текст будет примерно такой:
Private Sub Form_Resize()
With txtSheet
.Top = 0
.Left = 0
.Width = Me.ScaleWidth
.Height = Me.ScaleHeight
End With
End Sub
А теперь определимся с функциональностью этой формы. В ней мы должны выводить содержимое текущей записи поля Note.
-
Появляться эта форма должна при вызове из формы frmDiary (надо добавить к ней эту возможность),
-
выводить в себе содержимое записи,
-
позволять редактировать запись,
-
а при закрытии формы-странички обновлять содержимое записи БД.
Редактировать запись позволяет текстовое поле, для этого код не нужен.
-
К сожалению, VB не позволяет подключить текстовое поле на отдельной форме к элементу управления данными, находящемуся на другой форме. Подключение придется делать с помощью кода. Обновление записи при закрытии формы-странички – тоже.
Сейчас Вы познакомитесь с важным понятием VB – наборами и их частным случаем – коллекциями.
Как помните, мы подразумеваем возможность:
-
открытия произвольного числа страничек,
-
на одну запись – одну страничку,
-
открывать и закрывать странички можно в произвольном порядке, не обязательно в порядке следования записей.
VB содержит понятие набора – некоторой совокупности объектов (не обязательно однородных), объединенной логически и каким-то способом упорядоченной.
-
К наборам VB относятся массивы (в т. ч. – массивы контролов), перечисления и коллекции.
-
В данном случае нас интересуют коллекции ( Collection), именно они позволяют добавление и удаление членов в произвольном порядке.
Так как мы собираемся так или иначе управлять набором форм-страничек из самих страничек и из формы frmDiary, следует сделать набор доступным для этих форм.
Это делается так:
К проекту будет добавлен т.н. стандартный модуль. В нем мы расположим объявление набора и сделаем это объявление глобальным.
Вы могли бы поместить глобальное объявление и в форме, но общепринято располагать их в отдельном модуле. Это удобнее.
С помощью окна Properties переименуйте модуль из Module1 в GlobalReq (от англ. Global Requirement – ГлобальноТребуемый).
Public colSheets As Collection
Именно так, как тип переменных, воспринимает коллекции VB. Но Collection – объектный тип.
-
Для Вас это значит, что, после объявления, следует явно создать эту переменную. Так как управление формами-страничками будет происходить из frmDiary, то логично будет явно создать набор при создании управляющей формы.
Откройте окно кода frmDiary.
Private Sub Form_Load()
Set colSheets = New Collection
End Sub
Слово Set (Установить) используется VB при работе с объектными переменными.
-
Затем вы видите имя коллекции, указанное при объявлении ее в модуле.
-
Затем, после знака равенства идет слово New (Новый). Это – признак того, что VB создаст новый экземпляр этого объекта.
-
Затем следует собственно тип создаваемого объекта.
Есть и другие способы создания объектов в VB, но указанный способ наиболее быстрый и «строгий». Старайтесь использовать именно его.
Как правило, при выгрузке формы, где произошло создание объекта, этот объект уничтожается. Но, особенно начинающим, рекомендуется явно делать уничтожение объекта.
Добавьте в код формы frmDiary обработчик события Form_Unload:
Private Sub Form_Unload(Cancel As Integer)
Set colSheets = Nothing
End Sub
Как видите, происходит присвоение переменной colSheets (нашему набору страничек) значения Nothing (Ничто). В VB это равнозначно уничтожению объекта.
Теперь добавим к frmDiary функциональность для открытия страничек.
-
Добавьте на форму frmDiary контрол CommandButton (расположите его сами, так, чтобы было удобно с ним обращаться, и, что важно, чтобы была очевидна его принадлежность).
Например, так:
Переименуйте его в cmdSheet, и присвойте заголовок « Страничка» (без кавычек).
Открывать страничку будем нажатием на эту кнопку.
Public NewSheet As frmSheet
Как видите, здесь объявляется переменная типа формы.
-
Дело в том, что мы собираемся работать с несколькими (неопределенным количеством) одинаковых форм, поэтому нельзя обращаться непосредственно к форме, как мы делали раньше.
-
Нам придется для каждой странички создавать новую переменную типа формы.
Создайте (в коде frmDiary) обработчик события cmdSheet_Click.
Set NewSheet = New frmSheet
Теперь следует инициализировать созданную переменную-страничку.
Инициализация– присвоение вновь созданной переменной начального значения для того, чтобы эту переменную можно было использовать в программе.
Логично будет сделать так. В заголовок вновь созданной формы внести запись из поля « Дата» (т.к. это – уникальное значение, на каждую дату мы делаем одну и только одну страничку), а в текстовое поле на форме вывести значение поля « Заметка».
Добавьте код (в событие cmdSheet_Click формы frmDiary):
NewSheet.Caption = datPrimaryRS.Recordset("Dates")
В свойство Caption вновь созданной формы (NewSheet) записывается текущее значение из поля « Dates» набора записей элемента управления данными datPrimaryRS. Запомните этот синтаксис!
NewSheet.txtSheet.Text = datPrimaryRS.Recordset("Note")
Свойству Text текстового поля txtSheet вновь созданной формы NewSheet присваивается текущее значение поля « Note» набора записей элемента управления данными datPrimaryRS.
Вновь созданная форма инициализирована.
Добавим ее к набору.
Наборы-коллекции обладают методами для работы с данными.
-
Это – методы Add (Добавить), Remove (Удалить), Item (ЧленНабора).
-
Метод Add, как следует из названия, добавляет к набору новый элемент. При этом следует указать сам объект и некоторый идентификатор, с помощью которого будут происходить последующие обращения к члену набора, этот идентификатор может быть числом или строкой, но не должен повторяться.
Добавьте туда же строку:
colSheets.Add NewSheet, NewSheet.Caption
Здесь к коллекции colSheets добавляется член NewSheet (т.е., наша, вновь созданная, форма-страничка), идентификатором будет служить заголовок формы (как мы уже видели, заголовки форм-страничек должны содержать уникальное значение даты).
Код примет такой вид (не забудьте – он относится к форме frmDiary):
Private Sub cmdSheet_Click()
Set NewSheet = New frmSheet
NewSheet.Caption = datPrimaryRS.Recordset("Dates")
NewSheet.txtSheet.Text = datPrimaryRS.Recordset("Note")
colSheets.Add NewSheet, NewSheet.Caption
End Sub
Следует предусмотреть ситуацию, когда форма-страничка для выбранной записи уже существует. В таком случае следует вывести ее на передний план, но не создавать ее заново.
Этим мы займемся в следующем разделе.
Вопросы
-
Какие этапы внесения в проект неопределенного количества одинаковых объектов (своими словами)?
-
Для чего используется свойство MultiLine?
-
Что такое коллекция VB? Для чего можно ее применить?
-
Какие атрибуты есть у коллекций?
-
Какой тип данных будет иметь переменная, соответствующая коллекции?
-
Опишите порядок работы с объектной переменной.
-
Для чего служит слово Set? А что значит Nothing?
Задания
-
-
Напишите три строки, в которых Вы
-
объявляете переменную по имени objVar типа MyObject,
-
явно создаете эту переменную (присвойте ей произвольное значение)
-
и уничтожаете ее (MyObject - объектный тип).
|