Смекни!
smekni.com

Программа для перевода текстов с транслита (стр. 2 из 3)

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;

5. Форма «Редактор алфавита»

Данная форма предназначена для загрузки, сохранения и редактиро-вания словарей перевода кириллицы в транслит.


рис. 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;

6. Форма «О программе»

На форме расположено несколько Label с изменённым свойством Caption. Никаких обработчиков событий нет.

7. Основные алгоритмы

Перевод из кириллицы в транслит:

Построчно для каждой строки поля 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)