Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_3_1_Лс_27_11_2011.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
4.63 Mб
Скачать

Завдання на самостійну роботу(в,вс,лс)

ЗАДАНИЕ С16_посл. СОЗДАЙТЕ ПРИЛОЖЕНИЕ, КОТОРОЕ ДЕМОНСТРИРУЕТ ИСПОЛЬЗОВАНИЕ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ Common Dialog ДЛЯ ОТКРЫТИЯ И СОХРАНЕНИЯ ФАЙЛА, ДЛЯ ВЫБОРА ШРИФТА И ЦВЕТА, А ТАКЖЕ ДЛЯ РЕДАКТИРОВАНИЯ ТЕКСТА. ФАЙЛ ФОРМАТА txt БУДЕТ ЗАГРУЖАТЬСЯ В ТЕКСТОВОЕ ПОЛЕ (ЛЕВОЕ ПОЛЕ НА рис.16. 2), А ФАЙЛ ФОРМАТА rtf – В ПОЛЕ Rich Textbox (ПРАВОЕ ПОЛЕ НА рис.16.2).

Порядок действий:

1. Расположите на форме объекты в соответствии с рис.16.2.

Рис. 16.2. Вид окна приложения после двукратной отработки команды FileOpen и выбора двух файлов для открытия в окне Textbox(слева) и Rich Textbox(справа)

2. Проведите подготовительные работы. Установите дополнительные элементы управления в окне ToolBox.

  • В меню Project выберите команду Components и на вкладке Controls установите флажок у компонента Microsoft Rich Textbox Control 6.0.

  • В окне ToolBox появится дополнительный элемент: …RichTextBox. Он представляет собой усовершенствованное текстовое окно, с помощью которого вы можете создавать полноценные файлы в формате rtf, в которых вы можете как угодно форматировать внешний вид своего документа: расставлять переносы, выделять текст различными шрифтами, менять гарнитуру текста и т.д.

  • В меню Project выберите команду Components и на вкладке Controls установите флажок у компонента Microsoft Common Dialog Control 6.0 (SP 6).

  • В окне ToolBox появится дополнительный элемент: CommonDialog. Объект CommonDialog (Общий диалог) обеспечивает вывод на экран набора стандартных окон для выполнения операций открытия и сохранения файлов, выбора цвета и характеристик шрифта.

CommonDialog является средством связи между программами, написанными на языке Visual Basic, и процедурами из динамической библиотеки Commdlg.dll. Файл библиотеки находится с системной директории Microsoft Windows.

К объекту CommonDialog могут применяться следующие методы, которые выводят на экран стандартное диалоговое окно:

Таблица 16.2. Методы, которые могут применяться к объекту CommonDialog.

Метод

Диалоговое окно

ShowColor

Выбор цвета

ShowOpen

Открытия файла

ShowSave

Сохранения файла

ShowPrinter

Вывода на принтер

ShowFont

Выбора характеристик шрифта

Методы выполняются только во время работы программы. В процессе создания проекта объект CommonDialog, размещенный на форме, выглядит как пиктограма.

3. Установите значения свойств объекта CommonDialogCancelError и Flags. Если свойство CancelError имеет значение True, появляется возможность в программном коде реагировать на щелчок по кнопке <Cancel>(Отмена). Значение свойства Flags влияет на внешний вид и поведение диалогового окна.

4. Разместите в окне приложения 4 команды меню (File, Font, Color, Edit), имеющие подменю:

File → Open, Save, Save As;

Color → ForeColor, BackColor;

Edit → Copy, Cut, Paste.

Команды сохранения файла (Save и Save As) здесь реализуются только для формата RTF.

5. При проектировании формы помимо нестандартного элемента управления Rich Textbox поместите на форму 3 элемента Common Dialog (Microsoft Common Dialog Control 6.0).

6. Для реализации интерфейса установите для объектов следующие свойства:

Имя

объекта

Класс

объекта

Свойство

объекта

Значение свойства

Form1

Form

Caption

Панели общего диалога

mnuFile

Menu Command

Caption

File

mnuOpen

SubMenu Command

Caption

Open

mnuSave

SubMenu Command

Caption

Save

mnuSaveAs

SubMenu Command

Caption

Save As

Text1

TextBox

MultiLine

True

RichTextBox1

RichTextBox

MultiLine

True

CommonDialog1

CommonDialog

(Custom)

Закладка Open / Save As

CommonDialog2

CommonDialog

(Custom)

Закладка Font

CommonDialog3

CommonDialog

(Custom)

Закладка Color

Замечание. В таблице не представлены свойства команд меню Font, Color и Edit.

Замечание. Ниже приводится код процедур также лишь для команд меню File (Open, Save и Save As). Составление кода для других команд меню – тема для самостоятельного выполнения.

7. Составьте программный код для данного приложения:

Private Sub mnuOpen_Click()

CommonDialog1.ShowOpen

F$ = CommonDialog1.FileName

If Right(F, 3) = "rtf" Then

RichTextBox1.LoadFile F

ElseIf Right(F, 3) = "txt" Then

Open F For Input As #1

N& = LOF(1)

S$ = Input(N, 1)

Text1.Text = S

Close 1

End If

End Sub

Private Sub mnuSave_Click()

F$ = CommonDialog1.FileName

If F = "" Then

mnuSaveAs_Click

Else

RichTextBox1.SaveFile F, rtfRTF

End If

End Sub

Private Sub mnuSaveAs_Click()

CommonDialog1.ShowSave

F$ = CommonDialog1.FileName

RichTextBox1.SaveFile F, rtfRTF

End Sub

ПРОИЗВОЛЬНЫЙ (RANDOM) ДОСТУП

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

  1. Открыть файл оператором OPEN

Open pathName For Random [Access — доступ][Lock] As #номер_файла % [Len = длина записи]

  • pathName — имя файла,

  • Access — доступ задаeт права доступа к файлу. Ниже даны типы доступа и соответствующие примеры:

  • чтение — Open "file1.dat" For Random Access Read As #1,

  • запись — Open "file1.dat" For Random Access Write As #1,

  • чтение и запись — Open "file1.dat" For Random Access Read Write As #1, или без указания — Open "file1.dat" For Random As #1,

  • Lock (блокирование) определяет права доступа к открытому файлу пользователя/процесса при коллективном использовании:

  • Shared — все процессы могут писать в файл и считывать из файла,

  • Lock Read Write — запрет записи в файл и считывания из файла,

  • Lock Read — запрет считывания из файла,

  • Lock Write — запрет записи в файл,

  • As # номер_файла — номер файла,

  • Len определяет длину записи

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

  1. для изменения данных в записях файла (редактирование, добавление, удаление записей) применить оператор PUT#.

PUT #номер_файла% [. номер записи][,переменная]

  • #номер_файла% — номер открытого файла;

  • номер записи — целочисленное выражение, которое задает номер записи в файле;

  • переменная — содержит данные для записи в файл

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

Если номер записи не указан, то по умолчанию принимается текущая позиция указателя записи

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

Put #FileNum, LastRecord + 1, ForFileRecords

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

  1. Для считывания данных из файла произвольного доступа использовать оператор Get #.

GET #номер_файла% [, номер записи][,переменная]

  • #номер_файла% — номер файла;

  • номер записи — номер записи для чтения

  • переменная — содержит данные для приема ввода из файла

Замечание. Данные из файла произвольного доступа, как правило, считываются записями. Если параметр номер записи в функции Get# не указан, считывается текущая запись, на которой позиционирован указатель.

Для позиционирования указателя можно использовать функцию Seek. Синтаксис этого оператора такой же, как для файлов последовательного доступа, но имеет другое содержание. Если для последовательных файлов позиционирование выполняется по символам, то для файлов произвольного доступа — по номеру записи:

Seek #номер_файла%, position

  • #номер_файла% — номер файла;

  • position — целочисленное выражение, которое задает номер записи в файле.

4) Для удаления данных из файла произвольного доступа существуют два способа. Можно просто очистить соответствующие поля указанных записей, то есть записать в них пустые значения. Однако в этом случае в файле остаются пустые записи. Очевидно, что при таком подходе ресурсы (дисковое пространство) используется нерационально.

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

Алгоритм этих действий такой:

  • Создайте новый файл при помощи оператора Open.

  • Перепишите все непустые записи в новый файл, используя оператор Put #.

  • Закройте исходный файл и удалите его при помощи оператора Kill.

  • Переименуйте новый файл в исходный оператором Name.

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

5) Закрыть файл оператором CLOSE

Для вычисления номера последней записи нужно размер файла поделить на длину записи. Размер (длину) файла (в байтах) определяют с помощью функции LOF.

ЗАДАНИЕ 16.2. Постановка задачи (Доработка проекта 12.1 — Записная книжка): УСТРАНИТЕ НЕДОСТАТКИ ПРОЕКТА:

  • ПРЕДУСМОТРИТЕ СОХРАНЕНИЕ ДАННЫХ В ФАЙЛЕ ПРОИЗВОЛЬНОГО ДОСТУПА.

  • УСТРАНИТЬ ОГРАНИЧЕНИЕ НА КОЛИЧЕСТВО ЗАПИСЕЙ, ВЫВОД ИНФОРМЦИИ ОСУЩЕСТВЛЯТЬ В СПЕЦИАЛЬНЫЙ ОБЪЕКТ — ListView (Обзор списка).

  • ПРЕДУСМОТРИТЕ ВОЗМОЖНОСТЬ УДАЛЕНИЯ ЗАПИСИ ПО НОМЕРУ.

