Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Функция перевода строки из русской в английскую и наоборот.   Найти похожие ветки 

 
Kostik   (2006-01-17 04:27) [0]

Существует ли какая нибудь функция для быстрого перевода троки например "qwerty" в "йцукен", и наоборот???
Мне надо чтобы программа умела переводить  русский текст в английский и наоборот именно вот таким образом. В хелпах ответа не нашел...


 
gdaujk ©   (2006-01-17 08:45) [1]

Стандартной функции, насколько я знаю, нет. Ниже приведённая функция делалась очень давно, возможны недочёты...
const
 EnCH: string = "`qwertyuiop[]asdfghjkl;zxcvbnm,./~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?";
 RuCH: string = "ёйцукенгшщзхъфывапролджячсмитьбю.Ё!"№;%:?*()_+/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,";

procedure TForm1.Translate(NowLang,FutureLang: string);
var
 i, j: word;
 Ch: Char;
begin
 Memo2.Text := "";
 for i := 1 to length(Memo1.Text) do
   begin
     Ch := chr(0);
     for j := 1 to Length(NowLang) do
       if NowLang[j] = Memo1.Text[i]
         then
           begin
             Ch := FutureLang[j];
             Break;
           end;
     if Memo1.Text[i] = chr(39) then Ch := "э";
     if Memo1.Text[i] = "э" then Ch := Chr(39);
     if Ch = Chr(0)
       then Ch := Memo1.Text[i];
     Memo2.Text := Memo2.Text + Ch;
   end;
end;


 
gdaujk ©   (2006-01-17 08:47) [2]

Использовать

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 Translate(RuCH,EnCh);
end;


PS: функцию точно надо переделать...


 
Ega23 ©   (2006-01-17 09:37) [3]


> gdaujk ©   (17.01.06 08:45) [1]


"я" и "Я" не учтены


 
msguns ©   (2006-01-17 09:53) [4]

>gdaujk ©   (17.01.06 08:45) [1]

О, боже ! А нельзя ли все эту дребедень выполнить одним оператором в цикле ?


 
Kostik   (2006-01-17 09:57) [5]

>gdaujk
Большое спасибо!!!

А то я тут написал функцию.. Она очень топорная, поскольку я еще мало Делфи занимаюсь...
Вот, потештесь.. )


