Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.09.2010, 13:17
Аватар для thinker89
thinker89 thinker89 вне форума
Прохожий
 
Регистрация: 03.09.2010
Адрес: Планета Земля
Сообщения: 18
Репутация: 12
По умолчанию Memo и замена слов

Необходимо искать определенные слова в тексте и заменять их на другие.Проверка должна проходить одновременно по всем словам(а не сначала один,потом другой и т.д)
Подскажите как такое реализовать.Пробывал разные варианты,но там проверка и замена по одному слову,а необходимо сразу несколько.
Заранее спасибо.
Ответить с цитированием
  #2  
Старый 11.09.2010, 15:38
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

При линейном выполнении кода ваше желание неосуществимо, если-же использовать потоки, то можно, но нужно-ли для простой операции городить огород? Какой объем текста предполагается и как часто это будет происходить.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 11.09.2010, 18:21
Аватар для thinker89
thinker89 thinker89 вне форума
Прохожий
 
Регистрация: 03.09.2010
Адрес: Планета Земля
Сообщения: 18
Репутация: 12
По умолчанию

Текст максимум 10000 знаков.
Нашел решение,хоть не идеальное,но все же.

RichEdit2.lines.text:=StringReplace(RichEdit2.line s.text , 'слово которое заменяем' , 'заменяемое слово' ,[rfreplaceall]);
Ответить с цитированием
  #4  
Старый 11.09.2010, 19:16
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Цитата:
Сообщение от thinker89
Текст максимум 10000 знаков.
Нашел решение,хоть не идеальное,но все же.

RichEdit2.lines.text:=StringReplace(RichEdit2.line s.text , 'слово которое заменяем' , 'заменяемое слово' ,[rfreplaceall]);
хочу тебя огорчить, но ета функция тоже заменяет по одному слову и она не многопоточна. Она работает на тех же Pos,delete и т.п. для такой операции городить чтото из потоков это действительно тупо.
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #5  
Старый 11.09.2010, 23:09
Аватар для thinker89
thinker89 thinker89 вне форума
Прохожий
 
Регистрация: 03.09.2010
Адрес: Планета Земля
Сообщения: 18
Репутация: 12
По умолчанию

Незнаю посмотрел вроде все ок работает.Все слова заменяются.Правда слов много,поэтому код огромный получится.А так все работает.
Вот пример
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, RyMenus, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N11: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    OpenDialog1: TOpenDialog;
    RichEdit1: TRichEdit;
    RichEdit2: TRichEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button5: TButton;
    procedure N2Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    MyOtherDrawer: TRyMenu;
    StartMenu: TRyMenu;
    { Private declarations }
  public
      constructor Create(AOwner: TComponent); override;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent);
begin
 inherited;
 RyMenu.Add(MainMenu1);
// RyMenu.Add(PopupMenu1); - текст не убирать нужен ))
 MyOtherDrawer:=TRyMenu.Create(Self);
 MyOtherDrawer.SelectedColor:=clRed;
 MyOtherDrawer.MenuColor:=clLime;
 MyOtherDrawer.GutterColor:=clBlue;
 MyOtherDrawer.Font.Name:='Comic Sans MS';
 MyOtherDrawer.Font.Size:=9;
 MyOtherDrawer.Add(MainMenu1)
end;


procedure TForm1.N2Click(Sender: TObject);
begin
 If OpenDialog1.Execute then
  begin
   RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
  end;
end;

procedure TForm1.N6Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 If OpenDialog1.Execute then
  begin
   RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
richedit1.Lines.Clear;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
RichEdit2.Lines.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit2.lines:=RichEdit1.lines;
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'привет' , 'здравствуйте' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'помощь' , 'поддержка' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'несложной' , 'легкой' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'покупка' , 'приобретение' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'представлялась' , 'казалась' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'наших' , 'своих' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'не представляли себе' , 'даже не думали' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'процессе' , 'ходе' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'деньги' , 'наличные' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'найти' , 'отыскать' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'однако' , 'но все же' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'квартиру' , 'жилье' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'обнаруживаем' , 'находим' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'квартиры' , 'жилья' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'денег' , 'финансов' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'деньги' , 'финансы' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'меньше' , 'менее' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'покупку' , 'приобретение' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'обнаруживаем' , 'находим' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'вдруг' , 'внезапно' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'обнаруживаем' , 'находим' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'мечта' , 'лучшее о чем можно было думать' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'Помощь' , 'Поддержка' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'квартира' , 'жилье' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'юритс' , 'юрисконсульт' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'юриста' , 'юрисконсульта' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'юристу' , 'юрисконсульту' ,[rfreplaceall]);
RichEdit2.lines.text:=StringReplace(RichEdit2.lines.text , 'квартире' , 'жилью' ,[rfreplaceall]);

end;

end.
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 12.09.2010 в 16:16.
Ответить с цитированием
  #6  
Старый 11.09.2010, 23:16
Аватар для thinker89
thinker89 thinker89 вне форума
Прохожий
 
Регистрация: 03.09.2010
Адрес: Планета Земля
Сообщения: 18
Репутация: 12
По умолчанию

Теперь вопрос в другом как сделать так что-бы слово не зависело от регистра(тоесть,будь оно с маленькой буквы или с большой)?????
P.S И еще бы хотелось реализовать выделение замененных слов другим цветом.

Последний раз редактировалось thinker89, 12.09.2010 в 00:53.
Ответить с цитированием
  #7  
Старый 12.09.2010, 08:47
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

rfIgnoreCase
Ответить с цитированием
  #8  
Старый 12.09.2010, 09:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Мемо для выделения слов не подходит. Используйте RichEdit. Вот пример работы с этим компоненттом:
Код:
procedure TForm1.AddBookLine( Author, Title, Publisher, Year : string);
var
Indent : integer;
begin
with RichEdit1 do begin
Lines.Add(''); // add blank line
SelStart := SelStart - 2; // before final CRLF
{add Author}
SelAttributes.Style := []; // Style is a set so enclose all styles in
square brackets
SelText := Author + '. '; // SetStart is now positioned after inserted
text
{add Title}
SelAttributes.Style := [fsItalic];
SelText := Title + '. ';
{add Publisher}
SelAttributes.Style := [fsBold];
SelText := Publisher + '. ';
{add Year}
SelAttributes.Style := [];
SelText := Year + '.';
{set Paragraph indents}
Indent := (Parent as TForm).Canvas.TextWidth(' '); // pixel
width of 10 spaces
Paragraph.LeftIndent := Indent;
Paragraph.FirstIndent := -Indent;
end; {with RichEdit1}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
AddBookLine('Alan Lloyd', 'RichEdit Revealed',
'Delphi Document Press', '2000');
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 12.09.2010, 10:46
Аватар для thinker89
thinker89 thinker89 вне форума
Прохожий
 
Регистрация: 03.09.2010
Адрес: Планета Земля
Сообщения: 18
Репутация: 12
По умолчанию

Страдалецъ спасибо.Из моего примера выше видно,что использовал RichEdit.

dr. F.I.N так же спасибо за rfIgnoreCase

P.S Пробывал изменять другим цветом те слова которые заменились,что-то не как не ввыходит.Может подскажите как это реализовать?

Последний раз редактировалось thinker89, 12.09.2010 в 11:13.
Ответить с цитированием
  #10  
Старый 13.09.2010, 10:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

В общем я вам наваял пример, как я это вижу. На мой взгляд удобнее вынести ваши слова в xml-файл и подключаться к нему как к источнику данных. Удобство в том, что мы разгружаем код и получаем возможность извне, не собирая заново программу, управлять словарем замен т.к. он в текстовом виде.
ПС: Возможно там имеет смысл направление сортировки поменять.
Вложения
Тип файла: rar MassReplace.rar (8.1 Кбайт, 67 просмотров)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 13.09.2010 в 10:24.
Ответить с цитированием
  #11  
Старый 13.09.2010, 13:34
Аватар для thinker89
thinker89 thinker89 вне форума
Прохожий
 
Регистрация: 03.09.2010
Адрес: Планета Земля
Сообщения: 18
Репутация: 12
По умолчанию

Спасибо за исходник,будем пробывать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025