Перекодировщик - Gthtrjlbhjdobr

Александр Симбирцев (bez_portok@mail.ru)

Очень частый облом, когда, набирая какой-нибудь текст, где встречаются слова и на русском и на аглицком, забываешь переключить язык и пишешь пару предложений, не глядя на экран. Получается такая фигня: "Умукнищвн иу сщщд ершы шы ф кгииукн!" или такая "

Чтобы в такой ситуации было меньше гемора, ты можешь САМ! написать прогу, которая бы любую мессагу такого типа расшифровывала для тебя. Для этого тебе понадобится комп, "Delphi 3" или выше, полчаса-час свободного времени и пара бутылок пива/газировки.

Расположись поудобней перед своим компом, так чтобы одна рука легко дотягивалась до бутылки, а другая покрепче сжимала мышку. Первое время клавиатура не понадобится. Включай машину, запускай Delphi и какую-нибудь бодрящую музыку, лучше зарубежную, чтоб не мешала.

Теперь стоит понять, что ты хочешь получить в конечном итоге, представить в своем буйном воображении, как программа будет выглядеть и, самое главное, что она будет делать. Ты уже, наверное, представил такую картину: прога прячется в трэе, поддерживает скины, играет фоновую музыку, приносит тапочки и открывает бутылки. Почти все это ты сможешь сделать сам, позже, а пока тебе предстоит создать нечто поскромнее: в прогу можно будет ввести неправильно набранный текст, потом кликнуть по кнопке и она выдаст правильный ответ.

Поехали

Запускаем делфи

Дельфи уже сделал кое-что за тебя: панель, у которой в заголовке написано Form1, - это макет твоей программы, на нее надо будет добавлять всякие фиговины вроде кнопок, текста и так далее. Панели в Дельфах принято называть "формы", а все что к ним прикрепляется - компоненты. Итак, Form1 - главная форма твоей программы. Если ты выберешь в главном меню пункт Run и там далее тоже Run или нажмешь кнопку с треугольником, твой комп никуда не убежит, а вылезет пустая панель, которая умеет растягиваться и закрываться, - это твоя прога. Закрой ее (щелкни на косом кресте этой пустой панельки, я это к тому, чтоб Дельфу или еще чего сгоряча не закрыть) и сохрани на винте: в меню File пункт Save Project As. У тебя спросят имя файла, а затем имя проекта: он, то есть твоя прога, будет храниться в виде нескольких файлов (на каждую панель по одному файлу + еще несколько), у каждого файла может быть совершенно произвольное имя, вроде: Васин_файл. То же самое с проектом: можешь назвать его не Project1, а ПроектВека или как-то иначе, это всем по фигу.

Теперь добавь на форму необходимые компоненты: кнопки, строки ввода и все такое. Делается это очень просто: в верху экрана располагаются так называемые "палитры компонент" - это наборы стандартных виндовских прибамбасов: кнопки, диалоги, тулбары и все такое, они лежат там в виде иконок. Тебе сейчас нужна палитра Standard (она выбрана по умолчанию). Кликни один раз на компоненту Edit (найди по хинтам), а затем щелкни на главную форму: там появится одна строка ввода. Можешь потаскать ее по главной форме мышкой или порастягивать.

Теперь зацени: слева на экране вертикальная панель Object Inspector - очень важная и удобная фича: в ней отображаются все свойства всех компонент твоей проги. Сейчас вверху написано Edit1:tEdit (если ты последний раз кликнул в строку ввода, иначе Form1:TForm1) - это имя и тип выбранного сейчас компонента. Ниже, во вкладке Properties, можно найти свойство Text, сейчас там написано Edit1, а надо все напрочь стереть - это свойство говорит, что будет написано в строке ввода при запуске программы. Запусти программу и посмотри, что получится. Теперь аналогично помести на форму еще одну строку ввода и расположи ее под первой: в первую юзер будет потом впечатывать белиберду, а во вторую прога будет писать расшифровку. Сотри все в свойстве Text. Найди на палитре и помести на панель кнопку (Button) и в свойстве Caption впиши "Do it!" или что-нибудь такое - эта кнопь будет все запускать в твоей проге (свойство Caption у всех компонент отвечает за надпись, которая будет нарисована на компоненте; и еще: пока вписывай те надписи на кнопках, которые предлагаю я, чтобы мне было проще объяснить, позже ты все сможешь переделать по-своему).

