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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со строками, Выделение поочередно каждого предложения 
:(
    Опции темы
anaxaim
Дата 19.5.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 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.

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


Новичок



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

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



Подскажите пожалуйста 3 пункт
 по нажатию произвольной клавиши выделяет поочередно каждое предложение текста, а в выделенном предложении – поочередно все слова.
Знаю ,что нужно использовать SelStart и SelLength,но не могу додуматься как это сделать  и как сделать при этом,чтобы текст выделялся другим цветом.
Нужна помощь
PM MAIL   Вверх
cyberstream
Дата 4.6.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Используй 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;


Это сообщение отредактировал(а) cyberstream - 4.6.2010, 22:40
--------------------
Не знаешь кого спросить? - Спроси google!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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