Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблемы с translit-ом , вопрос есть, как реализ


Автор: virtul 15.1.2009, 15:22
Люди!
Тут такое дело: 
еcть прога типа Translit-ор. 
два МЕМО, кнопка, процедура конвертиции текста. 
пример работы: 
\\в первое мемо вводим текст 
МЕМО1: привет 
\\нажимаем на кнопку 
МЕМО2: privet 
\\ну и вот чё получаем 
--------------- 
я чё спрашиваю, я несовсем понял код.   smile  smile  smile  smile      
Котонибудь может мне его обьяснить. 
и как мне обойтись одним МЕМО?  smile 

для полной информации скажу есть два массива(стринг) , первый для русскиих символов, другой для англ. символов. 
массивы я писать небуду, там нужно весь алфавит переписывать но пример такой( rs:='Ы'; ens:='S';) 
------------- 
короче вот код: 
Код


procedure TForm.ButtonClick(Sender: TObject); 

var 
i : Integer; 
vtext: String; 
begin 
MemoDest.Clear; 
for i := 0 to MemoSource.GetTextLen - 1 do begin 
MemoSource.SelStart := i; 
MemoSource.SelLength := 1; 
vtext:= MemoSource.SelText; 
ConvertText(vtext); 
end; 
MemoSource.SelLength := 0; 
end; 



procedure TForm.ConvertText(vtext: String); 
var 
i : Integer; 
begin 
for i := 0 to 65 do begin 
if vtext= rs[i] then 
vtext:= ens[i]; 
end; 

MemoDest.Text := MemoDest.Text + vtext; 
end; 
---------- 
Обьясните что, чё делает и как одним МЕМО обойтись(может через переменную типа стринг, только как?)?
Основной вопрос: как одним МЕМО обойтись?
 smile 

Автор: virtul 15.1.2009, 15:53
Всё, додумался! smile 
Кажись... smile  smile  smile  smile 

Автор: Bose 15.1.2009, 17:17
virtul, пользуйся кнопкой "Код"

Автор: virtul 16.1.2009, 12:27
НЕт! кажись не додумался!
короче вот так хотел сделать:
Код

var
  Form1: TForm1;
  rs: array [0..4] of string;
  ens: array [0..4] of string;

implementation

{$R *.dfm}

procedure TForm1.ConvertText(vtext: String);
var
i : Integer;
begin
for i := 0 to 4 do begin
if vtext= rs[i] then
vtext:= ens[i];
end;
Memo1.Text :=vtext;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
i : Integer;
vtext: String;
begin
vtext:= Memo1.Text;
Memo1.Clear;
for i := 1 to Length(vText) do
ConvertText(vtext);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
rs[0]:='q'; ens[0]:='й';
rs[1]:='w'; ens[1]:='ц';
rs[2]:='y'; ens[2]:='н';
rs[3]:='qwerty'; ens[3]:='йцукен';
rs[4]:='ytrewq'; ens[4]:='некуцй';
end;

пример проги прикрепил к сообщению под именем pr1t.exe
в этой проге переводится слово или буква из массива но ТОЛЬКО ОДНА(О)!Тоесть: q=й qwerty=йцукен ytrewq=некуцй qq=qq qwertyqwerty=qwertyqwerty и т.д
а мне нужно чтобы всё работало во всём тексте.
Я бы мог вместо этого написать
Код

Memo1.Text:=StringReplace(Memo1.Text,'qwerty','йцукен',[rfReplaceAll, rfIgnoreCase]);

но мне нужно с учётом регистра, именно поэтому я в массивах алфавита писал маленькие и БОЛЬШИЕ буквы.
А у функции StringReplace есть особенность: ей побарабану регист: ей что "QwErTy" или "QWERTY" или "qwerty" она всёравно переведёт это как "йцукен"
-----------------
Потом я пытался вместо: ConvertText(vtext); сделать так: ConvertText(vtext[i]);
но вышло ещё круче:
теперь прога переводит только последний символ(слово не обрабатывает): тоесть q=й qq=й y=н qwerty=н 
прикрепил к сообщению по именем: pr2t.exe
Чёто я запарился...smile  smile  чё мне делать?   smile 

Автор: virtul 16.1.2009, 12:29
НЕт! кажись не додумался!
короче вот так хотел сделать:
Код

var
  Form1: TForm1;
  rs: array [0..4] of string;
  ens: array [0..4] of string;

implementation

{$R *.dfm}

procedure TForm1.ConvertText(vtext: String);
var
i : Integer;
begin
for i := 0 to 4 do begin
if vtext= rs[i] then
vtext:= ens[i];
end;
Memo1.Text :=vtext;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
i : Integer;
vtext: String;
begin
vtext:= Memo1.Text;
Memo1.Clear;
for i := 1 to Length(vText) do
ConvertText(vtext);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
rs[0]:='q'; ens[0]:='й';
rs[1]:='w'; ens[1]:='ц';
rs[2]:='y'; ens[2]:='н';
rs[3]:='qwerty'; ens[3]:='йцукен';
rs[4]:='ytrewq'; ens[4]:='некуцй';
end;

пример проги прикрепил к сообщению под именем pr1t.exe
в этой проге переводится слово или буква из массива но ТОЛЬКО ОДНА(О)!Тоесть: q=й qwerty=йцукен ytrewq=некуцй qq=qq qwertyqwerty=qwertyqwerty и т.д
а мне нужно чтобы всё работало во всём тексте.
Я бы мог вместо этого написать
Код

Memo1.Text:=StringReplace(Memo1.Text,'qwerty','йцукен',[rfReplaceAll, rfIgnoreCase]);

но мне нужно с учётом регистра, именно поэтому я в массивах алфавита писал маленькие и БОЛЬШИЕ буквы.
А у функции StringReplace есть особенность: ей побарабану регист: ей что "QwErTy" или "QWERTY" или "qwerty" она всёравно переведёт это как "йцукен"
-----------------
Потом я пытался вместо: ConvertText(vtext); сделать так: ConvertText(vtext[i]);
но вышло ещё круче:
теперь прога переводит только последний символ(слово не обрабатывает): тоесть q=й qq=й y=н qwerty=н 
прикрепил к сообщению по именем: pr2t.exe
 smile  smile Чёто я запарился... чё мне делать? smile 

Автор: Frees 16.1.2009, 12:44
в DRKB посмотри статью "}{0TT@БЬIЧ" там те только нужно FormCreate поправить
 

Автор: virtul 16.1.2009, 21:45
смотрел, кстати от туда и взял, но мне нужно одним МЕМО, помоги... smile

Добавлено через 7 минут и 11 секунд
Я кажись додумался 
нужно было заменить:
Код

ConvertText(vtext);
//и
Memo1.Text :=vtext;

на это:
Код

ConvertText(vtext[i]);
//и
Memo1.Text :=memo1.text + vtext;
 smile  smile  smile  smile  smile  smile  smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)