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

Тип работы:
Контрольная
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

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

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

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

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

Отладка

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

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

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

Нажатием кнопки «Новый» производится создание нового типизированного (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;

ПоказатьСвернуть
Заполнить форму текущей работой