Постановка задачи
Разработать программу, которая выводит статистику выбранного пользователем документа. Статистические данные включают в себя количество слов, символов, пробелов и строк.
Разработка формы
Создадим новый проект 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.