Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Мал. 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).
Мал. 8.6. Стандартне діалогове вікно. Зверніть увагу - властивості MaxFileSize задається значення 32 767. Якщо задати цю властивість, в діалоговому вікні відображуватимуться лише імена файлів розміром 32 До і менше. Цій властивості можна задати довільне значення, але необхідно потурбуватися про те, щоб файли, що відкриваються, не виходили за межі можливостей елементів. Втім, у виконуваних нами операціях розмір файлу ніде не обмежується, так що для цього додатку властивість MaxFileSize не має особливого значення. Нарешті, ми задаємо властивість ShowOpen, щоб відобразити діалогове вікно. Якщо користувач натискає кнопку Cancel, діалогове вікно повертає код помилки, а робота функції відміняється. Інакше властивості FileName задається ім'я файлу, вибраного користувачем, і це значення повертається функцією GetFile(). Якщо ім'я файлу не вибране, функція повертає порожній рядок. Давайте напишемо алгоритм дешифрування, який відновлюватиме початковий вид файлу: 1. Додайте наступний фрагмент: Private Function Decrypt(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 Dim t(3) As Byte
‘ Вивести покажчик у вигляді пісочного годинника MousePointer = vbHourglass
xpos = 4 outfile = " c: \temp.enc" fileno1 = FreeFile Open infile For Binary As fileno1 fileno2 = FreeFile Get #fileno1, 1, t(0) Get #fileno1, 2, t(1) Get #fileno1, 3, t(2) Get #fileno1, 4, t(3) If (t(0)=0 And t(1)=128 And t(2)=0 And t(3)=128) Then Open outfile For Binary As fileno2 Do While Not EOF(fileno1) xpos = xpos + 1 Get #fileno1, xpos, x Get #fileno2, xpos - 4, x + 128 Loop Close fileno2
Decrypt = True Else Decrypt = False End If
Close fileno1
‘ Видалити початковий файл і замінити його шифрованим If Decrypt Then Kill infile FileCopy outfile, infile Kill outfile End If
‘ Відновити покажчик миші MousePointer = vbNormal
End Function
Зверніть увагу на те, що ця функція майже співпадає з функцією шифрування. Перед розшифровкою файлу необхідно переконатися, що він починається з електронного підпису, тобто ланцюжки байтів 0, 128, 0, 128. В процесі шифрування програма вставляє її в початок зашифрованого файлу. Завдяки підпису додаток визначає, чи дійсно файл був зашифрований, перед тим, як намагатися розшифрувати його. 2. Додайте код для виклику функції Decrypt при виборі з меню відповідної команди:
Private Sub mnuActDecrypt_Click() Dim filename As String
filename = GetFile() If filename < > " " Then If Decrypt(filename) = False Then MsgBox " Помилка при розшифровці файлу"! End If End If End Sub
Програма готова - збережете і Запустіть її. Хоча нічого особливо ефектного не відбувається, цей приклад наочно показує, як відбуваються запис і читання файлів з диска. Тепер ви маєте достатній досвід роботи з файлами і зможете застосовувати їх у своїх програмах.
|