Function Translete(l:bool; c:char):char;
begin
if l = true then
begin
 if c = char("Q") then c:= char("Й");
 if c = char("W") then c:= char("Ц");
 if c = char("E") then c:= char("У");
 if c = char("R") then c:= char("К");
 if c = char("T") then c:= char("Е");
 if c = char("Y") then c:= char("Н");
 if c = char("U") then c:= char("Г");
 if c = char("I") then c:= char("Ш");
 if c = char("P") then c:= char("З");
 if c = char("{") then c:= char("Х");
 if c = char("S") then c:= char("Ы");
 if c = char("D") then c:= char("В");
 if c = char("F") then c:= char("А");
 if c = char("G") then c:= char("П");
 if c = char("H") then c:= char("Р");
 if c = char("J") then c:= char("О");
 if c = char("K") then c:= char("Л");
 if c = char("L") then c:= char("Д");
 if c = char("Z") then c:= char("Я");
 if c = char("X") then c:= char("Ч");
 if c = char("C") then c:= char("С");
 if c = char("V") then c:= char("М");
 if c = char("B") then c:= char("И");
 if c = char("N") then c:= char("Т");
 if c = char("M") then c:= char("Ь");
 if c = char("<") then c:= char("Б");
 if c = char(">") then c:= char("Ю");
 if c = char(":") then c:= char("Ж");
 if c = char(""") then c:= char("Э");

 if c = char("q") then c:= char("й");
 if c = char("w") then c:= char("ц");
 if c = char("e") then c:= char("у");
 if c = char("r") then c:= char("к");
 if c = char("t") then c:= char("е");
 if c = char("y") then c:= char("н");
 if c = char("u") then c:= char("г");
 if c = char("i") then c:= char("ш");
 if c = char("o") then c:= char("щ");
 if c = char("p") then c:= char("з");
 if c = char("[") then c:= char("х");
 if c = char("]") then c:= char("ъ");
 if c = char("}") then c:= char("Ъ");
 if c = char("a") then c:= char("ф");
 if c = char("s") then c:= char("ы");
 if c = char("d") then c:= char("в");
 if c = char("f") then c:= char("а");
 if c = char("g") then c:= char("п");
 if c = char("h") then c:= char("р");
 if c = char("j") then c:= char("о");
 if c = char("k") then c:= char("л");
 if c = char("l") then c:= char("д");
 if c = char("z") then c:= char("я");
 if c = char("x") then c:= char("ч");
 if c = char("c") then c:= char("с");
 if c = char("v") then c:= char("м");
 if c = char("b") then c:= char("и");
 if c = char("n") then c:= char("т");
 if c = char("m") then c:= char("ь");
 if c = char(",") then c:= char("б");
 if c = char(".") then c:= char("ю");
 if c = char(";") then c:= char("ж");
 if c = char("""") then c:= char("э");
 if c = char("/") then c:= char(".");
 if c = char("?") then c:= char(",");
end;

if l = false then
begin
 if c = char("Й") then c:= char("Q");
 if c = char("Ц") then c:= char("W");
 if c = char("У") then c:= char("E");
 if c = char("К") then c:= char("R");
 if c = char("Е") then c:= char("T");
 if c = char("Н") then c:= char("Y");
 if c = char("Г") then c:= char("U");
 if c = char("Ш") then c:= char("I");
 if c = char("Щ") then c:= char("O");
 if c = char("З") then c:= char("P");
 if c = char("Х") then c:= char("{");
 if c = char("Ъ") then c:= char("}");
 if c = char("Ф") then c:= char("A");
 if c = char("Ы") then c:= char("S");
 if c = char("В") then c:= char("D");
 if c = char("А") then c:= char("F");
 if c = char("П") then c:= char("G");
 if c = char("Р") then c:= char("H");
 if c = char("О") then c:= char("J");
 if c = char("Л") then c:= char("K");
 if c = char("Д") then c:= char("L");
 if c = char("Я") then c:= char("Z");
 if c = char("Ч") then c:= char("X");
 if c = char("С") then c:= char("C");
 if c = char("М") then c:= char("V");
 if c = char("И") then c:= char("B");
 if c = char("Т") then c:= char("N");
 if c = char("Ь") then c:= char("M");
 if c = char("Б") then c:= char("<");
 if c = char("Ю") then c:= char(">");
 if c = char("Ж") then c:= char(":");
 if c = char("Э") then c:= char(""");

 if c = char("й") then c:= char("q");
 if c = char("ц") then c:= char("w");
 if c = char("у") then c:= char("e");
 if c = char("к") then c:= char("r");
 if c = char("е") then c:= char("t");
 if c = char("н") then c:= char("y");
 if c = char("г") then c:= char("u");
 if c = char("ш") then c:= char("i");
 if c = char("щ") then c:= char("o");
 if c = char("з") then c:= char("p");
 if c = char("х") then c:= char("[");
 if c = char("ъ") then c:= char("]");
 if c = char("ф") then c:= char("a");
 if c = char("ы") then c:= char("s");
 if c = char("в") then c:= char("d");
 if c = char("а") then c:= char("f");
 if c = char("п") then c:= char("g");
 if c = char("р") then c:= char("h");
 if c = char("о") then c:= char("j");
 if c = char("л") then c:= char("k");
 if c = char("д") then c:= char("l");
 if c = char("я") then c:= char("z");
 if c = char("ч") then c:= char("x");
 if c = char("с") then c:= char("c");
 if c = char("м") then c:= char("v");
 if c = char("и") then c:= char("b");
 if c = char("т") then c:= char("n");
 if c = char("ь") then c:= char("m");
 if c = char("б") then c:= char(",");
 if c = char("ю") then c:= char(".");
 if c = char("ж") then c:= char(";");
 if c = char("э") then c:= char("""");
 if c = char(".") then c:= char("/");
 if c = char(",") then c:= char("?");
end;

result := c;
end;


 
Johnmen ©   (2006-01-17 09:59) [6]

Напомнило знаменитую IncDay :)))))))))))0


 
Kostik   (2006-01-17 09:59) [7]

с английского на русский


procedure TForm1.Button3Click(Sender: TObject);
var
 i, u : integer;
 s,t : String;
 c : char;