Общий вид приложения представлен на рис. 16.3. На рис.16.4 показан результат поиска по фамилии, на рис.16.5 – вид сообщения в том случае, если в записной книжке отсутствует человек с указанной фамилией, на рис.16.6 – вид сообщения при попытке удалить несуществующую запись.

Рис. 16.3 Общий вид приложения «Записная книжка»

Рис. 16.4 Результат поиска по фамилии

Рис. 16.5 Вид сообщения, если отсутствует человек с указанной фамилией

Рис. 16.6 Вид сообщения при попытке удалить несуществующую запись

Порядок действий

  1. Проведите подготовительные работы. Установите дополнительные элементы управления в окне ToolBox. В меню Project выберите команду Components и на вкладке Controls установите флажок у компонента Microsoft Windows Common Controls 6.0. В окне ToolBox появится дополнительный элемент: — ListView (Обзор Списка).

Этот элемент позволяет выводить список различных элементов — файлов, папок и др. Раннее использовался метод AddItem, который применялся к объекту ComboBox для того, чтобы добавить элемент списка в комбинированное окно. В данной работе для заполнения объекта ListView тоже используется особый метод — Add, который служит для добавления новых элементов в семейство объектов.В данном случае семейством являются две части объекта ListView:Семейство ColumnHeaders (Заголовок колонок) и семейство ListItems (Элементы списка).

Для добавления нового члена в семейство с помощью метода Add используется следующая технология:

  • Объявляется переменная, тип которой – имя члена семейства (в данном случае это одна из двух переменных – ЗаголовоКолонки типа ColumnHeader и ЭлементСписка типа ListItem);

  • С помощью метода Add этой переменной присваивается значение, после чего с помощью оператора Set это значение устанавливается в качестве нового члена семейства.

Формат метода Add для каждого семейства свой.

Формат метода Add для семейства ListItems

ИмяОбъекта.ListItems.Add([p1],[p2],[p3],[p4],[p5])

где р1 – индекс элемента списка;

р2 – идентификатор элемента списка;

р3 –текст элемента списка;

р4 – индекс списка крупных пиктограмм;

р5 – индекс списка мелких пиктограмм.

Каждый элемент списка состоит из частей (SubItem).

Для внесения данных в i-ю часть элемента используется строка кода:

ЭлементСписка.SubItems(i)=Значение

2. Измените интерфейс приложения в соответствии с рис.16.3.

  • Удалите кнопку <Просмотреть>;

  • Добавьте текстовое поле для ввода номера записи, которую требуется удалить(txtNunRec);

  • Добавьте кнопку для выполнения операции удаления записи – cmdDelete.

3. Разместите на форме объект ListView и установите его свойства:

  • FullRowSelectTrue (позволяет выделять запись целиком);

  • GridLinesTrue (показывает сетку);

  • View3-lvwReport (позволяет выводить текст).

Свойства, определяющие внешний вид, установите по своему усмотрению.

4. Заполните заголовки колонок с помощью окна Property Pages для этого объекта (щелкните правой кнопкой мыши на объекте и выберите опцию Properties или используйте свойство Custom):

  • в окне откройте вкладку ColumnHeaders (рис.16.7)

  • щелкните по кнопке <Insert Column>;

  • в поле Text введите заголовок 1-й колонки - (Index этой колонки 1);

  • аналогично введите остальные заголовки (Фамилия, Имя, Дата рождения, Телефон).

5. Сохраните изменения в проекте.

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

Рис.16.7 Вкладка ColumnHeaders окна Property Pages

Option Explicit

Private Type Друг 'Создана структура для хранении данных о друзьях

Fam As String * 20

Name As String * 20

BirthDay As Date

Telephone As Long

End Type

Dim Del As Boolean

Dim Друзья() As Друг 'Обьявлен динамический массив, состоящий из структур

Dim c As Integer

Dim Один_друг As Друг 'Объявлена переменная, представляющая структуру

Dim Количество_записей As Integer

Private Sub Form_Load()

Dim Размер_записи

Dim Размер_файла

Dim j As Integer 'Счетчик цикла

Del = False

DTPicker1.Value = Date

Open "Friends.txt" For Random As #1 Len = Len(Один_друг) 'Открывается файл

Размер_файла = LOF(1) 'Определяется размер файла

Размер_записи = Len(Один_друг) 'Определяется длина записи

Количество_записей = Размер_файла / Размер_записи 'Определяется количество записей в файле

If Количество_записей = 0 Then Exit Sub

ReDim Друзья(Количество_записей) 'Задается размерность динамического массива

For j = 1 To Количество_записей 'Данными из файла заполняется массив

Get #1, j, Один_друг 'Чтение записи

Друзья(j).BirthDay = Один_друг.BirthDay

Друзья(j).Fam = Один_друг.Fam

