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