IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Замена слов по словарю, Простейший переводчик
Н
сообщение 6.09.2005 13:10
Сообщение #21


Гость






Вот я исправил, на мемо больше не ругается, но когда нажимаю перевод, вылетает сообщение об ошибке:

"Project Projectl.exe raised exception class EAccessViolation with message 'Access violation at address 00414988 in module 'Projectl.exe'. Read of address 00000004' Process stopped. Use Step or Run to continue."


"Access violation at address 00414988 in module 'Project1.exe'. Read of address 00000004."

И в итоге ни чего не переводит sad.gif ...



procedure TForm1.replace_word (next_word: string);
var next_word_rus: string;
ER :TStrings;

begin

next_word_rus:=ER.Values[next_word];
if next_word_rus='' then next_word_rus:=next_word;
Memo2.Lines.Add(next_word_rus);


end;

procedure TForm1.Button1Click(Sender: TObject);

var
s, next_word: string;
i: byte;
currLine: integer;
ER :TStrings;

begin
ER:=TStringList.Create;
ER.LoadFromFile('voc.txt');
For currLine := 0 To Pred(memo1.Lines.Count) Do Begin
s := memo1.Lines.Strings[currLine];
i := 1; next_word := '';
while i <= length(s) do begin
if upcase(s[i]) in ['A'..'Z'] then begin
next_word := next_word + s[i]; inc(i)
end
else begin
if next_word <> '' then replace_word(next_word);
Memo2.Lines.Add(s[i]);
next_word := ''; inc(i);
end;
end;

if next_word <> '' then replace_word(next_word);
end; er.free end;
 К началу страницы 
+ Ответить 
Н
сообщение 6.09.2005 13:19
Сообщение #22


Гость






забыл добавить, что показывает при это на вот эту строку:

if next_word_rus='' then next_word_rus:=next_word;
 К началу страницы 
+ Ответить 
hiv
сообщение 6.09.2005 13:46
Сообщение #23


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Переменную ER :TStrings; нужно объявить как public в объекте TForm1, для того чтобы можно было к ней обращаться из разных процедур и функций твоей формы. А у тебя она объявлена дважды в разных процедурах - это тогда две разные переменные. Одну из них ты создал и выделил под нее память, а другую нет - но при этом от нее чего-то хочешь получить - вот тебе и ошибка! :yes:
А вообще-то ради двух строчек кода городить дополнительную процедуру (replace_word) не имеет смысла.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 6.09.2005 14:27
Сообщение #24


Гость






Спасибо, теперь ошибки не выдает :D rolleyes.gif

Но перевод выводит как то непонятно: каждое слово и знак препинания в новой строке:

Англ текст
Цитата
Hello, world!


Перевод
Цитата
привет
,

мир
!



Может это я вывод в мемо не правельно сделал?
 К началу страницы 
+ Ответить 
hiv
сообщение 6.09.2005 14:33
Сообщение #25


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


У тебя в коде:
Memo2.Lines.Add(s[i]);
эта процедура как раз и добавляет новую строку с содержимым s[i]
Тебе нужно вначале перевести всю строку, а только потом записывать ее в Memo2.
ЗЫ: Только писать нужно Memo2.Lines.Add(s); т.к. s[i] - это всего-то i-тый символ в строке.

Сообщение отредактировано: hiv - 6.09.2005 14:35


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 6.09.2005 22:43
Сообщение #26


Гость






Вот делал вывод в мемо так:

 
procedure TForm1.Button1Click(Sender: TObject);

var
s, next_word, next_word_rus, t: string;
i: byte;
currLine: integer;

begin
t:='';
ER:=TStringList.Create;
ER.LoadFromFile('voc.txt');
For currLine := 0 To Pred(memo1.Lines.Count) Do Begin
s := memo1.Lines.Strings[currLine];
i := 1; next_word := '';
while i <= length(s) do begin
if upcase(s[i]) in ['A'..'Z'] then begin
next_word := next_word + s[i]; inc(i)
end
else begin
if next_word <> ''then next_word_rus:=ER.Values[next_word];
if next_word_rus='' then next_word_rus:=next_word;

t:= t + next_word_rus;

t:= t + s[i];

next_word := ''; inc(i);
end;
end;

Memo2.Lines.Append(t);

end; er.free end;



но выводится какая то чуш:
Цитата
    Hello, world!!!   



перевод
Цитата
    привет,привет мир!мир!мир! 



Как еще можно сделать вывод в мемо?
 К началу страницы 
+ Ответить 
volvo
сообщение 6.09.2005 22:52
Сообщение #27


Гость






У меня вот так работает:
function TForm1.replace_word (var ER: tstrings; next_word: string): string;
var next_word_rus: string;
begin
next_word_rus:=ER.Values[next_word];
if next_word_rus='' then next_word_rus:=next_word;
result := next_word_rus;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s, next_word, t: string;
i: byte;
currLine: integer;
ER :TStrings;

begin
t := '';
ER:=TStringList.Create;
ER.LoadFromFile('voc.txt');
For currLine := 0 To Pred(memo1.Lines.Count) Do Begin
s := memo1.Lines.Strings[currLine];
i := 1; next_word := '';
while i <= length(s) do begin
if upcase(s[i]) in ['A'..'Z'] then begin
next_word := next_word + s[i]; inc(i)
end
else begin
if next_word <> '' then t := t + replace_word(ER, next_word);
t := t + s[i];
next_word := ''; inc(i);
end;
end;

if next_word <> '' then t := t + replace_word(ER, next_word);
memo2.Lines.Add(t);
end;
er.free
end;
 К началу страницы 
+ Ответить 
hiv
сообщение 7.09.2005 8:29
Сообщение #28


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата
но выводится какая то чуш:

Как запрограммировал - так и выводит! Вот так надо:
procedure TForm1.Button1Click(Sender: TObject);
var
s, next_word, next_word_rus, t: string;
i: byte;
currLine: integer;
begin
Memo2.Lines.Clear;
ER:=TStringList.Create;
ER.LoadFromFile('voc.txt');
for currLine := 0 to Pred(memo1.Lines.Count) do
begin
s := memo1.Lines.Strings[currLine];
t:=''; i := 1; next_word := '';
while i <= length(s) do
begin
while (i <= length(s)) and (upcase(s[i]) in ['A'..'Z']) do
begin
next_word := next_word + s[i];
inc(i);
end;
if next_word<>'' then
begin
next_word_rus:=ER.Values[next_word];
if next_word_rus='' then next_word_rus:=next_word;
t:= t + next_word_rus;
next_word := '';
end;
if i <= length(s) then t:= t + s[i];
inc(i);
end;
Memo2.Lines.Add(t);
end;
ER.Free;
end;


Сообщение отредактировано: hiv - 7.09.2005 8:41


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 7.09.2005 21:52
Сообщение #29


Гость






Как же я сам то не додумался ..... :D

hiv, volvo Огромное спасибо.... Очень выручили.
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 8.07.2025 19:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"