Далее надо как-то дать понять юзеру, в какую из строк писать лажовую строку, а в какой будет ответ. Для этого помести на форму два компонента Label (иконка в виде буквы "А" на палитре Standard), один левее первой строки ввода, другой левее второй. В первом в свойстве Caption впиши "Вводи сюды:" или что-то в этом роде, а во втором - "Ответ тут:". Потом в низу формы помести еще две кнопки, в одной впиши "Выход", в другой "About". Значение свойства Caption может быть любым, так что пиши по-русски или по-аглицки и любую фигню - что захочешь. Теперь размести все компоненты ровнее на форме (форму можешь растягивать мышью или устанавливать свойства Height и Width ручками в Object Inspector). Если на какой-нибудь компонент щелкануть правой кнопью крысы, то выскочит менюха, в которой есть пункт Align, поэкспериментируй с ним - это выравнивание того компонента, который у тебя сейчас выбран на форме (там есть выравнивания по левому краю, по правому, по центру и др.). К этому моменту у тебя должно получиться что-то типа того:

Внутри

Можно запустить программулину и пощелкать по кнопкам, вписать чего-нибудь, но прога не дает результата, который ты от нее хотел: она ни фига не перекодирует. Тут следует разозлиться не на шутку и пойти бить морду подлому автору статьи, который обещал, что клавиатура даже не понадобится, а кинул по всем статьям, и прога вообще не заработала.

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

Начнем с простого: хочется, чтобы при нажатии на кнопку "Выход" прога закрывалась напрочь. Даблкликни на эту кнопку на главной форме (заметь, ДАБЛКЛИКНИ, до этого ты везде кликал один раз). Перед тобой откроется окошко текстового реактора... то есть редактора, где будет написано:

procedure TForm1.Button2Click(Sender: TObject);

begin

end;

и еще всякой лабуды. Так вот, перед тобой процедура, которая будет выполняться после того, как кто-нибудь кликнет на кнопь "Выход" во время работы программы. Сейчас она пустая, то есть ничего не делает, поэтому такая лажа и получалась - щелкаешь по ней, а ей все по фигу. Ща все исправим: вписывай между begin и end (то есть в "тело" процедуры) такую строку:

Form1.Close;

Теперь, когда эта кнопь будет нажата, эта процедура скажет главной форме (главная форма она потому и главная, что к ней все "крепится", и если ее закрыть - закроется вся программа) "Закройся", и все будет зашибись. Запусти и полюбуйся на это.

Еще можно слепить панель, которая будет выскакивать при нажатии на кнопь "О проге.." и содержать всякую лабуду. Все просто: в главном меню Дельфей выбираешь "Филе", в нем "New...", выскочит окошко, в нем смело выбирай вкладку "Forms", там по умолчанию выбран AboutBox, щелкай "ОК". Дело в том, что в комплекте Дельфей есть некоторое количество готовых форм "специально для ленивых", их надо только подправить.

Итак, есть четыре компонента Label и один Image. Сперва исправь свойства Caption у всех Labelов - не бойся их растягивать, они могут содержать несколько строк текста (для этого надо свойство WordWrap поставить True, а не False, как по умолчанию). Теперь Image - выбирай свойство Picture, щелкай где три точки и далее Load любую картинку (Bmp-формата), размеры смотри в свойствах Height и Width, можешь их изменить, но Дельфа сожмет картинку любого размера под те, что там вписаны. И, наконец, даблклик по кнопке "ОК" на панели About - и там в редакторе вписывай почти то же самое, что и раньше:

AboutBox.Close;

(говоришь панельке About закрыться при нажатии).

Тут я хочу сказать об одной полезной фиче - все названия по умолчанию в Дельфях - "говорящие", вроде Button1, Edit1 - сразу понятно, о чем идет речь. Точно так же и с процедурами, зацени: эта процедура называется "TAboutBox.OKButtonClick", если ты знаешь английский, сразу можешь врубиться, на фига она нужна - вызывается, когда в AboutBoxе Clickнут по кнопке OK. По-моему - удобно, но это - дело вкуса.

В левом верхнем углу этой формы у нас по умолчанию написано About, но, выбрав в инспекторе AboutBox, можно поменять, как обычно, свойство Caption.

