В нашем приложении пользователь может сам задавать необходимую перестановку букв алфавита, поэтому стоит учесть тот факт, что он может ошибиться при ее вводе. Для решения данной проблемы реализуем функцию, которая будет отвечать на вопрос о том, является ли введенная перестановка корректной. Определимся с тем, каким критериям должна отвечать перестановка, чтобы считаться допустимой. Во-первых, в каждой ячейке ввода должна присутствовать лишь одна буква – ни больше, ни меньше. Во-вторых, каждая введенная буква обязана принадлежать множеству букв русского алфавита. И в-третьих, ни одна введенная буква не должна ни разу повторяться. Проверка первого критерия довольно проста. Для этого достаточно лишь проверить длину строки, введенной в каждой ячейке. Второй критерий также проверяется довольно простой конструкцией принадлежности заданному множеству. Третий критерий проверяется подобно тому, как в предыдущем реализованном методе проверялось, сгенерирована данная буква или нет. Следующий исходный код, представленный в листинге 12.3, показывает, как эта проверка осуществляется.
Листинг 12.3.
Реализация метода проверки допустимости перестановки
function TfmSubstitution.ValidateRearrangement: Boolean;
var
i: Integer;
s: String;
Used: array [Char] of Boolean;
begin
Result := False;
FillChar(Used, SizeOf(Used), False);
for i := 1 to vleSubst.RowCount – 1 do
Begin
//символ единственный в строке?
s := vleSubst.Cells[1, i];
if (Length(s) <> 1) then
Exit;
//символ – буква русского языка?
s[1] := UpCaseRus(s[1]);
if not (s[1] in [\'А\'..’Я’]) then
Exit;
//уже встречался ранее?
if Used[s[1]] then Exit;
Used[s[1]] := True;
End;
Result := True;
end;
Далее мы реализуем две вспомогательные функции, которые позволят преобразовать буквы верхнего регистра к нижнему и наоборот. Их реализация немного специфична и основывается на используемой кодировке. Отдельная проверка буквы «Ё» производится на основании иного расположения в таблице кодировки, чем у остальных букв. Буквы русского алфавита верхнего регистра расположены начиная с «А» по порядку следования в алфавите, а сразу после них аналогично расположены буквы нижнего регистра. Этим объясняется увеличение кода буквы на фиксированное число. Реализация данных вспомогательных функций приведена в листинге 12.4.
Листинг 12.4.
Вспомогательные функции преобразования регистра букв
function TfmSubstitution.UpCaseRus(Ch: Char): Char;
begin
if Ch = \'ё\' then Ch := \'Е\
if Ch in [\'а\'..’я’] then Dec(Ch, 32);
Result := Ch;
end;
function TfmSubstitution.LowCaseRus(Ch: Char): Char;
begin
if Ch = \'Ё\' then Ch := \'е\
if Ch in [\'А\'..’Я’] then Inc(Ch, 32);
Result := Ch;
end;
Теперь рассмотрим работу обработчика события формы OnCreate и обработчика события кнопки OnClick. Первый сначала инициализирует редактор значений полями, для которых будут задаваться данные. После того как все поля созданы, вызывается функция генерации случайной перестановки, которая, в свою очередь, заполняет все поля редактора значений необходимыми данными. Второй же обработчик только вызывает функцию генерации случайной перестановки. В листинге 12.5 приведен исходный код данных методов.
Листинг 12.5.
Использование генерации случайной перестановки
procedure TfmSubstitution.FormCreate(Sender: TObject);
var
Ch: char;
begin
Randomize;
//инициализация редактора значений
for Ch := \'А\' to \'Я\' do
vleSubst.InsertRow(Ch, \'\', True);
//генерация случайной перестановки
GenRearrangment;
end;
procedure TfmSubstitution.btnGenRearrangementClick(Sender:
TObject);
begin
GenRearrangment;
end;