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


Автор: Pcrepair 17.6.2012, 10:39
Добрый день. Есть, к примеру, такая процедура:

Код

procedure TForm1.Exchange(T: TStringList; First: String; Second: String);
var
  s: String;
  index, len: integer;
begin
  s := T.Text;
  len := Length(First);
  index := AnsiPos(First, s);
  while (index <> 0) do
  begin
    Delete(s, index, len);
    Insert(Second, s, index);
    index := AnsiPos(First, s);
  end;
  T.Text := s;
end;


Процедура находит в тексте СЛОВО1 и меняет его на СЛОВО2
Для обработки текста используется:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute and FileExists(OpenDialog1.FileName) then
     begin
        T := TStringList.Create;
        T.LoadFromFile(OpenDialog1.FileName);
        Exchange(T, 'СЛОВО1', 'СЛОВО2');
        Memo1.Lines := T;
     end;
end;


Причем Exchange(T, 'СЛОВО1', 'СЛОВО2'); приходится последовательно вызывать и соотвественно 
писать в вызове процедуры необходимое количество раз. Допустим СЛОВО2 везде одно и тоже

Вопрос: можно ли все СЛОВО1 как то прописать в виде массива? или еще чего, так чтобы procedure TForm1.Exchange сама брала очередное СЛОВО1 и меняла на СЛОВО2 в тексте. или всетаки правильно так и делать:

Код

Exchange(T, 'ророр', 'СЛОВО2');
Exchange(T, 'рпак', 'СЛОВО2');
Exchange(T, 'вяваса', 'СЛОВО2');
......
Exchange(T, 'опрнаев', 'СЛОВО2');

Автор: CynicRus 18.6.2012, 10:06
Унаследуйся от TList, запихни туда нужные слова. А потом - цикл по списку, и вуаля.

Автор: iff 18.6.2012, 12:07
А можно просто передать массив (наверно) и его длину.
Или можно передать строку в которой слоа разделены разделителем: 'ророр|рпак|вяваса|опрнаев' и уже в процедуре разделить на массив.

А можно не изменять процедуру, а сделать так:
Код

const
  wordscount = 4;
  words : array[1..wordscount] of string = ('ророр', 'рпак', 'вяваса', 'опрнаев');
  replaceword = 'СЛОВО2'

var i : 1..wordscount;

{...}

for i := 1 to wordscount do
  Exchange(T, words[i], replaceword);


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