Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi -Мет по лабраб_ Часть_2.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

9.2.3.Создание процедур обработки событий

Двойным нажатием клавиши “мыши” в свободном поле формы откроем процедуру обработки события FormCreate и введем текст процедуры.

Процедуры обработки событий нажатия кнопок создаются так же, как в предыдущих работах, вывод этих процедур на экран осуществляется двойным щелчком по компонентам. Процедура обработки события SpinEditChange выводится двойным щелчком по компоненту SpinEdit.

Пользуясь текстом модуля UnFile, внимательно наберите операторы этих процедур.

9.2.4. Текст модуля UnFile

Unit UnFile;

interface

uses

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

Dialogs, Grids, StdCtrls, Buttons, Spin;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

StringGrid3: TStringGrid;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Edit1: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

BitBtnNew: TBitBtn;

BitBtnOpen: TBitBtn;

BitBtnSave: TBitBtn;

SpinEdit1: TSpinEdit;

procedure FormCreate(Sender: TObject);

procedure BitBtnNewClick(Sender: TObject);

procedure BitBtnOpenClick(Sender: TObject);

procedure BitBtnSaveClick(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure SpinEdit1Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

type

zap=record //объявление записи

fio : string[20];

dohod: integer;

mat,soch,english,inf: integer;

end;

zap1=record //объявление записи

fio : string[20];

dohod: integer;

mat,soch,english,inf: integer;

srball: extended;

end;

var

MZap,MZap2: array[1..10] of zap; / /объявление массива записей

MZap1: array[1..10] of zap1;

FileZap: file of zap; // объявление типизированного файла

FileText: TextFile; // объявление текстового файла

FileNameZap,FileNameText: string; // имена файлов

n,k: integer; // n – текущее количество элементов исходных записей;

// к – количество элементов списка второй очереди

{ Обработчик события создания формы}

procedure TForm1.FormCreate(Sender: TObject);

begin

Edit1.Text:='22'; // начальное значение поля минимальной зарплаты

SpinEdit1.Text:='9'; // начальное значение для количества записей

n:=9;

with StringGrid1 do

begin

Cells[0,0]:='Фамилия,инициалы';

Cells[1,0]:='Доход';

Cells[2,0]:='Математика';

Cells[3,0]:='Социология';

Cells[4,0]:='Английский';

Cells[5,0]:='Информатика';

end;

with StringGrid2 do

begin

Cells[0,0]:='Фамилия,инициалы';

Cells[1,0]:='Доход';

Cells[2,0]:='Математика';

Cells[3,0]:='Социология';

Cells[4,0]:='Английский';

Cells[5,0]:='Информатика';

end;

with StringGrid3 do

begin

Cells[0,0]:='Фамилия,инициалы';

Cells[1,0]:='Доход';

Cells[2,0]:='Математика';

Cells[3,0]:='Социология';

Cells[4,0]:='Английский';

Cells[5,0]:='Информатика';

Cells[6,0]:='Средний балл';

end;

BitBtnSave.Hide; // Спрятать кнопку "Создать текстовый файл"

end;

{ Сохранение файла}

procedure TForm1.BitBtnNewClick(Sender: TObject);

var

i:integer;

begin

if MessageDlg('Содержимое существующего файла будет уничтожено.Вы уверены?',mtConfirmation,mbYesNoCancel,0)=mrYes then

begin

for i:=1 to n do

with StringGrid1,MZap[i] do

begin

fio:=Cells[0,i];

dohod:=StrToInt (Cells[1,i]);

mat:=StrToInt(Cells[2,i]);

soch:=StrToInt(Cells[3,i]);

english:=StrToInt(Cells[4,i]);

inf:=StrToInt(Cells[5,i]);

end;

with OpenDialog1 do

begin

Title:='Создание файла';

if Execute then

begin

FileNameZap:=FileName;

AssignFile(FileZap,FileNameZap);

ReWrite(FileZap);

for i:=1 to n do

write(FileZap,MZap[i]);

CloseFile(FileZap);

end;

end;

end;

end;

{Открытие файла}

procedure TForm1.BitBtnOpenClick(Sender: TObject);

var

i:integer;

begin

with OpenDialog1 do

begin

Title:='Открытие файла'; // заголовок окна диалога

if Execute then // выполнение стандартного диалога выбора имени файла

begin

FileNameZap:=FileName; // присваивание имени файла

AssignFile(FileZap,FileNameZap);

ReSet(FileZap); // открыть файл для чтения

n:=0;

while not EoF(FileZap) do

begin

n:=n+1; // расчет количества записей в файле

read(FileZap,MZap[n]); // чтение записей файла в массив записей

end;

SpinEdit1.Text :=IntToStr(n);

StringGrid1.RowCount :=n+1;

StringGrid2.RowCount :=n+1;

StringGrid3.RowCount :=n+1;

for i:=1 to n do

with StringGrid1,MZap[i] do

begin

Cells[0,i]:=fio;

Cells[1,i]:=IntToStr(dohod);

Cells[2,i]:=IntToStr(mat);

Cells[3,i]:=IntToStr(soch);

Cells[4,i]:=IntToStr(english);

Cells[5,i]:=IntToStr(inf);

end;

CloseFile(FileZap); // закрытие файла

end;

end;

BitBtnSave.Show; // показать кнопку “Сохранить текстовый файл”

end;

{запись текстового файла}

procedure TForm1.BitBtnSaveClick(Sender: TObject);

Var

i:integer;

begin

with SaveDialog1 do

if Execute then //выполнение стандартного диалога выбора имени файла

begin

FileNameText:=FileName;//присваивание имени файла

AssignFile(FileText,FileNameText);//назначить файлу FileText имя

//FileNameText

ReWrite(FileText); //открыть текстовый файл на запись

for i:=1 to n do

with MZap[i] do //запись в текстовый файл

writeln(FileText,i:3,fio:20,mat:5,english:5,soch:5,inf:5);

CloseFile(FileText); //закрытие текстового файла по окончании записи

end;

end;

{Сортировка исходных записей по возрастанию дохода на одного члена семьи}

procedure TForm1.Button1Click(Sender: TObject);

var

i,j:integer;

vper:zap;

begin

for i:=1 to n do // пересылка данных в массив записей

with StringGrid1,MZap[i] do

begin

fio:=Cells[0,i];

dohod:=StrToInt(Cells[1,i]);

mat:=StrToInt(Cells[2,i]);

soch:=StrToInt(Cells[3,i]);

english:=StrToInt(Cells[4,i]);

inf:=StrToInt(Cells[5,i]);

end;

for i:=2 to n do // сортировка методом пузырька

for j:=n downto i do

if MZap[j-1].dohod>MZap[j].dohod then

begin

vper:=MZap[j-1];

MZap[j-1]:=MZap[j];

MZap[j]:=vper;

end;

for i:=1 to n do // Пересылка рассортированных данных из массива

// записей в StringGrid1

with stringgrid1,mzap[i] do

begin

Cells[0,i]:=fio;

Cells[1,i]:=IntToStr(dohod);

Cells[2,i]:=IntToStr(mat);

Cells[3,i]:=IntToStr(soch);

Cells[4,i]:=IntToStr(english);

Cells[5,i]:=IntToStr(inf);

end;

end;

{ Вывод списка первоочередников в StringGrid2, а всех остальных записей в массив Mzap1}

procedure TForm1.Button2Click(Sender: TObject);

var

i,j,m: integer;

dd: integer;

begin

dd:=StrToInt(Edit1.Text); // ввод значения минимальной зарплаты в

//переменную dd

for i:=1 to n do

with StringGrid2 do // очистка StringGrid2

begin

Cells[0,i]:='';

Cells[1,i]:='';

Cells[2,i]:='';

Cells[3,i]:='';

Cells[4,i]:='';

Cells[5,i]:='';

end;

for i:=1 to n do

with StringGrid1,MZap[i] do // ввод данных в массив записей

begin

fio:=Cells[0,i];

dohod:=StrToInt (Cells[1,i]);

mat:=StrToInt(Cells[2,i]);

soch:=StrToInt(Cells[3,i]);

english:=StrToInt(Cells[4,i]);

inf:=StrToInt(Cells[5,i]);

end;

m:=0;

j:=0;k:=0;

for i:=1 to n do

begin

with StringGrid2,MZap[i] do

if dohod<=dd then // выбор списка первой очереди

begin

j:=j+1;

Cells[0,j]:=fio;

Cells[1,j]:=IntToStr(dohod);

Cells[2,j]:=IntToStr(mat);

Cells[3,j]:=IntToStr(soch);

Cells[4,j]:=IntToStr(english);

Cells[5,j]:=IntToStr(inf);

end

else

begin

k:=k+1; // выбор списка второй очереди в массив MZap1

MZap1[k].fio:=MZap[i].fio;

MZap1[k].dohod:=MZap[i].dohod;

MZap1[k].mat:=MZap[i].mat;

MZap1[k].soch:=MZap[i].soch;

MZap1[k].english:=MZap[i].english;

MZap1[k].inf:=MZap[i].inf;

MZap1[k].srball:=(MZap[i].mat+MZap[i].soch+MZap[i].english+MZap[i].inf)/4

end;

end;

end;

{сортировка списка второй очереди методом "пузырька" по убыванию среднего балла и вывод в StringGrid3}

procedure TForm1.Button3Click(Sender: TObject);

Var

i,j:integer;

vper:Zap1;

begin

for i:=2 to k do

for j:=k downto i do

if MZap1[j-1].srball<MZap1[j].srball then

begin

vper:=MZap1[j-1];

MZap1[j-1]:=MZap1[j];

MZap1[j]:=vper;

end;

for i:=1 to k do

with stringgrid3,mzap1[i] do

begin

Cells[0,i]:=fio;

Cells[1,i]:=IntToStr(dohod);

Cells[2,i]:=IntToStr(mat);

Cells[3,i]:=IntToStr(soch);

Cells[4,i]:=IntToStr(english);

Cells[5,i]:=IntToStr(inf);

Cells[6,i]:=FloatToStrF(srball,ffFixed,2,1);

end;

end;

{ Изменение количества исходных записей}

procedure TForm1.SpinEdit1Change(Sender: TObject); var

i,m:integer;

begin

m:=StrToInt(SpinEdit1.Text);

With StringGrid1 do

begin

RowCount:=m+1;

if m>n then

for i:=n+1 to m do

begin

Cells[0,i]:='';

Cells[1,i]:='';

Cells[2,i]:='';

Cells[3,i]:='';

Cells[4,i]:='';

Cells[5,i]:='';

end;

end;

With StringGrid2 do

begin

RowCount:=m+1;

if m>n then

for i:=n+1 to m do

begin

Cells[0,i]:='';

Cells[1,i]:='';

Cells[2,i]:='';

Cells[3,i]:='';

Cells[4,i]:='';

Cells[5,i]:='';

end;

end;

With StringGrid3 do

begin

RowCount:=m+1;

if m>n then

for i:=n+1 to m do

begin

Cells[0,i]:='';

Cells[1,i]:='';

Cells[2,i]:='';

Cells[3,i]:='';

Cells[4,i]:='';

Cells[5,i]:='';

end;

end;

n:=m;

end;

end.