Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > RichEdit замена текста


Автор: mgf 7.6.2009, 00:30
Помогите пожалуйста решить вопрос с Richedit. В нем забит текст, который загружается из текстового файла. Например: *Вопрос. Ответ: ...*
 Задача такова, что нужно заменить троеточие на слово, побуквенно, которое будет вводится побуквенно в edit. 
У меня пока только стирает троеточие и оставляет пустоту...слово вместо троеточия не вводится. помогите, исправить пожалуйста. Вот все, что у меня написано из кода 
Код


procedure TForm1.Edit1Change(Sender: TObject);
var st,text1,s,el: string; i,j,r: integer;
begin
  Text1:=richedit1.Lines.Text;
  s:=Edit1.Text;
  j:=1;
      for i := 0 to Length(text1) do
    begin
       if text1[i]='.' then begin
       text1[i]:=s[j];
         i:=i+1;
                end;
      end;
richedit1.Lines.Text:=text1;
    end;

procedure TForm1.FormCreate(Sender: TObject);
begin
richedit1.Lines.LoadFromFile('quest.txt');
end;



 ! 
THandle
Модератор: используйте подсветку кода!

Автор: Данкинг 7.6.2009, 00:42
Цитата(mgf @  7.6.2009,  01:30 Найти цитируемый пост)
i:=i+1;

Может быть, тебе j нужно увеличивать, а не i? В любом случае, i - это переменная цикла, зачем её трогать-то.

Автор: Chydik 7.6.2009, 02:43
Код

 for i := 0 to Length(text1) do

Во первых строка начинается не с 0 а с 1:
Код

 for i := 1 to Length(text1) do


Во вторых ты проходинся по всему тексту заменяя все . (т.е после ввода одного символа в edit каждую . после первой ты заменяешь на j=j+1, хотя данного символа у тебя нет) потому
я и использовал Break;

В третих j вынес из Edit1Change т.к. она всегда была бы =1

В четвертых  в данном случае есть недостаток:
Если взять пример *Вопрос. Ответ: ...*, то первой будет заменена . после Вопрос;


Код


procedure TForm1.Edit1Change(Sender: TObject);
var st,text1,s,el: string; i,r: integer;
begin
  Text1:=richedit1.Text;
  s:=Edit1.Text;
  for i := 1 to Length(text1) do
    begin
       if text1[i]='.' then
        begin
          text1[i]:=s[j];
          richedit1.Text:=Copy(richedit1.Text,1,i-1)+s[j]+Copy(richedit1.Text,i+1,Length(richedit1.Text));
          j:=j+1;
          Break;
        end;
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
richedit1.Lines.LoadFromFile('quest.txt');
  j:=1;
end;

Автор: HeliX 7.6.2009, 09:04
Согласен с Chydik, только хочется кое-что дополнить.

1. Зачем использовать OnChange, проще распарсить текст сразу после загрузки, либо отключить редактирование рича. 
Если конечно не предполагается, что пользователь сам может менять текст рича и вводить эти самые "...". Но в этом случае лучше тоже не использовать OnChange, т.к. ничего кроме "тормозов" это не даст. В этом  случае лучше добавить отдельное действие на другой контрол, или в OnChange устанавливать флаг, а потом в таймере каждые Н-секунд парсить текст если он был изменен(флаг).  Все же будет получше чем паксить при вводе/удалении каждого нового символа.


2. Не вижу смысла в вашем случае что-то изобретать (я про цикл парсинга текста), есть такие функции как pos,delete и Insert.
    Вот собственно как выглядит вся замена:


Код

i := pos('...', Text1);
if i <> 0 then 
begin
  Delete(Text1, i, 3);
  Insert(s, Text1, i);
end;

Автор: mgf 7.6.2009, 13:40
попробовала сделать по предложению Chydik, но он все равно у меня стирает только эти три точки, ничего не добавляя

Автор: Keeper89 7.6.2009, 14:06
mgf, я уже отвечал Вам на тот же самый вопрос: http://forum.vingrad.ru/index.php?showtopic=258447&view=findpost&p=1863195. Зачем по сто раз одно и то же спрашивать?

Вот тот же код, вопрос берется теперь из файла:
Код

unit Unit1;

interface

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

const
  MASK = '...';

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    RichEdit1: TRichEdit;
    procedure Edit1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  question: String;

implementation

{$R *.dfm}

function LoadFile(const fName: String): String;
var
  f: File;
  FSize: Longint;
begin
  // Берем вопрос

  AssignFile (f, fName);
  Reset(f, 1);
  FSize := FileSize(f);
  SetLength(Result, FSize);
  BlockRead(f, Result[1], FSize);
  CloseFile(f);
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
  curPaste: String;
begin
  if Trim(Edit1.Text) = '' then curPaste := MASK
                           else curPaste := Edit1.Text;
  RichEdit1.Text := StringReplace(question, MASK, curPaste, [rfReplaceAll]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  question := LoadFile('quest.txt');
  Edit1.OnChange(Self);
end;

end.

Прикрепляю измененный проект.

Автор: mgf 7.6.2009, 15:01
извиняюсь...не видела этого... 
Благодарю за помощь, проект скачала теперь!

Автор: Keeper89 7.6.2009, 16:06
Цитата(mgf @  7.6.2009,  16:01 Найти цитируемый пост)
Благодарю за помощь, проект скачала теперь!

Пожалуйста ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)