![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Приветствую вас форумчане!
Имеется программка (скачал исходник) по работе с заменой слов, типа синонимайзер. Наткнулся на следующую проблему, которую прошу помочь решить: Слова прога берет с отдельного xml файла. Если она слово заменила на нужное, то опять это замененное слово меняет на другое, если оно есть в списке слов. Например - сначала меняет "привет" на "здравствуйте" и затем если слово "здравствуйте" есть в списке синонимов, то меняет его на "привет" Пример порядка слов: "привет" "здравствуйте" "здравствуйте" "привет" "очень" "сильно" и так далее... Если программа находит и меняет слова, но те которые она изменила меняются цветом. Так вот помогите сделать так, чтобы те слова, которые другого цвета (измененные уже) она больше не меняла. Заранее благодарю, вот код: Код:
procedure TForm4.btnOpenClick(Sender: TObject);
begin
if not OpenDialog.Execute then Exit;
Editor.Lines.LoadFromFile(OpenDialog.FileName);
end;
procedure TForm4.btnReplaceClick(Sender: TObject);
Var P: Integer;
begin
tblDictionary.First;
while not tblDictionary.Eof
do begin
Editor.Lines.BeginUpdate;
P := 1;
while P <> -1
do begin
P := Editor.FindText(tblDictionary.FieldByName('TextToFind').AsString, P, Length(Editor.Text), []);
if P = -1 then Continue;
Editor.SelStart := P;
Editor.SelLength := Length(tblDictionary.FieldByName('TextToFind').AsString);
Editor.ClearSelection;
Editor.SelAttributes.Style := [fsBold];
Editor.SelAttributes.Color := clMaroon;
Editor.SelText := tblDictionary.FieldByName('ReplaceWith').AsString;
Inc(P, Editor.SelLength);
end;
Editor.Lines.EndUpdate;
tblDictionary.Next;
end;
end;
end.Последний раз редактировалось Admin, 27.04.2012 в 18:46. |
|
#2
|
|||
|
|||
|
Есть такая идея - реализовать распознавание не по тексту,а по положению в тексте. Допустим, нашла твоя процедура слово ПРИВЕТ. Функция pos('привет') выдаст тебе, например, 10. Эту десятку запоминаешь и заменяешь слово, потом ищешь следующее, запоминаешь, и т.д. А вот, когда ты уже будешь заменять слово ЗДРАВСТВУЙТЕ, ты смотришь на позицию слова, и, если его позиция в списке есть, тогда не заменяешь.
P.S. Эта идея мне в час ночи кажется вменяемой, так что не судите строго ![]() |
|
#3
|
|||
|
|||
|
Можно и так, но я в программировании слаб, вернее такое сделать точно не смогу, может кто посильнее в этом деле чиркнет пару строк кода, буду очень благодарен, дело вроде не сложное
|
|
#4
|
||||
|
||||
|
А не проще разве просто проверить цвет слова прежде чем его заменить?
Вроде так должно быть: Код:
Editor.SelStart := P;
Editor.SelLength := Length(tblDictionary.FieldByName('TextToFind').AsString);
if (Editor.SelAttributes.Style <> [fsBold]) and (Editor.SelAttributes.Color <> clMaroon)
then begin
Editor.ClearSelection;
Editor.SelAttributes.Style := [fsBold];
Editor.SelAttributes.Color := clMaroon;
Editor.SelText := tblDictionary.FieldByName('ReplaceWith').AsString;
end;
Inc(P, Editor.SelLength); |
|
#5
|
|||
|
|||
|
Именно это мне и нужно было, огромное вам спасибо! Тему можно закрывать
|