
- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Пример 17
Пусть имеется некоторый текст, его необходимо занести в текстовый файл, зашифровать, переписывая в другой файл, и, таким образом, подготовить для отправки, например, по электронной почте.
Пусть шифрование производится методом простой одноалфавитной подстановки. Все символы исходного файла заменяются кодами, отличающимися от исходных символов на определенную величину, которая меняется от символа к символу. Для кодирования с помощью генератора случайных чисел создается кодировочная таблица, например, из 23 чисел (адресат знает о числе 23). Эта таблица представляет собой алфавит кодирования. Текст разбивается на группы символов, включая 13 10, и каждый символ изменяется в соответствии с кодировочной таблицей, т.е. код первого символа увеличивается на первое число из таблицы, код второго - на второе число из таблицы и т.д. Для осуществления дешифровки кодировочную таблицу также необходимо записать в итоговый файл.
Компонент tmainmenu
При решении данной задачи построим меню с помощью компонента TMainMenu. Это меню можно представить в виде табл. 13. Список объектов меню (строк меню, табл. 13) в TMainMenu содержится в свойстве Items. Строки меню имеют тип TMenuItems. TmenuItems в свою очередь содержит свойство Items, с помощью которого можно создавать подменю. Текст строки меню записывается в свойстве Caption свойства Items.
Таблица 13
Меню примера 17 (Caption).
Исходный файл |
Кодирование |
Проверка |
Выход |
|
|
|
|
Новый файл |
Таблица кодировки |
|
|
Добавить |
Кодирование файла |
|
|
Прочитать |
|
|
|
В табл. 14 приводятся варианты имён пунктов меню, которые используются далее в программе.
Таблица 14
Имена (Name) пунктов меню в программе.
MainFile |
CodeFile |
InfoCompare |
ExitPoint |
|
|
|
|
NewFile |
CodeTabl |
|
|
AddFile |
InfoCode |
|
|
ReadFile |
|
|
|
С активизацией меню связано событие OnClick. Данное событие выполняется, когда пользователь, выбирает какой либо пункт меню. К каждому пункту меню необходимо привязать свой обработчик. Для придания меню более привлекательного вида можно добавлять разделительные полосы (достаточно задать одним символом минус “-“). При проектировании меню с помощью редактора меню (рис. 37) необходимо выбрать имена (свойство Name) пунктам меню (табл. 14).
Рис. 36 Редактор меню.
В пункте меню можно назначить быструю клавишу, для этого перед каким-либо символом нужно поставить символ &, например &Close, и можно вызывать пункт меню в данном случае с помощью Alt + C (первая буква слова Close). Пункту меню можно назначить горячую клавишу, тогда в любое время можно выполнить данный пункт меню. Для этого нужно воспользоваться свойством ShortCut. Пункт меню можно сделать недоступным, если в процессе выполнения свойству Enabled задать false. С помощью Visible можно скрыть любой пункт меню или подменю. Свойство Checked, позволяет отмечать флажком последний выбранный пункт меню.
Форма примера 17 приводится на рис. 38.
Рис. 37 Форма к примеру 17.
Справа на компоненте Memo1 формы примера 17 находится изображение компонента MainMenu1, которое будет невидимым при выполнении программы. Ниже приводится программный код примера.
unit Prim17;
interface
uses Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, Buttons;
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
MainFile: TMenuItem;
CodeFile: TMenuItem;
InfoCompare: TMenuItem;
ExitPoint: TMenuItem;
NewFile: TMenuItem;
AddFile: TMenuItem;
ReadFile: TMenuItem;
CodeTabl: TMenuItem;
InfoCode: TMenuItem;
Panel1: TPanel;
Memo1: TMemo;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
procedure NewFileClick(Sender: TObject);
procedure ExitPointClick(Sender: TObject);
procedure AddFileClick(Sender: TObject);
procedure ReadFileClick(Sender: TObject);
procedure CodeTablClick(Sender: TObject);
procedure InfoCodeClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure InfoCompareClick(Sender: TObject);
end;
Const n=25;
stext='Ошибка открытия файла';
Type TTableCode=array [1..n] of char;
var MainForm: TMainForm;
TableCode:TTableCode;
T: TextFile;
F: File of TTableCode;
FNoType: File;
implementation
{$R *.DFM}
procedure TMainForm.NewFileClick(Sender: TObject);
begin
Panel1.Visible:=true;
BitBtn2.Visible:=true;
memo1.SetFocus;
end;
procedure TMainForm.ExitPointClick(Sender: TObject);
begin
close;
end;
procedure TMainForm.AddFileClick(Sender: TObject);
begin
Panel1.Visible:=true;
BitBtn2.Visible:=true;
Memo1.Lines.LoadFromFile('Inpfil.txt');
memo1.SetFocus;
end;
procedure TMainForm.ReadFileClick(Sender: TObject);
var str:string;
begin
{$I-}
AssignFile(T,'Inpfil.txt');
reset(T);
{$I+}
if IOResult<>0 then begin
MessageDlg(sText,mtError,[mbOk],0);
exit;
end;
Panel1.Visible:=true;
BitBtn2.Visible:=true;
while not eof(T) do begin
readln(T,str);
Memo1.Lines.Add(str);
end;
CloseFile(T);
memo1.SetFocus;
end;
procedure TMainForm.CodeTablClick(Sender: TObject);
var i: byte;
str:string;
begin
Randomize;
for i:=1 to n do
TableCode[i]:=char(Random(256));
Panel1.Visible:=true;
BitBtn2.Visible:=false;
str:='';
for i:=1 to n do str:=str+TableCode[i]+' ';
Memo1.Lines.Add(str);
end;
procedure TMainForm.InfoCodeClick(Sender: TObject);
var i,res: integer;
Buffer,Buf:TTableCode;
str: string;
k: byte;
begin
{$I-}
AssignFile(F,'Outfil.dat');
rewrite(F);
if IOResult<>0 then begin
MessageDlg(sText,mtError,[mbOk],0);
exit;
end;
AssignFile(FNoType,'Inpfil.txt');
reset(FNoType,1);
{$I+}
if IOResult<>0 then begin
MessageDlg(sText,mtError,[mbOk],0);
CloseFile(F);
exit;
end;
Write(F,TableCode);
Panel1.Visible:=true;
BitBtn2.Visible:=false;
while not eof(FNoType) do begin
BlockRead(FNoType,Buffer,n,res);
str:='';
for i:=1 to n do begin
if i<=res then begin
k:=ord(Buffer[i])+ord(TableCode[i]);
Buf[i]:=chr(k);
end else Buf[i]:=TableCode[i];
str:=str+Buf[i]+' ';
end;
Memo1.Lines.Add(str);
Write(F,Buf);
end;
CloseFile(FNoType);
CloseFile(F);
end;
procedure TMainForm.BitBtn1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
Panel1.Visible:=false;
end;
procedure TMainForm.BitBtn2Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile('Inpfil.txt');
BitBtn1Click(Sender);
end;
procedure TMainForm.InfoCompareClick(Sender: TObject);
var i: integer;
Buf:TTableCode;
str:string;
k: byte;
begin
{$I-}
AssignFile(F,'Outfil.dat');
reset(F);
{$I+}
if IOResult<>0 then begin
MessageDlg(sText,mtError,[mbOk],0);
exit;
end;
Panel1.Visible:=true;
BitBtn2.Visible:=false;
str:='';
seek(F,1);
while not eof(F) do begin
read(F,Buf);
for i:=1 to n do begin
k:=ord(Buf[i])-ord(TableCode[i]);
if k=10 then begin
Memo1.Lines.Add(str);
str:='';
end else str:=str+chr(k);
end;
end;
CloseFile(F);
end;
end.
Следует отметить, что в данной программе происходит управление доступом к Panel1 и кнопке BitBtn2 (отдельно) с помощью свойств Visible.
В примере 17 используются два файла: текстовый - InpFil.txt и типизированный - OutFil.dat. Для работы с этими файлами введены три файловые переменные. Текстовый файл открывается как стандартный текстовый для корректировки и просмотра и как файл без типа, чтобы посимвольно прочитать информацию и закодировать её. Для кодирования введена переменная k типа Byte. Обратить внимание, что при сложении, возможно, может получиться значение, выходящее за пределы диапазона этого типа, т.е. более 255. Однако перекодирование происходит корректно, так как при вычитании также происходит выход за пределы диапазона и прежнее число восстанавливается (поэксперементировать с подобными способами сложения и вычитания, используя отдельную программу). При добавлении или занесении новой информации через компонент Memo необходимо в конце текста обязательно набирать Enter.