alph['Х']:= 'kh';
alph['Ц']:= 'c';
alph['Ч']:= 'ch';
alph['Ш']:= 'sh';
alph['Щ']:= 'shh';
alph['Ъ']:= '''''';
alph['Ы']:= 'y';
alph['Ь']:= '''';
alph['Э']:= 'eh';
alph['Ю']:= 'ju';
alph['Я']:= 'ja';
end;
Обработчики событий для кнопок:
· Кнопка
(редактировать алфавит), событие acAlphEditЛистинг 4. «Обработчик события нажатия на кнопку Редактировать алфавит»
procedure TMainForm.acAlphEditExecute(Sender: TObject);
begin
SlovarForm.show;
end;
· Кнопка
(Открыть фаил в окно кириллици) acCyrOpenВыполняет диалог OpenDialog и загружает в поле memCyr содержимое файла используя при этом обработчик исключений.
Листинг 5. «Обработчик события нажатия на кнопку Открыть»
procedure TMainForm.acCyrOpenExecute(Sender: TObject);
begin
if openDialog.execute then
try
memCyr.lines.LoadFromFile(OpenDialog.FileName);
except
showmessage('Неверный формат фаила!!!');
end;
end;
· Кнопка
(Сохранить текст из окна кириллици) acSaveCyrВыполняет диалог SaveDialog и сохраняет поле memCyr в файл.
Листинг 6. «Обработчик события нажатия на кнопку Сохранить»
procedure TMainForm.acSaveCyrExecute(Sender: TObject);
begin
if openDialog.execute then
memCyr.lines.SaveToFile(OpenDialog.FileName);
end;
· Кнопка
(перевести с кириллици в латиницу) acCyrToLatОчищает поле memLat и заносит в него текст переведенный в транслит. Данный алгоритм будет рассмотрен в части «Основные алгоритмы»
Коды обработки событий нажатия кнопок сохранения и загрузки для memLat (поле ввода латиници) идентичны приведенным выша, за исключением входного и выходного полей (memLat)
Процедуры обработки событий главного меню:
· Меню «Файл»
o «Открыть фаил в окно кириллици»
acCyrOpen
o «Открыть фаил в окно латиници»
acLatOpen
o «Сохранить текст из окна кириллици»
acSaveCyr
o «Сохранить текст из окна латиници»
acSaveLat
o «Выход»
Закрывает главную форму.
Листинг 8. «Обработчик главного меню Файл -> Выход»
procedure TMainForm.N4Click(Sender: TObject);
begin
MainForm.Close;
end;
· Меню «Правка»
Содержит стандартные функции управления буфером обмена и редактирования текста.
o «Отменить CTRL+Z»
acUndoОтменяет изменения в текущем (активном) поле для ввода
Листинг 9. «Обработчик главного меню Правка -> Отменить»
procedure TMainForm. acUndoExecute(Sender: TObject);
begin
if memCyr.Focused then memCyr.Undo;
if memLat.Focused then memLat.Undo;
end;
o «Вырезать CTRL+X»
acCutВырезает выделенный текст в текущем (активном) поле для ввода.
Листинг 10. «Обработчик главного меню Правка -> Вырезать»
procedure TMainForm.acCutExecute(Sender: TObject);
begin
if memCyr.Focused then memCyr.CutToClipboard;
if memLat.Focused then memLat.CutToClipboard;
end;
o «Копировать CTRL+С»
acCopyКопирует выделенный текст в текущем (активном) поле для ввода.
Листинг 11. «Обработчик главного меню Правка -> Копировать»
procedure TMainForm.acCopyExecute(Sender: TObject);
begin
if memCyr.Focused then memCyr.CopyToClipboard;
if memLat.Focused then memLat.CopyToClipboard;
end;
o «Вставить CTRL+V»
acPasteВставляет текст из буфера в текущее (активное) поле для ввода.
Листинг 12. «Обработчик главного меню Правка -> Вставить»
procedure TMainForm.acPasteExecute(Sender: TObject);
begin
if memCyr.Focused then memCyr.PasteFromClipboard;
if memLat.Focused then memLat.PasteFromClipboard;
end;
o «Удалить CTRL+Del»
acDeleteУдаляет выделенный текст из текущего (активного) поля для ввода.
Листинг 13. «Обработчик главного меню Правка -> Удалить»
procedure TMainForm.acDeleteExecute(Sender: TObject);
begin
if MemCyr.Focused then memCyr.ClearSelection;
if MemLat.Focused then memLat.ClearSelection;
end;
o «Выделить всё CTRL+A»
Выделяет весь текст в текущем (активном) поле для ввода.
Листинг 14. «Обработчик главного меню Правка -> Выделить всё»
procedure TMainForm.N18Click(Sender: TObject);
begin
if memo1.Focused then memo1.SelectAll;
if memo2.Focused then memo2.SelectAll;
end;
· Меню «Перевод»
o «перевести с кириллици в латиницу»
acCyrToLatПереводит текст из кириллицы в транслит. Текст данной процедуры будет рассмотрен ниже.
o «перевести с латиници в кириллицу»
acLatToCyrПереводит текст из транслита в кириллицу. Текст данной процедуры будет рассмотрен ниже.
o «Редактировать алфавит»
acAlphEditОтображает форму редактирования словаря.
· Меню «Справка»
o «О программе»
Отображаетформу «Опрограмме»
Листинг 15.«Обработчик главного меню Справка -> О программе»
procedure TMainForm.N7Click(Sender: TObject);
begin
AboutForm.show;
end;
Данная форма предназначена для загрузки, сохранения и редактиро-вания словарей перевода кириллицы в транслит.
рис. 8. Форма «Редактора»
На форме расположены следующие компоненты:
· TStringGrid;
· TPanel;
· TBitBtn (2 шт.);
· TOpenDialog;
· TSaveDialog;
· TButton;
Компонент TStringGrid предназначен для ввода и просмотра таблицы перевода. На TPanel расположены все кнопки. TBitBtn – позволяют сохранять и загружать словари. Диалоги TOpenDialog и TSaveDialog предназначены для выбора файлов словарей. TButton – применяет текущие настройки к глобальному словарю (он расположен в Unit_main).
Обработчики событий.
При создании формы происходит заполнение таблицы (SlovGrid):
Листинг 16. «Созание формы Редактировать алфавит»
procedure TSlovarForm.FormCreate(Sender: TObject);
var
i1 :integer;
begin
SlovGrid.Cells[0,0]:= 'Русский';
SlovGrid.Cells[1,0]:= 'Перевод';
for i1:= 1 to 33 do
begin
SlovGrid.Cells[0,i1]:= alph_r[i1];
if i1 = 7 then SlovGrid.Cells[1,i1]:= b_jo
else SlovGrid.Cells[1,i1]:= alph[alph_r[i1]];
end;
f_name:= '';
end;
Обработчик нажатия на кнопку «Сохранить». Если пользователь выбрал файл, куда сохранить новый словарь, то происходит перезапись этого файла. В него (как в типизированный файл) записывается последовательность переменных типа ShortString. Эти данные (и их количество) берутся из таблицы SlovGrid:
Листинг 17. «Нажатия на кнопку Сохранить»
procedure TSlovarForm.SveButtClick(Sender: TObject);
var
f :file of shortstring;
i1 :integer;
str :shortstring;
begin
if savefile.execute then
begin
assignfile(f,SaveFile.FileName);
f_name:= SaveFile.FileName;
rewrite(f);
for i1:= 1 to SlovGrid.RowCount-1 do
begin
str:= SlovGrid.Cells[1,i1];
write(f,str);
end;
closefile(f);
end;
end;
Обработчик нажатия на кнопку «Загрузить». Если пользователь выбрал файл, откуда загрузить новый словарь, то происходит чтение этого файла. Из него (как из типизированного файла) загружаютчя последовательность переменных типа ShortString. Эти данные записываются в таблицу SlovGrid:
Листинг 18. «Нажатия на кнопку Загрузить»
procedure TSlovarForm.OpenButtClick(Sender: TObject);
var
f :file of shortstring;
str :shortstring;
i1 :integer;
begin
if openfile.execute then
try
assignfile(f,OpenFile.FileName);
reset(f);
for i1:= 1 to 33 do
begin
read(f,str);
SlovGrid.Cells[1,i1]:= str;
end;
closefile(f);
F_name:= OpenFile.FileName;
except
showmessage('Неверный формат фаила!!!');
end;
end;
Обработчик нажатия на кнопку «Применить». Изменяет текущий словарь ( alph : array['А'..'Я'] ofshortstring из unit_main) в соответствии с текущими данными из таблицы SlovGrid и пишет название словаря в StatusBar главной формы.
Листинг 19. «Нажатие на кнопку Применить»
procedure TSlovarForm.ApplButtClick(Sender: TObject);
var
i1 :integer;
str :string;
begin
for i1:= 1 to SlovGrid.RowCount-1 do
begin
str:= SlovGrid.Cells[1,i1];
if i1 = 7 then b_jo:= str
else alph[alph_r[i1]]:= str;
end;
if f_name <> '' then
MainForm.StatusBar.Panels[1].Text:= f_name
else
MainForm.StatusBar.Panels[1].Text:= 'Изменено пользователем';
SlovarForm.Close;
end;
На форме расположено несколько Label с изменённым свойством Caption. Никаких обработчиков событий нет.
Перевод из кириллицы в транслит:
Построчно для каждой строки поля MemCyr и посимвольно для каждого символа этой строки, программа проверяет её вхождение в множество больших или маленьких символов русского алфавита. Если вхождение действительно то программа добавляет к строке str2 соответствующие символы из словаря перевода.
Листинг 20. «Перевод кириллица -> транслит»
procedure TMainForm.acCyrToLatExecute(Sender: TObject);
var
i1,j1,i3 :integer;
str,str1,str2,st2 :string;
ch,ch2 :char;
ok1 :boolean;
begin
MainForm.MemCyr.Clear;//чистим то, куда будем писать переведенный текст
fori1:= 0 toMainForm.MemCyr.Lines.Count-1 do //проходим по всем строкам в первом окошке
begin
str:= MainForm.MemCyr.Lines[i1]; //считываем данные и обнуляем переменные
str2:= '';
forj1:= 1 tolength(str) do //проходим по всем символам в строке
begin
ch:= str[j1];
if ch in al_set then //если ch - заглавная русская буква
begin
if UpCase_R(ch) = 'Ё' then str1:= b_jo //Ё проверяем отдельно
elsestr1:= alph[UpCase_R(ch)]; //А все остальные берем из alph
ifstr1 <> '' then //Этот блок делает заглавным то,
begin //что должно быть заглавным.
if (length(str)> j1)and(str[j1+1] in al_set)or
(j1 > 1)and(str[j1-1] in al_set)then
fori3:= 1 tolength(str1) do //тут либо поднимается вся буква
(несколько символов, например SH)
begin
str1[i3]:= UpCase_R(str1[i3]);
end
else //либо только первый символ в букве (Sh)