- •5.05150104 "Дизайн друкованої продукції"
- •Урок 8. Запис і читання даних
- •Робота з ascii -файлами
- •Мал. 8.1. Ascii - файл з роздільниками.
- •Послідовний доступ
- •Мал. 8.2. Зразок послідовного файлу.
- •Мал. 8.3. Перегляд результатів.
- •Довільний доступ
- •Двійковий доступ
- •Проста програма шифрування
- •Мал. 8.4. Запис в текстовому файлі.
- •Мал. 8.5. Форма для програми шифрування.
- •Мал. 8.6. Стандартне діалогове вікно.
- •Елементи даних
- •Використання елементу даних
- •Властивості елементу даних
- •Мал. 8.8. Властивості елементу даних
- •Анатомія бази даних
- •Створення баз даних в Visual Data Manager
- •Мал. 8.9. Вікно бази даних із розширеними властивостями
- •Створення таблиці
- •Конструювання таблиці
- •Мал. 8.10. Діалогове вікно Table Structure.
- •Створення полів
- •Мал. 8.11. Діалогове вікно AddField.
- •Введення даних
- •Створення запиту
- •Мал. 8.12. Діалогове вікно Query Builder.
- •Мал. 8.13. Результати запиту.
- •Первинні ключі
- •Лічильники
- •Числові поля
- •Грошові поля
- •Логічні поля
- •Поля Memo
- •Поля дати/часу
- •Зміна таблиці
- •Технологія ado (ActiveX Data Objects)
- •Мал. 8.14. Моделъ ado.
- •Використання елементу даних ado
- •Мал. 8.15. Діалогове вікно сторінок властивостей елементу даних ado
- •Puc. 8.16. Вибір провайдера
- •Мал. 8.17. Вибір файлу бази даних
- •Мал. 8.18. Завдання властивості RecordSource
- •Використання об'єктів підключення і набору записів ado
- •Puc. 8.19. Створення посилання на бібліотеку типів ado
- •Додавання записів
- •Оновлення записів
- •Видалення записів
- •Що нового ми дізналися?
- •9 Урок. Друкування
- •Виведення даних на друкування
- •Метод Print
- •Перегляд значень у вікні безпосередніх обчислень
- •Перегляд помилок у вікні безпосередніх обчислень
- •Мал. 9.1. Вікно безпосередніх обчислень з інформацією про помилку.
- •Виправлення помилки
- •Метод PrintForm
- •Колекція Printers
- •Мал. 9.2. Виведення вмісту колекції Printers. Використання Crystal Reports в Visual Basic
- •Мал. 9.4. Режим конструктора в Crystal Reports Установка Crystal Reports Pro
- •Створення звіту
- •Мал. 9.6. Зв'язки між таблицями
- •Мал. 9.7. Вкладка Fields
- •Puc. 9.8. Вибір поля для сортування
- •Мал. 9.9. Вкладка Total Мал. 9.10. Фільтрація записів в звіті
- •Мал. 9.11. Вибір стилю звіту
- •Мал. 9.12. Готовий звіт
- •Мал. 9.13. Режим конструювання
- •Використання звіту в додатку
- •Мал. 9.14. Звіт в режимі конструювання. Мал. 9.15. Діалогове вікно Property Pages для Crystal Reports 4.6.
- •Мал. 9.16. Додавання елементу Crystal Report.
- •Мал. 9.17. Виведення звіту з додатка. Друкування початкового тексту програми
- •Мал. 9.18. Діалогове вікно Print. Діалогове вікно Print
- •Перегляд результатів
- •Розшифровка лістингу
- •Що нового ми дізналися?
Мал. 8.5. Форма для програми шифрування.
5. Відкрийте вікно програми і виберіть із списку Object, що розкривається, рядок mnuFHeExit.
6. Додайте в процедуру події mnuFileExit_Click() оператор End.
7. Настав час запрограмувати алгоритм шифрування. Відкрийте секцію(Declarations) і додайте в неї наступний фрагмент:
Function Encrypt(infile As String) As Boolean
Dim fileno1 As Integer
Dim fileno2 As Integer
Dim outfile As String
Dim xpos As Long
Dim x As Byte
‘ Вивести покажчик у вигляді пісочного годинника
MousePointer = vbHourglass
xpos = 4
outfile = "c:\temp.enc"
fileno1 = FreeFile
Open infile For Binary As fileno1
fileno2 = FreeFile
Open outfile For Binary As fileno2
Put #fileno2, 1, 0
Put #fileno2, 2, 128
Put #fileno2, 3, 0
Put #fileno2, 4, 128
Do While Not EOF(fileno1)
xpos = xpos + 1
Get #fileno1, xpos, x
Get #fileno2, xpos, x + 128
Loop
Close fileno2
Close fileno1
‘ Видалити початковий файл і замінити його шифрованим
Kill infile
FileCopy outfile, infile
Kill outfile.
Encrypt = True
‘ Відновити покажчик миші
MousePointer = vbNormal
End Function
Цей фрагмент варто розглянути детальніше, оскільки саме в нім відбувається основна робота програми. Зверніть увагу на те, що замість процедури Sub використовується функція - річ у тому, що функція передає зухвалій процедурі код повернення. По йому можна визначити, чи успішно сталося шифрування, перш ніж повідомляти про це користувачеві або продовжувати виконання програми. Ця функція просто повертає True, якщо шифрування пройшло успішно, і False інакше. Крім того, функції передається параметр infile. Він містить повне ім'я шифрованого файлу. Значення infile визначається викликом функції GetFile().
Після стандартного оголошення змінних ми перетворюємо покажчик миші на пісочний годинник. Це означає, що користувач повинен почекати завершення поточної операції. Річ у тому, що побайтове читання файлу може виявитися досить довгим процесом.
Як згадувалося раніше, команда FreeFile використовується для отримання вільного файлового номера. Коли я працював над цим прикладом, в моїй програмі поряд стояли два оператори FreeFile. Я поступив так, оскільки прагну по можливості групувати логічно пов'язані команди. При запуску програми вона постійно видавала помилку "Файл вже відкритий". Чому? Я перевірив у відналадчику значення infile і outfile - вони були правильними. Мої файли не відкривалися іншими застосуваннями, тому вони не могли бути заблоковані іншою програмою. Після деяких роздумів я зрозумів, що файловий номер виділяється програмі не в операторові FreeFile, a при відкритті файлу оператором Open (FreeFile просто повідомляє, які файлові номери доступні в даний момент). У результаті я отримував один і той же номер для fileno1 і fileno2. Як тільки я перемістив команди FreeFile до відповідних операторів Open, програма запрацювала. Мораль: прагніть тримати виклик FreeFile як можна ближче до оператора Open, особливо якщо ваша процедура працює з декількома файлами. Як бачите, навіть просту програму іноді доводиться відналагоджувати!
Перш ніж приступати до безпосередньої обробки даних, ми додаємо в початок шифрованого файлу деяку подібність "електронного підпису". По їй алгоритм розшифровки визначає, чи дійсно файл зашифрований. Підпис має бути послідовністю байтів, яка практично ніколи не зустрічається у файлах. У своєму прикладі я використовував чотирьохбайтовий підпис 0, 128, 0, 128. Саме цю конкретну послідовність байтів шукатиме алгоритм дешифрування. Функції Encrypt і Decrypt можна додатково удосконалити, щоб електронний підпис генерувався прямо в них.
Зверніть увагу - змінна x має байтовий, а не цілий тип. Причина полягає в тому, що її максимальне значення не повинне перевищувати 255. Якщо при складанні x з іншим числом результат перевищить 255, значення x обнулюється, після чого підсумовування триває. Якщо скласти 128 і 128, вийде 256. Оскільки 256 більше, ніж 255, змінна x обнулюється - на цьому принципі заснований наш алгоритм шифрування. При дешифруванні файлу той же алгоритм відновлює початкові значення байтів. Якщо двічі додати 128 до будь-якого байта, ви отримаєте початкову величину, тобто зашифрований символ повернеться до колишнього стану.
У кінці функції стоять оператори Kill, які видаляють файли з диска. Після такої послідовності команд файл infile замінюється файлом outfile. B результаті у вас залишається зашифрований файл, а тимчасовий файл стирається з диска. Проте перед перейменуванням файлу необхідно потурбуватися про те, щоб ім'я результуючого файлу було унікальним, - саме з цієї причини ми видаляємо infile перед тим, як перейменовувати outfile. Після успішного перейменування outfile віддаляється з диска.
Шифрування завершене, тому ми відновлюємо колишній вид покажчика миші - користувач повинен зрозуміти, що програма готова до роботи. Функція Encrypt повертає значення True, щоб зухвала процедура могла нормально тривати.
1. Основа програми (функція шифрування) готова. Тепер необхідно створити процедуру, з якої вона викликатиметься. Для цього ми скористаємося процедурою події mnuEncrypt_Click():
Private Sub mnuActEncrypt_Click()
Dim filename As String
filename = GetFile()
If filename <> "" Then
If Encrypt(filename) = False Then
MsgBox "Помилка при шифруванні файлу"!
End If
End If
End Sub
2. Перед викликом функції Encrypt команда меню повинна отримати ім'я файлу за допомогою функції GetFile():
Function GetFile() As String
dlgFile.CancelError = True
On Error GoTo filerr
dlgFile.DialogTitle ="Виберіть файл.".
dlgFile.DefaultExt = "*.txt"
dlgFile.Filter = "Текстові файли (*.txt)|*, txt* _
Усі файли (*. *)|*.*"
dlgFile.FilterIndex = 1
dlgFile.MaxFileSize = 32767
dlgFile.ShowOpen
GetFile = dlgFile.filename
Exit Function
filerr:
GetFile = ""
End Function
Функцію GetFile() теж слід розглянути уважніше. У основі її лежить елемент стандартного діалогового вікна. Він надає усі засоби, необхідні для отримання імені файлу. Можливо, ви вже знаєте, що вікно Open, що зустрічається в багатьох застосуваннях, не відкриває файл - воно усього лише отримує і повертає додатку його ім'я. Потім інша процедура використовує це ім'я і відкриває файл для подальшої обробки. Наша програма поступає точно так же.
Робота функції GetFile() починається з того, що властивості CancelError привласнюється значення True. В цьому випадку при натисненні користувачем кнопки Cancel діалогове вікно посилає повідомлення про помилку. Ми перехоплюємо цю помилку, щоб у разі відміни програма не намагалася продовжувати шифрування. Процедура шифрування пропускається за допомогою команди On Еггог.
З естетичних міркувань ми задаємо властивості DialogTitle значення "Виберіть файл."., що робить нашу програму трохи наочнішою. Насправді в заголовок діалогового вікна можна помістити будь-який текст.
За умовчанням для файлів в діалоговому вікні вибирається розширення *.txt. Читачі, знайомі з командами DOS, зрозуміють, що з цим шаблоном у вікні відображуватимуться лише файли з розширенням .txt - це допомагає зосередити увагу користувача лише на файлах, що цікавлять його. Якщо у ваших застосуваннях використовуються стандартні діалогові вікна, прагніть спростити роботу користувача.
Після шаблону задається фільтр (властивість Filter). Він є рядком, в якому описи чергуються з фактичними значеннями фільтру, а як роздільник застосовується символ "вертикальна риса" (|). У нашому застосуванні, як і в багатьох інших, задано декілька фільтрів. Від вас вимагається лише правильно відділяти їх один від одного вертикальною рисою. Доступ до різних фільтрів здійснюється за допомогою властивості FilterIndex. FilterIndex - індекс поточного фільтру, що відображується в діалоговому вікні. Перший фільтр має індекс 1, другий - 2 і т. д. При завданні цієї властивості встановлюється лише початкове значення індексу. Поточний фільтр вибирається в діалоговому вікні (мал. 8.6).