Если ты был наблюдательным, ты просек, что мы нигде еще не сказали, чтобы наша панель выскакивала при нажатии на соответствующую кнопь. На главной форме даблкликни на кнопень "О проге..." и в окне редактора впиши в тело процедуры следующее:

AboutBox.Show;

Это для всех форм одинаково - метод Show их показывает, а метод Close - закрывает.

Сохрани проект - теперь у тебя спросят имя для файла только что сделанной панели "О проге...". Запусти свое творение (если перед запуском Дельфа что-то спросит - говори - Да) и насладись открывшимися возможностями.

Вот и настал тот момент, когда тебе все-таки придется написать основной алгоритм программы, иначе, как уже говорилось, само оно не заработает. Даблклик на кнопке "Do it!", и попадаешь в редактор.

Сначала попробуем расшифровывать с английского на русский. Для этого придется задать соответствие между английскими и русскими буквами на клаве. Мы поступим так: введем две строковые константы, в одной последовательно укажем все символы русской раскладки клавы, а в другой - английской.

Итак, редакторе ползи наверх, пока не встретишь жирную надпись var. Над ней надо вписать следующее:

const

EngLet : string = '~!@#$%^&*()QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?qwertyuiop[]asdfghjkl;''zxcvbnm,./';

RusLet : string = 'Ё!"№;%:?*()ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,йцукенгшщзхъфывапролджэячсмитьбю.~';

Строки эти надо набирать так: верхнюю (EngLet)- переключаешься на английский, зажимаешь shift и начинаешь слева направо последовательно нажимать клавиши той строки на клаве, где цифры, потом той, которая ниже, и так далее, потом отпускаешь shift и повторяешь (управляющие кнопки, вроде tab, enter и других, нажимать не надо); теперь нижнюю строку (RusLet) - переключаешься на русский и повторяешь все как и для предыдущей строки.

Дельфа, когда будет обрабатывать эту запись, будет читать так: "ага, написано const, значит дальше идут константы, клево, щас должно быть имя первой константы, О-ппа, написано EngLet, это оно и есть, вот двоеточие, а после него должен быть тип указан. Во! Да тут так и написано: string, значит константа будет строковой, я потрясена! Теперь равно, а опосля и значение должно быть в апострофах, и ";" - да тут все так и написано, а раз все верно, то я ругаться не буду. Блин, да тут еще одна константа!.." и так далее, ну, примерно так, тока не по-русски, а по-своему, по-Дельфивски.

Апострофы по краям говорят-показывают границы строки, в английской раскладке на клаве встречается апостроф - найди его в строке EngLet и поставь рядом еще один, теперь Дельфа врубится, что здесь не конец строки, а символ "апостроф".

Теперь найди процедуру TForm1.Button1Click и дополни ее до следующего:

procedure TForm1.Button1Click(Sender: TObject);

var

i, j, flag : integer;

Result : string;

begin

Result:='';

for i:=1 to length(Form1.Edit1.Text) do begin

for j:=1 to length(EngLet) do begin

if EngLet[j]=Form1.Edit1.Text[i] then break;

end;

Result := Concat( Result, RusLet[j] )

end;

Form1.Edit2.Text := Result;

end;

Попробую объяснить, что все это значит. После слова var Дельфа ищет объявление переменных, как после const она ищет константы. Мы с тобой хотим три целых переменных (integer) и одну строковую (string) - так и пишем, и указываем имена. Что делается в теле этой процедуры: берем первую букву введенной строки, пусть ввели "Rthlsr", значит первая буква "R", ищем ее в строке EngLet, запоминаем, какой по счету она стоит там, и берем символ из строки RusLet с таким же номером: можешь сам посмотреть там, где ты объявил константы EngLet и RusLet - под буквой "R" написана буква "К", запомним ее, теперь ищем вторую букву - "t", находим "и" и так далее, получаем "Кирдык".

