Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Разработка интерфейса
Принимая во внимание поставленную ранее задачу, создаем на форме следующие визуальные компоненты: - StringGrid - для визуального отображения данных в табличной форме. Шапка таблицы будет повторять таблицу, указанную в начальном условии, и заполняется при открытии формы. Предустановленное максимальное количество строк – 100, столбцов – 7. Ширины столбцов выбираем в соответствии с размерностью данных. - MEMO-поле для вывода данных, указанных в условии. - 5 компонентов edit для добавления / изменения / удаления записей в базу данных (компоненты имеют ширину, соответствующую ширинам стобцов, и расположены напротив каждого столбца снизу) (см. рис. 1).
Рис.1. Общий вид приложения. 2 button-а для добавления и удаления записи, названных соответственно выполняемой функции. Так как для отображения информации в StringGrid используется текстовая форма, предусмотрено невозможность ввода текстовых данных в численные поля с выводом соответствующего сообщения, а также невозможность внесения «пустого» поля, так как все поля базы данных, необходимые для математического расчета по условиям задачи, должны быть обязательными для заполнения. Эти события регистрируются специальными предвартельными условиями и при обнаружения несоответствия выводится окно, отображающее наименование ошибки (см. рис.2 и рис.3). Рис.2. Ошибка при добавлении пустого (пыстых) полей.
Рис.3. Ошибка при добавлении не численного значения. - использованы стандартные диалоги OpenDialog и SaveDialog для предоставления пользователю возможности визуального выбора имени и пути типизированного файла для открытия либо для сохранения базы данных (См. рис.4). Рис.4. Стандартное диалоговое окно для открытия базы данных.
Для вызова диалогов использованы 2 компонента button с соответствующими названиями. А для «обнуления» данных, т.е. создания новой базы использовать компонент button с подписью «создать базу». Для дублирования функций программы и создания дополнительного удобства работы с приложением применен компонент menu с соответствующими подменю и подписями кнопок. Расположение кнопок и других полей выбрано для гарантированного удобства работы с приложением.
Листинг программы
unit EconomInfo;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus, StdCtrls, shellapi;
type TForm1 = class(TForm) sg1: TStringGrid; MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N6: TMenuItem; N7: TMenuItem; N9: TMenuItem; N10: TMenuItem; N11: TMenuItem; Memo1: TMemo; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Button1: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; N8: TMenuItem; procedure FormShow(Sender: TObject); procedure cleansg(Sender: TObject); procedure cleanedit(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure autorachet(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure sg1Click(Sender: TObject); procedure N8Click(Sender: TObject); procedure N5Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
type zap=record // объявление типа записи prod: string[80]; onng: longint; plan: longint; onkg: longint; svocep: extended; end; var Mzap: array[1..200] of zap; //объявление типа массива записей filezap: file of zap; filenamezap: string;
//процедура выполнения действий при загрузке формы procedure TForm1.FormShow(Sender: TObject); begin with sg1 do begin Cells[0, 0]: ='Наименование продукции'; Cells[1, 0]: ='ОнНГ'; Cells[2, 0]: ='ПВ'; Cells[3, 0]: ='ОнКГ'; Cells[4, 0]: ='ОР, шт'; Cells[5, 0]: ='СвОЦЕП, руб'; Cells[6, 0]: ='СвОЦВОР, т.руб'; end; memo1.Lines.Insert(0, DateTimeToStr(Now)+' - Программа запущена! '); end;
//процедура очистки стринггрида procedure Tform1.cleansg(Sender: TObject); var n2: integer; begin with sg1 do begin for n2: =1 to RowCount do begin Rows[n2].Clear; end; end; end;
//процедура очистки эдитов procedure Tform1.cleanedit(Sender: TObject); begin edit1.Clear; edit2.Clear; edit3.Clear; edit4.Clear; edit5.Clear; end;
//Создание новой базы procedure TForm1.Button4Click(Sender: TObject); begin if messagedlg('Все несохраненные данные текушей базы будут стерты! ', mtconfirmation, mbYesNoCancel, 0)=mrYes then begin cleansg(Sender); memo1.Lines.Insert(0, DateTimeToStr(Now)+' - Новая база создана. Пожалуйста сохраните, задав новое имя.'); end; end;
//добавление записи procedure TForm1.Button1Click(Sender: TObject); var n, k, l: integer; o: extended; begin //проверка на пустые поля edit-ов if (edit1.Text< > '') and (edit2.Text< > '') and (edit3.Text< > '') and (edit4.Text< > '') and (edit5.Text< > '') then begin try n: =strtoint(edit2.text); n: =strtoint(edit3.text); n: =strtoint(edit4.text); o: =strtofloat(edit5.text); except on EConvertError do messagedlg('Поля 2..5 должны быть числом! ', mterror, mbOKCancel, 1); end; //цикл очистки массива записей n: =0; repeat Mzap[n].prod: =''; Mzap[n].onng: =0; Mzap[n].plan: =0; Mzap[n].onkg: =0; Mzap[n].svocep: =0; n: =n+1; until n> =200; //цикл перевода строк stringgrid-a в массив записей n: =1; repeat if sg1.Cells[0, n]< > '' then begin Mzap[2*n].prod: =sg1.Cells[0, n]; Mzap[2*n].onng: =strtoint(sg1.cells[1, n]); Mzap[2*n].plan: =strtoint(sg1.cells[2, n]); Mzap[2*n].onkg: =strtoint(sg1.cells[3, n]); Mzap[2*n].svocep: =strtofloat(sg1.cells[5, n]); end; n: =n+1; until n> =sg1.RowCount; //цикл нахождения количества записей больших добавляемого значения n: =1; l: =0; repeat if (Mzap[2*n].prod< > '') and (CompareText(edit1.Text, Mzap[2*n].prod)> 0) then l: =l+1; n: =n+1; until n> =200; //междустрочная запись в массив k: =2*l+1; Mzap[k].prod: =edit1.Text; Mzap[k].onng: =strtoint(edit2.text); Mzap[k].plan: =strtoint(edit3.text); Mzap[k].onkg: =strtoint(edit4.text); Mzap[k].svocep: =strtofloat(edit5.text); cleansg(sender); //вызов очистки стрингрида //цикл перевода массива записей в стринггрид n: =1; k: =1; repeat if Mzap[n].prod< > '' then begin sg1.Cells[0, k]: =Mzap[n].prod; sg1.Cells[1, k]: =inttostr(Mzap[n].onng); sg1.Cells[2, k]: =inttostr(Mzap[n].plan); sg1.Cells[3, k]: =inttostr(Mzap[n].onkg); sg1.Cells[5, k]: =floattostr(Mzap[n].svocep); k: =k+1; end; n: =n+1; until n> =200; cleanedit(Sender); //вызов очистки эдитов autorachet(sender); end else messagedlg('Все поля обязательна для заполенения! ', mterror, mbOKCancel, 1); //вызов предупреждения end;
//Процедура автоматического расчета procedure Tform1.autorachet(Sender: TObject); var n, l: longint; max: extended; begin n: =1; max: =0; repeat with sg1 do begin if cells[0, n]< > '' then begin cells[4, n]: =inttostr(strtoint(cells[1, n])+strtoint(cells[2, n])-strtoint(cells[3, n])); cells[6, n]: =floattostr(strtoint(cells[4, n])*strtofloat(cells[5, n])/1000); if strtofloat(cells[6, n])> max then begin l: =n; max: =strtofloat(cells[6, n]); end; end; end; n: =n+1; until n> =sg1.rowCount; memo1.Lines.Insert(0, DateTimeToStr(Now)+' - Расчет произведен. Максимальный СвОЦВОР '+floattostr(max)+' руб. у '+sg1.cells[0, l]); end;
procedure TForm1.Button6Click(Sender: TObject); var n: longint; begin with savedialog1 do begin title: ='Сохранение базы'; if execute then begin filenamezap: =filename; assignfile(filezap, filenamezap); rewrite(filezap); n: =0; repeat Mzap[n].prod: =''; Mzap[n].onng: =0; Mzap[n].plan: =0; Mzap[n].onkg: =0; Mzap[n].svocep: =0; n: =n+1; until n> =200; n: =1; repeat if sg1.Cells[0, n]< > '' then begin Mzap[n].prod: =sg1.Cells[0, n]; Mzap[n].onng: =strtoint(sg1.cells[1, n]); Mzap[n].plan: =strtoint(sg1.cells[2, n]); Mzap[n].onkg: =strtoint(sg1.cells[3, n]); Mzap[n].svocep: =strtofloat(sg1.cells[5, n]); end; n: =n+1; until n> =sg1.RowCount; for n: =1 to 100 do write(filezap, mzap[n]); closefile(filezap); end; end; memo1.Lines.Insert(0, DateTimeToStr(Now)+' - База сохранена под именем '+filenamezap); end;
rocedure TForm1.Button5Click(Sender: TObject); var n, k: longint; begin with opendialog1 do begin title: = 'Открытие базы'; if execute then begin filenamezap: =filename; assignfile(filezap, filenamezap); reset(filezap); n: =0; repeat Mzap[n].prod: =''; Mzap[n].onng: =0; Mzap[n].plan: =0; Mzap[n].onkg: =0; Mzap[n].svocep: =0; n: =n+1; until n> =200; n: =1; while not eof(filezap) do begin read(filezap, mzap[n]); n: =n+1; end; cleansg(sender); n: =0; k: =1; repeat if Mzap[n].prod< > '' then begin sg1.Cells[0, k]: =Mzap[n].prod; sg1.Cells[1, k]: =inttostr(Mzap[n].onng); sg1.Cells[2, k]: =inttostr(Mzap[n].plan); sg1.Cells[3, k]: =inttostr(Mzap[n].onkg); sg1.Cells[5, k]: =floattostr(Mzap[n].svocep); k: =k+1; end; n: =n+1; until n> =200; autorachet(sender); end; end; memo1.Lines.Insert(0, DateTimeToStr(Now)+' - База '+filenamezap+ ' открыта'); end;
//процедура удаления записи procedure TForm1.Button3Click(Sender: TObject); var n, k: longint; begin sg1.Rows[sg1.Row].Clear; n: =0; repeat Mzap[n].prod: =''; Mzap[n].onng: =0; Mzap[n].plan: =0; Mzap[n].onkg: =0; Mzap[n].svocep: =0; n: =n+1; until n> =200; n: =1; repeat if sg1.Cells[0, n]< > '' then begin Mzap[n].prod: =sg1.Cells[0, n]; Mzap[n].onng: =strtoint(sg1.cells[1, n]); Mzap[n].plan: =strtoint(sg1.cells[2, n]); Mzap[n].onkg: =strtoint(sg1.cells[3, n]); Mzap[n].svocep: =strtofloat(sg1.cells[5, n]); end; n: =n+1; until n> =sg1.RowCount; cleansg(sender); n: =0; k: =1; repeat if Mzap[n].prod< > '' then begin sg1.Cells[0, k]: =Mzap[n].prod; sg1.Cells[1, k]: =inttostr(Mzap[n].onng); sg1.Cells[2, k]: =inttostr(Mzap[n].plan); sg1.Cells[3, k]: =inttostr(Mzap[n].onkg); sg1.Cells[5, k]: =floattostr(Mzap[n].svocep); k: =k+1; cleanedit(Sender); //вызов очистки эдитов end; n: =n+1; until n> =200; autorachet(sender); end;
procedure TForm1.sg1Click(Sender: TObject); begin edit1.Text: =sg1.Cells[0, sg1.Row]; edit2.Text: =sg1.Cells[1, sg1.Row]; edit3.Text: =sg1.Cells[2, sg1.Row]; edit4.Text: =sg1.Cells[3, sg1.Row]; edit5.Text: =sg1.Cells[5, sg1.Row]; memo1.Lines.Insert(0, DateTimeToStr(Now)+' - Запись № '+inttostr(sg1.Row)+ ' выбрана'); end;
procedure TForm1.N8Click(Sender: TObject); begin ShellExecute(form1.Handle, nil, PChar('mailto: ultrix@tut.by? Subject=EcoInfo'), '', '', 0); end;
procedure TForm1.N5Click(Sender: TObject); begin halt; end;
end.
|