begin

for i := 0 to RichEdit1.Lines.Count-1 do
    begin
     s := RichEdit1.Lines.Strings[i];
     t := "";
     if length(s)>0 then
     for u := 0 to length(s) do
         begin
           c := s[u];
           c := Translete(true, c);
           s[u] := c;
         end;
     RichEdit1.Lines.Strings[i] := s;
    end;
end;


с русского на английской

procedure TForm1.Button4Click(Sender: TObject);
var
 i, u : integer;
 s,t : String;
 c : char;
begin

for i := 0 to RichEdit1.Lines.Count-1 do
    begin
     s := RichEdit1.Lines.Strings[i];
     t := "";
     if length(s)>0 then
     for u := 0 to length(s) do
         begin
           c := s[u];
           c := Translete(false, c);
           s[u] := c;
         end;
     RichEdit1.Lines.Strings[i] := s;
    end;
end;


Спасибо вам большое, помогли!!


 
Kostik   (2006-01-17 10:10) [8]

Только...  почему то моя функция работает быстрее гораздо...  :-[


 
_RusLAN ©   (2006-01-17 10:19) [9]

Kostik   (17.01.06 10:10) [8]
Только...  почему то моя функция работает быстрее гораздо...  :-[


Используй Case  должно еще быстрее ;)


 
Kostik   (2006-01-17 11:46) [10]

Вроде сделал...
Вроде и работает быстро...
*Большое СПАСИБО  gdaujk  за идею... *

Inglish >>  Russian

var
i, u, k: word;
C: Char;
s : String;
begin
RichEdit2.Lines.BeginUpdate;

s := "";
for i := 0 to RichEdit2.Lines.Count-1 do
  begin
    k := 0;
    s := RichEdit2.Lines.Strings[i];

    for u := 1 to Length(s) do
    if pos(char(s[u]), EnCH)<>0 then
     begin
      k := pos(char(s[u]), EnCH);
      C := RuCH[k];
      s[u] := c;
     end;

   RichEdit2.Lines.Strings[i] := s;
  end;

RichEdit2.Lines.EndUpdate;
end;


Russian >>  Inglish

var
i, u, k: word;
C: Char;
s : String;
begin
s := "";
for i := 0 to RichEdit2.Lines.Count-1 do
  begin
    k := 0;
    s := RichEdit2.Lines.Strings[i];

    for u := 1 to Length(s) do
    if pos(char(s[u]), RuCH)<>0 then
     begin
      k := pos(char(s[u]), RuCH);
      C := EnCH[k];
      s[u] := c;
     end;
   RichEdit2.Lines.Strings[i] := s;
  end;
end;


>_RusLAN
А через Case  я что то не очень понял как сделать то...

Большое спасибо ВСЕМ кто откликнулся! Удачи ВАМ ВСЕМ :)


 
Johnmen ©   (2006-01-17 11:54) [11]

Вообще-то, всё это делается, мягко говоря, несколько не так....:)


 
Kostik   (2006-01-17 11:56) [12]

>Johnmen
а как?


 
Anatoly Podgoretsky ©   (2006-01-17 12:02) [13]

Kostik   (17.01.06 10:10) [8]
Вообще то ты себе льстишь


 
Anatoly Podgoretsky ©   (2006-01-17 12:05) [14]

Kostik   (17.01.06 11:56) [12]
С помощью таблицы подстановки и даже функция не нужно
for I := 1 to Length(I) do S[I] := CvtTable[S[I]];
Быстрее этого нельзя.


 
Johnmen ©   (2006-01-17 12:08) [15]

1. Заводится таблица перекодировки. 256 элементов. На каждом месте X в ней указан код символа, в который преобразуется код X.
2. Пробегаем по байтам исходной строки и делаем замену. s[i]:=TBL[x].

Всё...
И не надо никаких pos, if и пр.


 
Игорь Шевченко ©   (2006-01-17 12:51) [16]

Johnmen ©   (17.01.06 12:08) [15]


> Заводится таблица перекодировки. 256 элементов


Особенно значимыми являются первые 32 символа :)


 
Johnmen ©   (2006-01-17 12:56) [17]

>Игорь Шевченко ©   (17.01.06 12:51) [16]

