Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RichEdit замена текста 
:(
    Опции темы
mgf
Дата 7.6.2009, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



Помогите пожалуйста решить вопрос с 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
Модератор: используйте подсветку кода!

PM MAIL   Вверх
Данкинг
Дата 7.6.2009, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(mgf @  7.6.2009,  01:30 Найти цитируемый пост)
i:=i+1;

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


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Chydik
Дата 7.6.2009, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Код

 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;

PM MAIL   Вверх
HeliX
Дата 7.6.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 6.6.2009

Репутация: нет
Всего: нет



Согласен с 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;


Это сообщение отредактировал(а) HeliX - 7.6.2009, 09:13
PM MAIL   Вверх
mgf
Дата 7.6.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



попробовала сделать по предложению Chydik, но он все равно у меня стирает только эти три точки, ничего не добавляя
PM MAIL   Вверх
Keeper89
Дата 7.6.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



mgf, я уже отвечал Вам на тот же самый вопрос: http://forum.vingrad.ru/index.php?showtopi...t&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.

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

Это сообщение отредактировал(а) Keeper89 - 7.6.2009, 14:35

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Project1.rar 189,77 Kb


--------------------
PM MAIL WWW   Вверх
mgf
Дата 7.6.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 23.4.2009

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) mgf - 7.6.2009, 15:05
PM MAIL   Вверх
Keeper89
Дата 7.6.2009, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



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

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


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0718 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.