Друзья(j).Name = Один_друг.Name

Друзья(j).Telephone = Один_друг.Telephone

Next j

Call View_All 'Вызов процедуры для вывода массива в объект ListView

End Sub

Private Sub View_All()

Dim j As Integer 'счетчик цикла

For j = 1 To Количество_записей

Call Add_Record(j) 'Вызов процедуры для заполнения объекта ListView элементами списка

Next j

End Sub

Private Sub Add_Record(Index As Integer) 'Процедура заполнения объекта ListView

Dim ElementSpiska As ListItem

Set ElementSpiska = ListView1.ListItems.Add(,, Str(Index), 0, 0)

ElementSpiska.SubItems(1) = Trim(Друзья(Index).Fam)

ElementSpiska.SubItems(2) = Trim(Друзья(Index).Name)

ElementSpiska.SubItems(3) = Format(Друзья(Index).BirthDay, "Long Date")

ElementSpiska.SubItems(4) = Str(Друзья(Index).Telephone)

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim j As Integer 'Счетчик цикла

Close #1 'Закрытие файла

If Del = True Then 'Если производилось удаление записей,

Kill "Friends.txt" 'удаляется старый файл

Open "Friends.txt" For Random As #1 Len = Len(Один_друг) 'Открывается новый файл с именем старого

For j = 1 To Количество_записей

Один_друг.BirthDay = Друзья(j).BirthDay

Один_друг.Fam = Друзья(j).Fam

Один_друг.Name = Друзья(j).Name

Один_друг.Telephone = Друзья(j).Telephone

Put #1, j, Один_друг 'Перезапись файла после удаления

Next j

Close #1 'Закрытие файла

End If

End Sub

Private Sub cmdAdd_Click() 'Процедура добовления записей

Количество_записей = Количество_записей + 1

Один_друг.Fam = txtFam.Text

Один_друг.Name = txtName.Text

Один_друг.BirthDay = DTPicker1.Value

Один_друг.Telephone = Val(txtTelephone.Text)

Put #1, Количество_записей, Один_друг 'запись в файл (дополнение)

ReDim Preserve Друзья(Количество_записей) 'Переопределение массива

Друзья(Количество_записей).BirthDay = Один_друг.BirthDay 'дополнение массива

Друзья(Количество_записей).Fam = Один_друг.Fam

Друзья(Количество_записей).Name = Один_друг.Name

Друзья(Количество_записей).Telephone = Один_друг.Telephone

Call FormClear 'Вызов процедуры очистки полей ввода

Call Add_Record(Количество_записей) 'Вызов процедуры для дополнения объекта ListView новой записью

End Sub

Private Sub FormClear() 'Процедура очистки полей ввода

txtFam.Text = ""

txtName.Text = ""

DTPicker1.Value = Date 'Поле объекта заполняется значением текущей даты

txtTelephone.Text = ""

End Sub

Private Sub cmdFind_Click() 'Процедура поиска по фамилии

Dim find As Boolean 'переменная показывает найдена ли запись

Dim j As Integer

For j = 1 To Количество_записей

If txtFind.Text = Trim(Друзья(j).Fam) Then

MsgBox Trim(Друзья(j).Fam) + Chr(13) + Trim(Друзья(j).Name) + Chr(13) + Str(Друзья(j).BirthDay) + Chr(13) + Str(Друзья(j).Telephone), vbInformation, "Найдено!"

find = True

End If

Next j

If find = False Then

MsgBox "Такой фамилии нет!", vbExclamation, "Пусто!"

End If

End Sub

Private Sub cmdDelete_Click()

Dim NumRec As Integer

Dim j As Integer

NumRec = Val(txtNumRec.Text)

If NumRec > Количество_записей Or NumRec = 0 Then

MsgBox "Неверный номер записи!", vbExclamation, "Ошибка!"

Exit Sub

End If

ListView1.ListItems.Clear 'Очистка объекта

For j = NumRec To Количество_записей — 1 'Удаление элемента из массива

Друзья(j).Fam = Друзья(j + 1).Fam

Друзья(j).Name = Друзья(j + 1).Name

Друзья(j).Telephone = Друзья(j + 1).Telephone

Друзья(j).BirthDay = Друзья(j + 1).BirthDay

Next j

Количество_записей = Количество_записей — 1

Del = True

If Количество_записей = 0 Then Exit Sub

ReDim Preserve Друзья(Количество_записей)

Call View_All

End Sub

7. Сохраните проект и форму в папке ЛАБ16 с именами Лр16_Зад2_P_Записная_ книжка и Лр16_Зад2_F_ Записная_ книжка соответственно.

8.Проверьте работу приложения.

9. Создайте exe-файл (Записная книжка.exe).

10. Дополнить проект возможностью вывода списка фамилий всех друзей, родившихся в заданном Вами месяце.