Разработка программы представления табличных данных в виде диаграммы прямоугольников
Разработка программы представления табличных данных в виде диаграммы прямоугольников
Содержание Формализация задачи Словесное описание алгоритма Листинг программы Тестирование Отладка Формализация задачи Разработка программы представления табличных данных в виде диаграммы прямоугольников. Словесное описание алгоритма Нажатием кнопки «Новый» производится создание нового типизированного (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;
|