Опубликован: 25.06.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Учебный центр "ANIT Texno Inform"
Самостоятельная работа 2:

Блокнот - шифратор

< Лекция 16 || Самостоятельная работа 2: 123 || Лекция 17 >
Аннотация: Данная лабораторная работа закрепляет пройденный материал и показывает на практике реализацию текстового редактора - прототипа стандартного Блокнота Windows. В лекции рассматривается включение модуля стороннего разработчика, практическое применение четырех диалогов.

Цель лекции

Закрепление работы с диалогами, модулями и компонентом TMemo.

Постановка задачи

Написать простой Блокнот, пусть даже со всеми возможностями стандартного Блокнота Windows, было бы скучновато. Вот если еще научить его шифровать/дешифровать текст, да еще и с переменным ключом-паролем - совсем другой разговор! Идея такова: делаем Блокнот, добавляем к нему модуль стороннего разработчика, в котором реализованы процедуры шифрации и дешифрации текста. Причем для шифрации/дешифрации требуется ввести пароль - слово или даже фразу. И если хоть один символ пароля будет неверен, текст не расшифруется! Затем вы сможете раздать такой Блокнот всем желающим, но прочитать ваш зашифрованный текст сможет лишь тот, кто знает пароль. Приступим?

Реализация

Подготовка формы очень проста, набор компонентов тоже не очень велик. Для начала откройте Lazarus с новым проектом. Скорее всего, вы эту программу будете передавать друзьям, поэтому имеет смысл сразу же отключить от проекта вставку отладочной информации. Если вы помните, нужно выбрать команду "Проект -> Параметры проекта", в разделе "Параметры компилятора" перейти на подраздел "Компоновка" и убрать флажок "Генерировать отладочную информацию для GDB".

Далее, как обычно, форму называем fMain, сохраняем проект в папку 18-01 под именем CodeBook, модулю главной формы присваиваем имя Main.

Теперь займемся самой формой. Блокнот Windows имеет возможность менять свой размер, минимизировать и максимизировать окно, оставим такую возможность и нашему Блокноту. Однако по умолчанию, Lazarus выводит слишком маленькое окно. Давайте сделаем окно среднего размера. Пусть будет Height = 500, а Width = 750, и расположите его примерно посреди окна. В свойстве Caption напишите "Блокнот - шифровальщик".

Далее, установим на форму компонент TMemo, имя оставим по умолчанию - Memo1, свойство Align установите в alClient. Текст в окне слишком мелкий, откройте кнопкой "" редактор свойства Font и выберите шрифт Times New Roman с размером 12 (или любой другой, какой вам понравится больше, только не забывайте, что не у всех пользователей хорошее зрение!). Теперь кнопкой "" зайдите в редактор свойства Lines и сотрите там весь текст - нам вовсе не нужно, чтобы при открытии программы отображался текст "Memo1", правда?

Займемся остальными компонентами. Нам потребуются диалоги: TOpenDialog, TSaveDialog, TFontDialog и TColorDialog. Поскольку нам придется в коде обращаться к ним по имени, измените их свойства Name соответственно, на OD, SD, FD и CD.

Кроме того, для TOpenDialog и TSaveDialog сделайте следующие настройки:

Filter=Текстовые файлы|*.txt|Все файлы|*.*
DefaultExt=.txt
    

Ну, и напоследок, нам потребуется главное меню TMainMenu. Имя самого компонента можно оставить без изменений - MainMenu1, а вот пункты этого меню будем переименовывать. Некоторым подпунктам меню будем присваивать "горячие клавиши". Первым в таблице идут параметры разделов (выделяются жирным шрифтом), затем параметры их подразделов. Подпункты-разделители, в которых будет отражаться разделительная линия, будем называть нейтрально: N1, N2, и т.д. Итак, создаем следующие пункты и подпункты:

Таблица 18.1. Параметры разделов и подразделов главного меню
Name Caption ShortCut
Раздел "Файл"
FileMenu Файл
FileCreate Создать Ctrl+N
FileOpen Открыть Ctrl+O
FileSave Сохранить Ctrl+S
FileSaveAs Сохранить как…
N1 -
FileExit Выход
Раздел "Правка"
EditMenu Правка
EditCancel Отменить Ctrl+Z
N2 -
EditCut Вырезать Ctrl+X
EditCopy Копировать Ctrl+C
EditPaste Вставить Ctrl+V
EditDelete Удалить
N3 -
EditSelectAll Выделить всё Ctrl+A
Раздел "Формат"
FormatMenu Формат
FormatFont Шрифт
FormatColor Цвет
N4 -
FormatWordWrap Перенос по словам
Раздел "Кодирование"
CoderMenu Кодирование
CoderCode Шифровать
CoderDecode Дешифровать
Раздел "Справка"
HelpMenu Справка
HelpAbout О программе

В результате у вас должно получиться такое меню:

Открытый раздел меню "Правка"

Рис. 18.1. Открытый раздел меню "Правка"

Нам нужно, чтобы по умолчанию, наш Блокнот делал перенос по словам. Для этого понадобится сделать три вещи:

  1. Установить в Memo1 вертикальную полосу прокрутки (ScrollBars=ssVertical).
  2. Убедиться, что его свойство WordWrap (перенос по словам) установлено в True.
  3. Поставить флажок на пункт меню "Формат->Перенос по словам". Для этого в Редакторе меню выделите данный пункт, и установите True в его свойстве Checked. Результат можно будет посмотреть, закрыв редактор меню, и открыв само главное меню:
Выделенный флажком пункт меню

Рис. 18.2. Выделенный флажком пункт меню

Поскольку стандартный Блокнот Windows не имеет картинок в главном меню, мы их тоже привязывать не будем. Впрочем, если есть желание, вы можете самостоятельно добавить TImageList и украсить меню картинками. Как это делать, мы обсуждали в "Организация меню и панелей инструментов" .

Ну вот, все компоненты мы подготовили, и настроили, как нужно. Но прежде чем перейдем непосредственно к кодированию, подготовим модуль. Я обнаружил этот модуль в проекте DelphiWorld много лет назад, и несколько раз использовал, чтобы зашифровать ключи активации программ. Основная часть модуля написана на языке Ассемблер, однако для использования этого модуля знание Ассемблера нам не требуется. Поскольку автор выложил модуль в открытый доступ (спасибо ему большое за это), мы с вами можем использовать его в своих программах с чистой совестью.

< Лекция 16 || Самостоятельная работа 2: 123 || Лекция 17 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...