Найденные символы мы будем сохранять в переменную Result, поэтому для начала присвоим ей пустую строку. Теперь берем цикл for от первой до последней буквы введенной строки (она хранится в свойстве Text компоненты Edit1, а функция length возвращает нам длину введенной в нее строки - для рассмотренного примера она вернет 6, и цикл будет исполняться от одного до шести). Еще один цикл for - начиная с первого символа, просматриваем строку EngLet до конца (length(EngLet) и проверяем оператором if, не совпадают ли та буква, которую мы сейчас ищем (Form1.Edit1.Text[i]), и та, на которую сейчас указывает счетчик j внутреннего цикла (а он указывает на EngLet[j]); если совпадают - то выскакиваем из цикла при помощи оператора break, кричим во все горло "Rulezz!" и добавляем найденную буковь (RusLet[i]) к строке Result при помощи функции Concat (она берет две строки, приписывает к концу первой вторую и возвращает полученную строку. Догадайся, что вернет эта функция, если ее вызвать так: Concat( "Fu", "ck off!" ) ). Вот и все, а после того, как циклы завершатся, мы полученную строку вписываем во вторую строку ввода - в свойство Text компоненты Edit1 на форме Form1, во как.

Кидалово

Догадайся, где я тебя только что кинул!.. Догадался? Нет!

Правильный ответ такой (запусти прогу и проверь): если ввести "Dj,kf" то прога выдаст "Вобла", а если ввести "Dj,kf b gbdj", то она ответит снова "Вобла", а "gbdj" (пиво) она зажмет и не отдаст.

- Почему, нехороший человек, ты меня опять кинул? - вежливо, не ругаясь, спросишь меня ты.

- А чтобы ты внимательнее относился потом к написанию кода, потому что, чтобы найти ошибку, нужно гораздо больше времени, чем на то, чтобы написать здоровенную прогу всего с одной этой ошибкой, - отвечу тебе я.

Секрет в том, что когда мы во втором цикле ищем в строке EngLet символ "пробел", мы его там не находим, огорчаемся и добавляем в переменную Result символ RusLet[length(Englett)+1], а это за пределами нашей строки, и там лежит какая-то лажа. Поэтому поступим так - введем специальную переменную Flag - флажок, который мы будем по умолчанию поднимать, а опускать - если нашли нужный символ в строке EngLet. Потом если он окажется все еще поднятым после окончания цикла, мы будем добавлять в Result не из RusLet[i], а прямо из Form1.Edit1.Text[i] - то есть, в нашем случае, добавлять пробел там, где надо.

Итак, исправь эту часть процедуры вот так:

for i:=1 to length(Form1.Edit1.Text) do begin

Flag:=0;

for j:=1 to length(EngLet) do begin

if EngLet[j]=Form1.Edit1.Text[i] then begin

Flag:=666;

break;

end;

end;

if Flag=666 then Result := Concat( Result, RusLet[j] )

else Result := Concat( Result, Form1.Edit1.Text[i] );

end;

Запусти и убедись, теперь прога работает верно.

Чтобы прога стала переводить с русского неправильного на английский правильный, скопируй все, что находится между апострофами в объявлении строки EngLet, и помести перед закрывающим апострофом в объявлении строки RusLet и наоборот (если бы строки были такими: EngLet - 'QWE', а RusLet - 'ЙЦУ', то после этих операций получилось бы: EngLet - 'QWEЙЦУ', а RusLet - 'ЙЦУQWE').

Теперь мелочи: свойство BorderStyle формы Form1 можно поставить равным bsSindle, чтобы основную панель нельзя было растянуть. А в свойстве Icon можно заменить стандартную иконку Дельфей в левом верхнем углу главной панели на любую другую.

EXE-файл своей проги ты найдешь на винте в той директории, куда ты сейвил проект.

Вот такие пироги

Сложно? Не очень. А главное - результат: ты крут! У тебя есть настоящая грамотная серьезная прога. Можешь выкладывать это файло на своем сайте и хвастать всем, что ты теперь программер, а не просто кул-хацкер. Удачи тебе, и, надеюсь, эта прога не будет для тебя последней :).

Ты уже, наверное, представил такую картину: прога прячется в трэе, поддерживает скины, играет фоновую музыку, приносит тапочки и открывает бутылки. Почти все это ты сможешь сделать сам, позже, а пока тебе предстоит создать нечто поскромнее: в прогу можно будет ввести неправильно набранный текст, потом

кликнуть по кнопке, и она выдаст правильный ответ.



Опубликовал admin
27 Ноя, Четверг 2003г.



Программирование для чайников.