Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Приклад виконання програми роботи з файлом
Як приклад розглядається програма, під час виконання якої можна ввести дані про господарські операції реалізації товарів - дата реалізації, покупець, найменування товару, ціна, кількість. Введені дані можна записати у файл довільного доступу realiz.doc. Форма програми вміщує кнопки для переходу до попереднього, наступного запису файлу. Коли переміщення неможливе - виконано перехід до початку або кінця файлу, видається відповідне повідомлення. Програма також дає змогу додати новий запис до файлу, знищити непотрібні записи файлу.
Рисунок 6.1 - Вид вікна програми для роботи з файлом довільного доступу
На етапі візуальної розробки програми слід створити об'єкти за описом.
Об’єкт
| Властивість
| Значення
| Форма (Form)
| Name
| frmProgram
| Caption
| Програма - приклад
| Font
| Times New Roman, 12 п., напівжирний
| Етикетка (Label)
| Name
| lblDate
| Caption
| Дата реалізації:
| Етикетка (Label)
| Name
| lblPok
| Caption
| Покупець:
| Етикетка (Label)
| Name
| lblTov
| Caption
| Найменування товару:
| Етикетка (Label)
| Name
| lblC
| Caption
| Ціна:
| Етикетка (Label)
| Name
| lblK
| Caption
| Кількість:
| Текстове поле (TextBox)
| Name
| txtDate
| Text
| “_”
| Текстове поле (TextBox)
| Name
| txtPok
| Text
| “_”
| Текстове поле (TextBox)
| Name
| txtTov
| Text
| “_”
| Текстове поле (TextBox)
| Name
| txtC
| Text
| “_”
| Текстове поле (TextBox)
| Name
| txtK
| Text
| “_”
| Командна кнопка (CommandButton)
| Name
| cmdNew
| Caption
| Новий запис
| Командна кнопка (CommandButton)
| Name
| cmdNext
| Caption
| Наступний запис
| Командна кнопка (CommandButton)
| Name
| cmdPrivious
| Caption
| Попередній запис
| Командна кнопка (CommandButton)
| Name
| cmdDelete
| Caption
| Знищення запису
| Командна кнопка (CommandButton)
| Name
| cmdFin
| Caption
| Завершення роботи
| Далі слід у вікні модуля (команда меню Project - Add Module), оголосити новий тип даних:
Дані в рядку коду
| Коментар
| Type Zap
|
| Date As String * 12
| поле для дати реалізації
| Pok As String * 20
| поле для роботи з найменуванням покупця
| Tov As String * 20
| поле найменування товару
| C As String * 10
| поле ціни
| K As String * 10
| поле кількості
| End Type
|
|
Програмний код повинен бути таким як у таблиці:
Дані в рядку коду
| Коментар
|
|
| Option Explicit
Dim Z As Zap
| Оголошення змінних є обов'язковим
Змінна Z типу Zap буде використана для зчитування даних з файлу, запису інформації в файл
| Dim LastRec As Long
| Змінна - покажчик останнього запису файлу
| Dim CurRec As Long
| Змінна - покажчик поточного запису файлу
| Dim NFile As Integer
| Змінна для збереження номеру відчиненого файлу (дескриптору файлу)
| Dim RZ As Long
| Розмір файлу
| Private Sub frmProgram _Load()
| Процедура, яка виконується при завантаженні форми (подія Load)
| RZ = Len(Z)
| Значення змінної RZ буде дорівнювати розміру змінної - запису Z, значення отримано функцією Len()
| NFile = FreeFile
| Змінна Nfile отримує значення номеру вільного в дану мить файлу
| Open "realiz.doc" For Random As NFile Len = RZ
| Відчиняється файл realiz.doc, що міститься в поточній папці, у режимі довільного доступу (Random) як файл з номером Nfile і розміром запису RZ. Якщо файл не буде знайдено, система його створить і відкриє.
| CurRec = 1
| Покажчик поточного запису CurRec отримує значення 1.
| LastRec = FileLen("realiz.doc") / RZ
| Покажчик останнього запису LastRecотримує значення - розмір файлу "realiz.doc", що визначається за допомогою функції FileLen(), який буде поділено на довжину запису RZ.
| If LastRec = 0 Then
| Якщо номер останнього запису дорівнює 0, то
| LastRec = 1
| змінній LastRec привласнюється значення 1
| End If
| Кінець оператору If
| ShowZ
| Виклик процедури ShowZ для виведення у вікні вмісту поточного запису файлу.
| End Sub
| Кінець процедури.
|
|
| Public Sub ShowZ()
| Процедуру для зчитування запису з файлу і виведення даних у формі слід створити за допомогою команди меню Tools - Add Procedure.
| Get #NFile, CurRec, Z
| Оператором зчитується поточний запис CurRecфайлу з номером NFile у змінну Z.
| txtDate.Text = Trim(Z.Date)
| Властивості Text текстового поля txtDate для роботи з датою привласнюється значення поля Date змінної Z. Функція Trim() знищує пробіли у кінці текстового рядка.
| txtPok.Text = Trim(Z.Pok)
| Властивості Text текстового поля txtPokдля виведення, редагування найменування покупця привласнюється значення поля Pokзмінної Z.
| txtTov.Text = Trim(Z.Tov)
| Властивості Text текстового поля txtTovдля роботи з найменуванням товару привласнюється значення поля Tovзмінної Z.
| txtC.Text = Trim(Z.C)
| Властивості Text текстового поля txtCдля виведення, редагування ціни товару привласнюється значення поля Cзмінної Z.
| txtK.Text = Trim(Z.K)
| Властивості Text текстового поля txtKдля роботи з кількістю товару привласнюється значення поля Kзмінної Z.
| frmProgram.Caption = "Запис " + Str(CurRec) + " / " + Str(LastRec)
| У заголовку вікна програми виводиться: Запис <номер поточного запису> / <загальна кількість записів у файлі>
| End Sub
| Кінець процедури.
| Public Sub SaveZ()
| Процедура буде виконувати запис даних у файл.
| Z.Date = txtDate.Text
| Полю Date змінної Z привласнюється значення властивості Text об'єкту txtDate, яке може бути введено, відредаговано.
| Z.Pok = txtPok.Text
| Полю Pok змінної Z привласнюється значення властивості Text об'єкту txtPok.
| Z.Tov = txtTov.Text
| Полю Tov змінної Z привласнюється значення властивості Text об'єкту txtTov.
| Z.C = txtC.Text
| Полю C змінної Z привласнюється значення властивості Text об'єкту txtC.
| Z.K = txtK.Text
| Полю K змінної Z привласнюється значення властивості Text об'єкту txtK.
| Put #NFile, CurRec, Z
| Запис у файл realiz.doc (файл з номером Nfile) у запис з номером CurRec умісту змінної Z.
| End Sub
| Кінець процедури.
|
|
| Private Sub cmdNew_Click()
| Процедуру буде виконано, якщо клацнути на кнопці Новий запис.
| SaveZ
| Виконання процедури SaveZ - збереження у файл поточного запису файлу.
| LastRec = LastRec + 1
| Покажчик останнього запису файлу LastRecзбільшується на 1.
| Z.Date = " "
| Знищується вміст полів змінної - запису Z
| Z.Pok = " "
|
| Z.Tov = " "
|
| Z.C = " "
|
| Z.K = " "
|
| Put #NFile, LastRec, Z
| До файлу додається новий запис (запис з номером LastRec) зі змінної Z.
| CurRec = LastRec
| Покажчик поточного запису приймає значення LastRec.
| ShowZ
| Виконується процедура ShowZ- виведення вмісту поточного запису файлу у вікні програми.
| End Sub
| Кінець процедури.
| Private Sub cmdNext_Click()
| Процедуру буде виконано, якщо клацнути на кнопці Наступний запис.
| If CurRec = LastRec Then
| Якщо покажчик поточного запису CurRecдорівнює покажчику останнього запису LastRec, то
| Beep
| видається звуковий сигнал
| MsgBox "Кiнець файлу!", vbOKOnly + vbExclamation
| на екрані з'являється вікно повідомлення, що вже досягнуто кінця файлу (тобто перехід до наступного запису неможливий)
| Else
| інакше
| SaveZ
| виконується процедура SaveZзбереження даних, що введено або відредаговано у вікні програми, у поточному записі файлу
| CurRec = CurRec + 1
| покажчик поточного запису збільшується на одиницю
| ShowZ
| виконується процедура ShowZзчитування запису CurRecз файлу і виведення інформації, що отримана, у вікні програми
| End If
| кінець оператору If.
| txtDate.SetFocus
| Текстове поле txtDate отримує фокус - поле стає активним, курсор буде розташовано в полі.
| End Sub
| Кінець процедури.
|
|
| Private Sub cmdPrivious_Click()
| Процедуру буде виконано, якщо клацнути на кнопці Попередній запис.
| If CurRec = 1 Then
| Якщо покажчик поточного запису CurRecдорівнює одиниці, то
| Beep
| виводиться звуковий сигнал
| MsgBox "Початок файлу!", vbOKOnly + vbExclamation
| на екрані з'являється вікно повідомлення, що вже досягнуто початку файлу, перехід до попереднього запису неможливий
| Else
| інакше
| SaveZ
| зберігається поточний запис у файлі за допомогою процедури SaveZ
| CurRec = CurRec - 1
| покажчик поточного запису зменшується на 1
| ShowZ
| виконується процедура ShowZзчитування запису CurRecз файлу і виведення інформації, що отримана, у вікні програми
| End If
| кінець оператору If.
| txtDate.SetFocus
| Передача фокусу текстовому полю txtDate.
| End Sub
| Кінець процедури.
| Private Sub cmdDelete_Click()
| Процедуру буде виконано, якщо клацнути на кнопці Знищення запису.
| Dim TmpNFile
| Оголошення локальної змінної для збереження номеру тимчасового файлу, використовується для перезапису інформації під час знищення записів
| Dim TmpZ As Zap
| Оголошення змінної TmpZтипу Zap
| Dim RecN As Long
| Оголошення змінної RecN для роботи з номером запису файла realiz.doc.
| Dim TmpRecN As Long
| Оголошення змінної TmpRecNдля роботи з номером запису тимчасового файлу
| If MsgBox("Знищити запис?", vbYesNo) = vbNo Then
| Якщо у вікні повідомлення обрано кнопку Нет, то
| txtDate.SetFocus
| Текстове поле txtDate отримує фокус.
| Exit Sub
| Процедура завершує свою роботу.
| End If
| Кінець оператору If.
| If Dir("realiz.tmp") = "realiz.tmp" Then
| Якщо у поточному каталозі знайдено тимчасовий файл realiz.tmp, то
| Kill "realiz.tmp"
| файл realiz.tmp знищується
| End If
| Кінець оператору If.
| TmpNFile = FreeFile
| Змінна TmpNFileотримує номер вільного файлу
| Open "realiz.tmp" For Random As TmpNFile Len = RZ
| Розчиняється тимчасовий файл як файл довільного доступу з номером файлу TmpNFileі довжиною запису RZ.
| RecN = 1
| Змінна RecN отримує значення 1
| TmpRecN = 1
| Змінна TmpRecNотримує значення 1
| Do While RecN < LastRec + 1
| Цикл діє доки RecN < LastRec + 1 (LastRec - номер останнього запису файлу realiz.doc)
| If RecN <> CurRec Then
| Якщо номер запису файлу realiz.tmp не дорівнює номеру поточного запису файлу realiz.doc (запис, що знищується), то
| Get #NFile, RecN, TmpZ
| у змінну TmpZ зчитується запис файлу realiz.doc з номером RecN
| Put #TmpNFile, TmpRecN, TmpZ
| записується запис з номером TmpRecN у файл realiz.tmp
| TmpRecN = TmpRecN + 1
| змінна TmpRecN збільшується на 1
| End If
| Кінець оператору If.
| RecN = + 1
| Змінна RecN збільшується на 1щоразу крім ітерації циклу коли обробляється запис з номером CurRec - той, що слід знищити.
| Loop
| Кінець оператору циклу.
| Close NFile
| Зачиняється файл realiz.doc.
| Kill "realiz.doc"
| Знищується файл realiz.doc.
| Close TmpNFile
| Зачиняється файл realiz.tmp.
| Name "realiz.tmp" As "realiz.doc"
| Перейменовується файл realiz.tmp у файл realiz.doc.
| NFile = FreeFile
| Визначається номер вільного файлу
| Open "realiz.doc" For Random As NFile Len = RZ
| Розчиняється файл realiz.doc, що міститься в папці диску С:, у режимі довільного доступу (Random) як файл з номером Nfile і розміром запису RZ. Якщо файл не буде знайдено, система його створить і розчинить.
| LastRec = LastRec - 1
| Зменшується значення покажчика останнього запису файлу LastRecоскільки один запис знищено.
| If LastRec = 0 Then LastRec = 1
| Якщо LastRec = 0 (у файлі не залишилось записів), то LastRec привласнюється значення 1.
| If CurRec > LastRec Then
| Якщо покажчик поточного запису файлу виходить за межи файлу, то
| CurRec = LastRec
| йому привласнюється значення LastRec
| End If
| Кінець оператору If.
| ShowZ
| Виконується процедура ShowZзчитування запису CurRecз файлу і виведення інформації, що отримана, у вікні програми
| txtDate.SetFocus
| Передача фокусу текстовому полю txtDate.
| End Sub
| Кінець процедури.
| Private Sub cmdFin_Click()
| Процедуру буде виконано, якщо клацнути на кнопці Завершення роботи.
| SaveZ
| Збереження даних у поточному записі файлу.
| Close #NFile
| Зачинення файлу realiz.doc.
| End
| Кінець програми.
| End Sub
| Кінець процедури.
|
5.4 Контрольні запитання
1. Як інформація розташовується в файлі довільного доступу?
2. Як розчинити файли довільного, послідовного доступу, бінарні файли?
3. Що таке номер вільного файлу (дескриптор файлу)?
4. Як визначити розмір файлу?
5. Які оператори використовується для зчитування – запису даних у файл довільного доступу?
6. Які відмінності є в роботі операторів Print і Write? При роботі з якими файлами вони використовуються?
7. Як виконати зчитування даних з файлу послідовного доступу?
8. У чому схожість між файлами довільного доступу і бінарними файлами?
Практичні завдання
Завдання №1
Розробити програму, яка дає змогу записати дані про нормативний залишок товарів у файл послідовного доступу. Запис файлу повинна вміщувати найменування товару і норматив залишку товару на складі. Запис і редагування даних слід здійснювати у одному вікні, після роботи з яким файл обов’язково слід зачинити. Інше вікно програми повинно використовуватися для того, щоб на основі введених найменування товару і його фактичного залишку можна було зробити висновок про відхилення залишку конкретного товару від нормативу. При завантаженні вікна програми треба відкрити файл з нормативними, прочитати усі записи файлу в масив змінних – записів.
Завдання №2
Розробити програму для запису в файл послідовного доступу дані про 8 співробітників підприємства: прізвище та ініціали, освіта, стаж роботи, оклад.
Якщо файл вже існує, програма повинна давати змогу прочитати данні в масив змінних, обрати одного співробітника за такими критеріями: найбільший стаж роботи, найвищий оклад.
Рисунок 6.2 - Вікна програми
Завдання №3
Створити програму, яка призначена для зчитування даних з текстового файлу, що створено за допомогою програми “Блокнот”, виведення інформації у вікні програми. Користувач повинен мати змогу ввести маршрут пошуку та ім’я файлу.
|