это, то есть считать их в массив, или я не правильно понял?
Я бы не стал выделять слова, т.к. потом после замены придется их опять в строку клеить, да и все знаки запятые и проч. потеряются. Проще читать построчно, искать вхождение каждого слова через Pos и сразу заменять. Правда придется добавить проверку, чтобы не было замен внутри слов, но это прсто
Вот тебе работающий набросок на FPC, просто добавь построчное чтение из Memo в строку S и измени процедуру Replace_Word так, чтобы она меняла переданное ей слово на соотв. слово из файла-словаря:
procedure replace_word(s: string); begin write('(-', s, '-)'); { <--- замени на вывод во второй Memo } end;
var s: string = 'this ::is a, text'; next_word: string; i: byte;
begin 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); write(s[i]); { <--- замени на вывод во второй Memo } next_word := ''; inc(i); end; end;
if next_word <> '' then replace_word(next_word);
end.
Как видишь, все разделители сохраняются... Кстати, эту программку можно еще оптимизировать ;)
for i:=1 to КолвоСловВсловаре do for j:=0 to memo1.Lines.Count-1 do begin p:=1; while p>0 do begin sT:=memo1.Lines.Strings[j]; p:=pos(word[i].en,st); if p>0 then memo1.Lines.Strings[j]:=copy(st,1,p-1)+word[i].ru+ copy(st,p+length(word[i].en),255); end; end;
В каком FAQ-е искал? В Дельфийском? А в Паскалевском посмотреть не догадался? Синтаксис-то один и тот же Вот тут (и в соседних постах) посмотри: FAQ: Строки
Хотя я тебе привел более подходящий для твоего случая алгоритм, сохраняющий все разделители, а функция из FAQ-а все разделители выбрасывает.
procedure replace_word(next_word: string); var next_word_rus: string; ER :TStrings;
begin ER:=TStringList.Create; ER.LoadFromFile('voc.txt'); next_word_rus:=ER.Values[next_word]; if next_word_rus='' then next_word_rus:=next_word; Memo2.Lines.Add(next_word_rus); er.free
end;
procedure TForm1.Button1Click(Sender: TObject);
var s, next_word: string; i: byte; currLine: integer;
begin 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; end;
Ну, с этой ошибкой: " [Error] 123.pas(41): Undeclared identifier: 'Memo2' " довольно прозрачно: у тебя просто Memo2 принадлежит классу формы, но вот процедура replace_word - то не является методом этого класса, поэтому для нее Memo2 не существует...
А вот эта: " [Error] 123.pas(41): Missing operator or semicolon " исчезнет сама собой, как только будет исправлена первая, просто сейчас структура программы нарушена, и пока ее не восстановишь - дальше будут "наведенные" ошибки...
Я не зря ставил многоточия в своем примере! В твоей программе при проверке каждого слова будет каждый раз грузиться файл словаря - это просто не нужно делать! Перенеси чтение словаря до начала перевода всех слов, а его уничтожение (освобождение памяти Free) после всего перевода.
--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!