Это чтоб не думать, что там в строке попадётся...:))


 
gdaujk ©   (2006-01-17 12:57) [18]

>Johnmen ©   (17.01.06 11:54) [11]

Я и не настаиваю, что это оптимальный вариант. Говорю же, писал давным давно...


 
Kostik   (2006-01-17 13:11) [19]

>Anatoly Podgoretsky
>for I := 1 to Length(I) do S[I] := CvtTable[S[I]];
>Быстрее этого нельзя.

Что то я не понял как это использовать....
и CvtTable вообще даже в хелпе найти не могу...


 
ANB ©   (2006-01-17 14:02) [20]


> и CvtTable вообще даже в хелпе найти не могу...

CvtTable придется самому нарисовать. Это таблица перекодировки - обычный массив.


 
evvcom ©   (2006-01-17 15:42) [21]


> CvtTable вообще даже в хелпе найти не могу

Anatoly Podgoretsky ©   (17.01.06 12:05) [14] и Johnmen ©   (17.01.06 12:08) [15] говорят об одном и том же. Слей это воедино и поймешь откуда эта CvtTable.


 
Змей ©   (2006-01-19 01:04) [22]

Извините у меня вот не richedit а edit.text
как на ней вот это прокатывать? for i := 0 to RichEdit2.Lines.Count-1 do
:(


 
edit.text   (2006-01-19 03:00) [23]

Вот так:


procedure TForm1.Button3Click(Sender: TObject);
var
i, u, k: word;
C: Char;
s : String;
begin
s := "";
  k := 0;
  s := Edit1.Text;
  for u := 1 to Length(s) do
  if pos(char(s[u]), EnCH)<>0 then
   begin
    k := pos(char(s[u]), EnCH);
    C := RuCH[k];
    s[u] := c;
   end;
 Edit1.Text := s;
end;


 
Змей ©   (2006-01-19 03:44) [24]

thank


 
Fay ©   (2006-01-19 05:01) [25]

2 Kostik   (17.01.06 9:57) [5]
1) Из кода следует, что c и l модет принимать несколько значений одновременно. Это странно.
2) Есть по два результата для одинаковых аргументов (например i = True, c = ";"). Это тоже очень странно.

Учитесь думать головой.


 
AbrosimovA   (2006-01-19 13:29) [26]

const Translit: array[1..33] of string = ("a","b","v","g","d","e","yo",
       "zh","z","i","j","k","l","m","n","o","p","r","s","t","u","f",
       "x","c","ch","sh","sh`","`","y","""","e`","yu","ya");
     Cyrillic: array[1..33] of string = ("а","б","в","г","д","е","ё",
       "ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф",
       "х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я");

procedure TForm1.mnTransClick(Sender: TObject);
var k: cardinal;
begin
for k:=1 to 33 do
begin
 RichEdt.Lines.Text:=StringReplace(RichEdt.Lines.Text,Cyrillic[k],Translit[k],[rfReplaceAll]);
 RichEdt.Lines.Text:=StringReplace(RichEdt.Lines.Text,AnsiUpperCase(Cyrillic[k]),
  UpperCase(Translit[k]),[rfReplaceAll]);
end
end;


 
Kostik   (2006-01-19 13:39) [27]

>Fay
>1) Из кода следует, что c и l модет принимать несколько значений одновременно. Это странно.
>2) Есть по два результата для одинаковых аргументов (например i = True, c = ";"). Это тоже очень странно.
>Учитесь думать головой.

Поясните пожалуйста, а то я не понял что то... Просто я не так давно занимаюсь делфи...
А головой то я думаю) Не думал бы - не написал бы САМ ничего.



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.026 c
15-1137138220
Fredericco
2006-01-13 10:43
2006.02.05
Интересные факты о Чаке Норрисе.


15-1137170731
Ксардас
2006-01-13 19:45
2006.02.05
Подскажите плиз


2-1137700639
(CHALING 32)S K i N E R
2006-01-19 22:57
2006.02.05
Число


4-1132842612
ga3
2005-11-24 17:30
2006.02.05
как в консольном приложении отловить выход из Виндовс?


1-1135797029
deamon_t
2005-12-28 22:10
2006.02.05
Алгоритм захвата экрана