• Постановка задачи
  • Разработка формы
  • Разработка программного кода
  • Полный исходный код модуля
  • Глава 3

    Работа с текстом. Статистика документа

    Постановка задачи

    Разработать программу, которая выводит статистику выбранного пользователем документа. Статистические данные включают в себя количество слов, символов, пробелов и строк.

    Разработка формы

    Создадим новый проект Delphi и разработаем интерфейс программы. Измените значение свойства Caption главной формы на Статистика. Разместите на форме компонент Label категории Standard, и присвойте его свойствам значения согласно табл. 3.1.

    Таблица 3.1. Свойства компонентаLabel, размещенного на форме Статистика

    Свойство Значение Пояснение
    Caption Статистика Надпись метки
    Font.Color clRed Цвет надписи — красный
    Font.Name Courier New Шрифт надписи
    Font.Size 16 Размер шрифта надписи
    Font.Style [fsBold] Стиль шрифта — полужирный
    Left 128 Отступ слева
    Top 3 Отступ сверху

    Ниже разместите компонент Edit категории Standard (поле ввода), в котором будет храниться путь к обрабатываемому файлу. Справа от него разместим кнопку (компонент Button категории Standard), которая будет открывать окно обзора для выбора файла. Присвойте свойству Button1.Caption значение Обзор.

    Для реализации выбора файла разместите на форме компонент OpenDialog категории Dialogs. Измените значение свойства Name этого компонента наOpen1.

    Разместите на форме четыре компонента Label и присвойте их свойству Caption значения Слов, Символов, Пробелов и Строк. Расположите эти метки одну над другой вдоль левого края формы и установите свойства шрифта согласно табл. 3.2.

    Таблица 3.2. Свойства шрифта компонентов Label

    Свойство Значение Пояснение
    Font.Name Courier New Шрифт надписи
    Font.Size 12 Размер шрифта надписи
    Font.Style [fsBold] Стиль шрифта — полужирный

    Разместите на форме справа от каждого предыдущих четырех меток еще четыре компонента Label и присвойте им имена (свойство Name) words, symbols, spaces и lines. Присвойте значения свойствам этих меток согласно табл. 3.3.

    Таблица 3.3. Свойства компонентов words, symbols, spaces и lines

    Свойство Значение Пояснение
    Caption 0 Надпись метки
    Font.Color clRed Цвет надписи — красный
    Font.Name Courier New Шрифт надписи
    Font.Size 12 Размер шрифта надписи
    Font.Style [fsBold] Стиль шрифта — полужирный
    Left 112 Отступ слева

    В правом нижнем углу формы разметим кнопку (компонент Button), по нажатию которой будут выполняться расчёты и выводиться все данные. Свойству Caption этой кнопки присвоим значение Статистика. На этом разработка формы завершена. Полученный результат должен примерно соответствовать рис. 3.1

    Рис. 3.1. Форма Статистика

    Разработка программного кода

    В этой программе следует обработать только два события: нажатие кнопки Обзор и нажатие кнопки Статистика. Сначала — о кнопке Обзор:

    procedure TForm1.Button1Click(Sender: TObject);

    begin

     //начинаем обзор с текущей папки

     Open1.InitialDir:= GetCurrentDir;

     if Open1.Execute then Edit1.Text:= Open1.FileName //открываем диалоговое окно выбора файла

     else ShowMessage('Файл не выбран!');

    end;

    Начинаем обзор с каталога, в котором в данный момент находится программа. Затем следует стандартная проверка: если файл не был выбран, то сообщаем об этом пользователю, иначе отображаем путь к файлу в поле Edit1.

    При нажатии кнопки Статистика выполняется подсчет и отображение данных о выбранном файле:

    procedure TForm1.Button2Click(Sender: TObject);

    var

     f: file of byte; //Переменная для работы с файлом

     str: byte; //Содержит считанный байт

     oldstr, symbol, word, line, space: Integer; //Стат. данные

    begin

     symbol:= 0; //обнуляем предыдущие результаты

     word:= 0;

     space:= 0;

     line:= 0;

     if FileExists(Edit1.Text) //проверяем, существует ли файл

     then begin

      AssignFile(f, Edit1.Text); //связываем файл с переменной f

      reset(f); //открываем файл на чтение

      while not eof(f) do

      begin //читаем файл до достижения конца файла

       oldstr:= str;

       Read(f, str); //считываем символ в переменную str

       if ((str <> 32) and (str <> 13) and (str <> 10)) then symbol:= symbol + 1; {пополняем количество символов, если он не является переводом строки, кодом новой строки или пробелом}

       //если считан пробел, пополним счетчик пробелов

       if str = 32 then space:= space + 1;

       if str = 13 then line:= line + 1; //счетчик строк

       if ((str = 32) or (str = 13) or (str = 10)) then

        if ((oldstr<>32) and (oldstr<>10) and (oldstr<>13)) then word:= word + 1; //счетчик слов

      end;

      CloseFile(f); //закрываем файл

     end

     else ShowMessage('Ошибка: Файл не найден!'); {если файл не найден, то выводим сообщение об ошибке}

     //Выводим всю полученную информацию о файле

     symbols.Caption:= IntToStr(symbol);

     spaces.Caption:= IntToStr(space);

     lines.Caption:= IntToStr(line);

     words.Caption := IntToStr(word);

    end;

    Сначала мы проверяем, существует ли файл, статистику которого будем определять. Если все нормально, то начинаем считывать из этого файла по одному символу и проверять по коду, что это за символ. Если код символа равен 32, то это — пробел, и мы пополняем счетчик пробелов. Если код считанного символа равен 13, то это — символ перевода строки, и мы пополняем счетчик строк. Если считанный символ не является пробелом или символом перевода строки, то это — обычный символ и следует пополнить счетчик символов. Для того чтобы подсчитать количество слов, мы выполняем следующую проверку: если считан пробел или символ перевода строки, то проверяем, является ли предыдущий символ пробелом или символом перевода строки, и если это так, пополняем счетчик слов.

    Результат выполнения программы представлен на рис. 3.2.

    Рис. 3.2. Программа Статистика в действии

    Полный исходный код модуля

    Код модуля программы Статистика представлен в листинге 3.1.

    Листинг 3.1. Модуль программы Статистика

    unit Unit1;

    interface

    uses

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

    type TForm1 = class(TForm)

     Label1: TLabel;

     Label2: TLabel;

     Label3: TLabel;

     Label4: TLabel;

     Label5: TLabel;

     words: TLabel;

     symbols: TLabel;

     spaces: TLabel;

     lines: TLabel;

     Button1: TButton;

     Edit1: TEdit;

     Button2: TButton;

     Open1: TOpenDialog;

     procedure Button1Click(Sender: TObject);

     procedure Button2Click(Sender: TObject);

    private

     { Private declarations }

    public

     { Public declarations }

    end;


    var Form1: TForm1;


    implementation

    {$R *.dfm}


    procedure TForm1.ButtonlClick(Sender: TObject); begin

     //начинаем обзор с текущей папки

     Open1.InitialDir:= GetCurrentDir;

     if Open1.Execute // открываем диалоговое окно выбора файла

     then Edit1.Text:= Open1.FileName

     else ShowMessage('Файл не выбран!');

    end;

    procedure TForm1.Button2Click(Sender: TObject);

    var

     f: file of byte; //Переменная для работы с файлом

     str: byte; //Содержит считанный байт

     oldstr, symbol, word, line, space: Integer;

    begin

     symbol:= 0; //обнуляем предыдущие результаты

     word:= 0;

     space:= 0;

     line:= 0;

     if FileExists(Edit1.Text) //проверяем, существует ли файл

     then begin

      AssignFile(f,Edit1.Text) ; //связываем файл с переменной f

      reset(f); //открываем файл на чтение

      while not eof(f) do

      begin //читаем файл до достижения конца файла

       oldstr:= str;

       Read(f, str); //считываем символ в переменную str

       if ((str <> 32) and (str <> 13) and (str <> 10))

        then symbol := symbol + 1; {пополняем количество символов, если он не является переводом строки, кодом новой строки или пробелом}

       //если считан пробел, пополним счетчик пробелов

       if str = 32 then space:= space + 1;

       if str = 13 then line:= line + 1; //счетчик строк

       if ((str = 32) or (str = 13) or (str = 10)) then

        if ((oldstr<>32) and (oldstr<>10) and (oldstr<>13))

         then word: = word + 1; //счетчик слов

      end;

      CloseFile(f); //закрываем файл

     end

     else ShowMessage('Ошибка: Файл не найден !'); {если файл не найден, то выводим сообщение об ошибке}

      symbols.caption:= IntToStr(symbol); //Выводим всю

      spaces.caption:= IntToStr(space); //полученную

      lines.caption:=IntToStr(line); //информацию о файле

      words.caption:= IntToStr(word);

     end;

    end.

    ⊚ Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter 03.





     

    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх