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

Содержание

Формализация задачи

Словесное описание алгоритма

Листинг программы

Тестирование

Отладка

Формализация задачи

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

Словесное описание алгоритма

Нажатием кнопки “Новый” производится создание нового типизированного (nrec) файла: выводится диалоговое окно с текстовым полем для имени файла, затем это имя устанавливается в соответствие файловой переменной (fdata). Файл открывается процедурой Rewrite, затем производится проверка на наличие ошибок при открытии файла. Если открытие было успешным, то флаг is_open присваивается значение true, становятся доступными элементы для ввода записей.

Нажатием кнопки “Открыть” производится открытие файла для чтения процедурой Reset. Если файл открыт, производится считывание всех записей из этого файла и помещение их в таблицу (SG), флаг is_open устанавливается в true.

Нажатием кнопки “Ввод” проверяется не пусты ли текстовые поля EKEY и EVAL. Если “нет”б проверяются данные в поле EVAL. Если эти данные являются числом, то данные из EKEY и EVAL записываются в таблицу.

Диаграмма (GR) строится нажатием кнопки “Построить”: очищаются значения диаграммы, если в таблице значений не больше чем два, построение не выполняется.

Кнопка “Сохранить” перемещает указатель на начало файла и записывает все данные из таблицы в открытый файл.

Листинг программы

{ Листинг файла Kmain. pas }

Unit Kmain;

Interface

Uses

KDialog,

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls, ExtCtrls, TeeProcs, TeEngine, Chart, Series;

Type nrec = record

Key:string[20];

Val:real

End;

Type

TFMAIN = class(TForm)

SG: TStringGrid; GR: TChart; EKEY: TEdit; EVAL: TEdit;

BENT: TButton; BNEW: TButton; BOPEN: TButton; BMAKE: TButton;

Button1: TButton; BCLO: TButton; BSAV: TButton; Label1: TLabel;

Label2: TLabel; Series1: TBarSeries;

Procedure BNEWClick(Sender: TObject);

Procedure BSAVClick(Sender: TObject);

Procedure BENTClick(Sender: TObject);

Procedure FormClose(Sender: TObject; var Action: TCloseAction);

Procedure FormCreate(Sender: TObject);

Procedure BOPENClick(Sender: TObject);

Procedure BMAKEClick(Sender: TObject);

Procedure Button1Click(Sender: TObject);

Procedure BCLOClick(Sender: TObject);

Private

Fdata:file of nrec;

Rec:nrec;

Is_open:boolean;

End;

Var

FMAIN: TFMAIN;

Implementation

{$R *.dfm}

Procedure TFMAIN. BNEWClick(Sender: TObject);

Begin

FDIALOG. Caption:=’Сохранить файл’;

FDIALOG. ShowModal;

If(FDIALOG. getName<>”) then begin

AssignFile(fdata, FDIALOG. getName);

{$I+} Rewrite(fdata); {$I-}

If IOresult<>0 then begin

MessageDlg(‘Ошибка при открытии файла!’,

MtError, [mbOK], 0);

Exit;

End;

SG. Cells[0,1]:=”; SG. Cells[1,1]:=”;

SG. RowCount:=2;

SG. Enabled:=true; EVAL. Enabled:=true;

GR. Enabled:=true; EKEY. Enabled:=true;

BENT. Enabled:=true; BMAKE. Enabled:=true;

BCLO. Enabled:=true; BSAV. Enabled:=true;

BNEW. Enabled:=false; BOPEN. Enabled:=false;

FMAIN. Caption:=’Таблица ‘+FDIALOG. getName;

Is_open:=true;

End;{if(FDIALOG…}

End;

Procedure TFMAIN. BSAVClick(Sender: TObject);

Var i:integer;

Begin

Seek(fdata, 0);

For i:=1 to SG. RowCount-2 do begin

Rec. key:=SG. Cells[0, i];

Rec. val:=StrToFloat(SG. Cells[1, i]);

Write(fdata, rec);

End;

End;

Procedure TFMAIN. BENTClick(Sender: TObject);

Begin

If (EKEY. Text<>”)and(EVAL. Text<>”) then

Begin

Try

StrToFloat(EVAL. Text);

Except

MessageDlg(‘Вводить только числа’, mtWarning, [mbOK], 0);

EVAL. Text:=”;

Exit;

End;{try…}

SG. Cells[0, SG. RowCount-1]:=EKEY. Text;

SG. Cells[1, SG. RowCount-1]:=EVAL. Text;

SG. RowCount:=SG. RowCount+1;

End;{if (EKEY…}

End;

Procedure TFMAIN. FormClose(Sender: TObject; var Action: TCloseAction);

Begin

If is_open then CloseFile(fdata);

End;

Procedure TFMAIN. FormCreate(Sender: TObject);

Begin

Is_open:=false;

SG. Cells[0,0]:=’Имя’;

SG. Cells[1,0]:=’Значение’;

SG. RowCount:=SG. RowCount+1;

End;

Procedure TFMAIN. BOPENClick(Sender: TObject);

Var i:integer;

Begin

FDIALOG. Caption:=’Открыть файл’;

FDIALOG. ShowModal;

If(FDIALOG. getName<>”) then begin

AssignFile(fdata, FDIALOG. getName);

{$I-}Reset(fdata){$I+};

If IOresult<>0 then begin

MessageDlg(‘Ошибка при открытии файла!’,

MtError, [mbOK], 0);

Exit;

End;

I:=1;

SG. RowCount:=2;

While not EOF(fdata) do begin

Read(fdata, rec);

SG. Cells[0, i]:=rec. key;

SG. Cells[1, i]:=FloatToStr(rec. val);

SG. RowCount:=SG. RowCount+1;

Inc(i);

End;

SG. Enabled:=true;

SG. Enabled:=true; EVAL. Enabled:=true;

GR. Enabled:=true; EKEY. Enabled:=true;

BENT. Enabled:=true; BMAKE. Enabled:=true;

BCLO. Enabled:=true; BSAV. Enabled:=true;

FMAIN. Caption:=’Таблица ‘+FDIALOG. getName;

Is_open:=true;

BNEW. Enabled:=false; BOPEN. Enabled:=false;

End;{if(FDIALOG…}

End;

Procedure TFMAIN. BMAKEClick(Sender: TObject);

Var ser:integer;

Begin

GR. Series[0].Clear;

If SG. RowCount<=2 then begin

MessageDlg(‘В таблице нет данных!’, mtWarning, [mbOK], 0);

End

Else

For ser:=1 to SG. RowCount-2 do begin

GR. Series[0].Add(StrToFloat(SG. Cells[1, ser]),

SG. Cells[0, ser], clMedGray);

End;

End;

Procedure TFMAIN. Button1Click(Sender: TObject);

Begin

Close;

End;

Procedure TFMAIN. BCLOClick(Sender: TObject);

Var i:integer;

Begin

If is_open then begin

CloseFile(fdata);

For i:=1 to SG. RowCount-1 do

SG. Rows[i].Clear;

GR. Series[0].Clear;

SG. Cells[0,1]:=”; SG. Cells[1,1]:=”;

SG. RowCount:=2;

SG. Enabled:=false;

SG. Enabled:=false; EVAL. Enabled:=false;

GR. Enabled:=false; EKEY. Enabled:=false;

BENT. Enabled:=false; BMAKE. Enabled:=false;

BSAV. Enabled:=false; BCLO. Enabled:=false;

FMAIN. Caption:=’Представление табл. данных прямоугольной диаграммой’

Is_open≔false;

BNEW. Enabled:=true; BOPEN. Enabled:=true;

End; end;

End.

{ Листинг файла KDialog. pas }

Unit KDialog;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons;

Type

TFDIALOG = class(TForm)

Edit1: TEdit;

BOK: TBitBtn;

BCAN: TBitBtn;

Procedure BOKClick(Sender: TObject);

Procedure BCANClick(Sender: TObject);

Private

Fname:string;

Public

Function getName:string;

End;

Var

FDIALOG: TFDIALOG;

Implementation

Function TFDIALOG. getName;

Begin

Getname:=fname;

End;

{$R *.dfm}

Procedure TFDIALOG. BOKClick(Sender: TObject);

Begin

Fname:=FDIALOG. Edit1.Text;

End;

Procedure TFDIALOG. BCANClick(Sender: TObject);

Begin

Fname:=”;

End;

End.

{ Листинг файла Kurs. dpr }

Program Kurs;

Uses

Forms, Kmain in ‘Kmain. pas’ {FMAIN}, KDialog in ‘KDialog. pas’ {FDIALOG};

{$R *.res}

Begin

Application. Initialize;

Application. CreateForm(TFMAIN, FMAIN);

Application. CreateForm(TFDIALOG, FDIALOG);

Application. Run;

End.

Тестирование

При закрытии программы всегда выполняется процедура CloseFile;

Для каждой записи строится своя диаграмма;

При нажатии “Построить” данные из таблицы добавляются к прошлым значениям диаграммы;

При сохранении в файл считывается больше записей чем есть в таблице;

Не очищаются имена и значения в таблице при закрытии файла.

Отладка

Чтобы при закрытии программы процедура CloseFile выполнялась только тогда, когда есть открытый файл введена переменная is_open;

Изменено

GR. Series[i].Add(StrToFloat(SG. Cells[1, ser]), SG. Cells[0, ser], clMedGray);

На

GR. Series[0].Add(StrToFloat(SG. Cells[1, ser]), SG. Cells[0, ser], clMedGray);

В обработчике события OnClick кнопки “Построить” добавлена строка

GR. Series[0].Clear;

Число записей читаемых из таблицы уменьшено на единицу:

For i:=1 to SG. RowCount-2 do …

В обработчике события OnClick кнопки “Закрыть” добавлено:

For i:=1 to SG. RowCount-1 do begin

SG. Rows[i].Clear;

End;


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