Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 2460
∙ повысить рейтинг »
star9491
Статус: Профессионал
Рейтинг: 2255
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Профессионал
Рейтинг: 1092
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Delphi и Lazarus

Номер выпуска:1549
Дата выхода:20.08.2010, 18:30
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:291 / 187
Вопросов / ответов:1 / 1

Вопрос № 179731: Здраствуйте, уважаемые эксперты. Нужно реализовать поиск и замену слова в файле, с помощью компонента ATStreamSearch. Моя проблема заключается в том, что при замене слов разной длины, первая замена происходит как надо, а в последующих поиск и замена ...



Вопрос № 179731:

Здраствуйте, уважаемые эксперты. Нужно реализовать поиск и замену слова в файле, с помощью компонента ATStreamSearch. Моя проблема заключается в том, что при замене слов разной длины, первая замена происходит как надо, а в последующих поиск и замена происходят не корректно. Я попытался реализовать данную проблему, но у меня первые два поиска и замены проходят как надо, а дальнейшие не очень. Помогите пожалуйста. Заранее благодарен.

Отправлен: 15.08.2010, 18:01
Вопрос задал: Vlad, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Евгений/Genia007/, Профессионал :
Здравствуйте, Vlad.
Не смог подружить richedit и ATStreamSearch, могу предложить только работать с txt файлами (формат rtf, который сохраняет richedit не понимает ATStreamSearch), и только для кнопки заменить, при изменении файла не работает функция ATStreamSearch1.FindNext. Вот что вышло:
Код:
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ATStreamSearch, Unit1;

type
TForm3 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Button4: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
ATStreamSearch1: TATStreamSearch;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;
Str1: integer;
Str2: integer;
P1: integer;
P2: integer;

implementation

uses ATxCodepages;

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
CheckBox1.Checked:=True;
Button2.Enabled:=False;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
OK: Boolean;
Encoding: TATEncoding;
Options: TATStreamSearchOptions;
Stream: TMemoryStream;
begin
Button2.E nabled:=True;
if (Edit2.Text='') then
begin
ShowMessage('Введите слово для замены!');
Exit;
end
else;
Stream := TMemoryStream.Create;
Form1.Richedit1.Lines.SaveToStream(Stream);
ATStreamSearch1.Stream:= Stream;

Encoding:=vencANSI; // Кодировка ANSI
Options:=[];
if CheckBox1.Checked then
Include(Options, asoCaseSens); // Поиск с учетом регистра
if CheckBox2.Checked then
Include(Options, asoWholeWords); // Поиск целых слов
if CheckBox3.Checked then
Include(Options, asoBackward); // Поиск в обратном направлении
OK:=ATStreamSearch1.FindFirst(Edit1.Text, 0, Encoding, Options); // Ищем первое слово
if not OK then
begin // Не нашли
ShowMessage('Ошибка! Искомое слово "'+Edit1.Text+'" не найдено!');
Stream.Free;
exit;
end;
Form1.Richedi t1.SelStart:= ATStreamSearch1.FoundStart; // Позиция начала найденого слова
Form1.Richedit1.SelLength:= ATStreamSearch1.FoundLength; // Длина найденого слова
Form1.Richedit1.SelText:=Edit2.Text; // Заменяем...
Form1.Richedit1.Perform(EM_SCROLLCARET, 0, 0); // Скролинг
Form1.Richedit1.SetFocus; // Фокус на компонент
Stream.Free;
end;

procedure TForm3.Button2Click(Sender: TObject);
var
OK: Boolean;
Encoding: TATEncoding;
Options: TATStreamSearchOptions;
Stream: TMemoryStream;
begin
Str1:=0; Str2:=0; P1:=0; P2:=0;
if (Edit2.Text='') then
begin
ShowMessage('Введите слово для замены!');
Exit;
end
else;
Encoding:=vencANSI; // Кодировка ANSI
Options:=[];
if CheckBox1.Checked then
Include(Options, asoCaseSens); // Поиск с учетом регистра
if CheckBox2.Checked then
Include(Options, a soWholeWords); // Поиск целых слов
if CheckBox3.Checked then
Include(Options, asoBackward); // Поиск в обратном н аправлении
Stream := TMemoryStream.Create;
Form1.Richedit1.Lines.SaveToStream(Stream);
ATStreamSearch1.Stream:= Stream;

{OK:=ATStreamSearch1.FindNext; } // Ищем следующее слово
OK:=ATStreamSearch1.FindFirst(Edit1.Text, 0, Encoding, Options);
if not OK then
begin // Не нашли
ShowMessage('Поиск завершен!');
Stream.Free;
exit;
end;
Str1:=Length(Edit1.Text);
Str2:=Length(Edit2.Text);
if Str1 < Str2 then
P1:=(Str2 - Str1)
else
P2:=(Str1 - Str2);
Form1.Richedit1.SelStart:= ATStreamSearch1.FoundStart + P1 - P2; // Позиция начала найденого слова
Form1.Richedit1.SelLength:= ATStreamSearch1.FoundLength; // Длина найденого слова
Form1.Richedit1.SelText:=Edit2.Text; // Заменяем...
Form1.Richedit1.Perform(EM_SCROLLCARET, 0, 0); // Скролинг
Form1.Richedit1.SetFocus; // Фокус на компонент
Stream.Free;
end;


procedure TForm3.Button4Click(Sender: TObject);
begin
Close;
end;

procedure TForm3.Edit1Change(Sender: TObject);
begin
Button1.Enabled:=(Edit1.Text<>'') and (Form1.OpenDialog1.FileName<>'');
end;

end.

-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/, Профессионал
Ответ отправлен: 16.08.2010, 17:08
Номер ответа: 262816

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 262816 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное