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

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

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

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

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

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

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

13. Добавление окон-заметок.
Наборы и циклы.

В этом разделе мы добавим к программе последний компонент – окна для ввода и просмотра записей дневника. Вы также познакомитесь с наборами 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, следует сделать набор доступным для этих форм.

 Это делается так:

  • Приготовьтесь к работе.

  • Выполните команду меню ProjectAdd Module...(Добавить Модуль).

  • Подтвердите выбор нажатием [Enter].

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

Вы могли бы поместить глобальное объявление и в форме, но общепринято располагать их в отдельном модуле. Это удобнее.

С помощью окна Properties переименуйте модуль из Module1 в GlobalReq (от англ. Global Requirement – ГлобальноТребуемый).

  • Сохраните проект (укажите каталог!).

  • А теперь поместите в модуль объявление:

Public colSheets As Collection

Именно так, как тип переменных, воспринимает коллекции VB. Но Collection – объектный тип.

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

Откройте окно кода frmDiary.

  • Добавьте обработчик события Form_Load:

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, и присвойте заголовок « Страничка» (без кавычек).

Открывать страничку будем нажатием на эту кнопку.

  • Вернитесь в модуль для глобальных объявлений (GlobalReq).

  • Внесите в него еще одну строку объявления:

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

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

Этим мы займемся в следующем разделе.

Вопросы

  1. Какие этапы внесения в проект неопределенного количества одинаковых объектов (своими словами)?

  2. Для чего используется свойство MultiLine?

  3. Что такое коллекция VB? Для чего можно ее применить?

  4. Какие атрибуты есть у коллекций?

  5. Какой тип данных будет иметь переменная, соответствующая коллекции?

  6. Опишите порядок работы с объектной переменной.

  7. Для чего служит слово Set? А что значит Nothing?

Задания

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

  2. Напишите три строки, в которых Вы

    1. объявляете переменную по имени objVar типа MyObject,

    2. явно создаете эту переменную (присвойте ей произвольное значение)

    3. и уничтожаете ее (MyObject - объектный тип).

Hosted by uCoz