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


Автор: anaxaim 19.5.2010, 19:58
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов (длина одной строки не должна превышать 70 символов).
Написать программу, которая:
•    выводит текст на экран;
•    определяет количество предложений в тексте и количество слов в каждом предложении;
•    по нажатию произвольной клавиши выделяет поочередно каждое предложение текста, а в выделенном предложении – поочередно все слова.



Вот мой код,первые два пункта вроде сделаны.Прошу помощи в выполнении третьего пункта,не представляю как это организовать. 
Код

procedure TForm1.Button1Click(Sender: TObject);
var f1:TextFile;
    a:string;
    pr:char;
    i, k:integer;
begin

  AssignFile(f1,'Путь\abc.txt');

  Memo1.Lines.LoadFromFile('Путь\abc.txt');
  k:=0;
  a := Memo1.Text;
  i := 1;
  while i <= Length(a) do
  begin
    if a[i] in ['.', '?', '!'] then k:=k+1;
    inc(i)
  end;
  Label2.Caption:='Количество предложений в тексте: '+IntToStr(k);
end;

procedure TForm1.Button2Click(Sender: TObject);
const DelSym = ' .,!?';//символы разделители
var Text,Word: string; i: integer;
begin
  Text:=Memo1.Lines.Text;//переносит введенный в Memo текст в переменную
  for i := 1 to Length(Text) do      //от 1 до длины строки текста
    if Pos(Text[i],DelSym) > 0 then  //ищем явл. ли встречаемый симв. разделителем
      Text[i]:=',';                  //если да то заменяем их на запятую

  if Text[1] = ',' then       //если первый символ запятая то удаляем его
    Delete(Text,1,1);
  while Pos(',,',Text) > 0 do  //если идут несколько запятых то заменяем на одну
    Delete(Text,Pos(',,',Text),1);
  while Pos(#13,Text) > 0 do  //если идут несколько запятых то заменяем на одну
    Delete(Text,Pos(#13,Text),1);
  while Pos(#10,Text) > 0 do  //если идут несколько запятых то заменяем на одну
    Delete(Text,Pos(#10,Text),1);

  repeat
    Word:=Copy(Text,1,Pos(',',Text)-1);//находим первую запятую,копируем слово
    Delete(Text,1,Length(Word)+1);    //от начала текста до запятой,после чего
                                      //удаляем это слово из текста вместе с запятой

    ListBox1.Items.Add(Word);
  until Length(Text) = 0;    //пока не вырежем все слова
Label1.Caption:='Количество слов в тексте: '+IntToStr(ListBox1.Items.Count);
end;
end.

Автор: anaxaim 2.6.2010, 22:04
Подскажите пожалуйста 3 пункт
 по нажатию произвольной клавиши выделяет поочередно каждое предложение текста, а в выделенном предложении – поочередно все слова.
Знаю ,что нужно использовать SelStart и SelLength,но не могу додуматься как это сделать  и как сделать при этом,чтобы текст выделялся другим цветом.
Нужна помощь

Автор: cyberstream 4.6.2010, 22:35
Используй RichEdit.
Менять атрибуты текста как-то так:
Код

procedure MarkThisWord(RE: TRichEdit; TheWord: String; Color: TColor; Style:
TFontStyles);
var
  i, CharPos, noChars: Integer;
begin
  CharPos := 0;
  noChars := 0;
  for i := 0 to Pred(RE.Lines.Count) do
    noChars := noChars + Length(RE.Lines[i]);
  CharPos := RE.FindText(TheWord, CharPos, noChars, [stWholeWord]);
  RE.SelStart := CharPos;
  RE.SelLength := Length(TheWord);
  RE.SelAttributes.Color := Color;
  RE.SelAttributes.Style := Style;
end;

procedure MarkAllWords(RE: TRichEdit; TheWord: String; Color: TColor; Style:
TFontStyles);
var
 i, CharPos, CharPos2, noChars: Integer;
begin
 CharPos := 0;
 noChars := 0;
 for i := 0 to Pred(RE.Lines.Count) do
   noChars := noChars + Length(RE.Lines[i]);
 repeat
   CharPos2 := RE.FindText(TheWord, CharPos, noChars, [stWholeWord]);
   CharPos := CharPos2+1;
   RE.SelStart := CharPos2;
   RE.SelLength := Length(TheWord);
   RE.SelAttributes.Color := Color;
   RE.SelAttributes.Style := Style;
 until charpos = 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MarkThisWord(RichEdit1, 'the', clRed, [fsBold]);
  MarkAllWords(RichEdit1, 'to', clTeal, [fsItalic, fsBold]);
end;

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