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

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

и BitBtn1Click

Двойным нажатием клавиши «мыши» на Форме и кнопке BitBtn создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnDinMas, наберите операторы этих процедур.

Создать процедуру, которая будет выделять заданным цветом границы ячеек с наименьшим и наибольшим значениями в компоненте StringGrid. Для создания такой процедуры сделайте активным компонент StringGrid и на странице Events (события) Инспектора Объектов дважды щелкните «мышью» в правой части события OnDrawCell. В ответ Delphi создаст обработчик этого события – процедуру procedure TForm1.StringGrid1DrawCell и установит курсор между операторами begin и end этой процедуры. Используя текст модуля UnDinMas, наберите операторы процедуры TForm1.StringGrid1DrawCell.

      1. Текст модуля UnDinMas

unit UnDinMas;

interface

uses

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

Dialogs, StdCtrls, Spin, Buttons, Grids;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

StringGrid1: TStringGrid;

BitBtn1: TBitBtn;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

BitBtn2: TBitBtn;

procedure FormCreate(Sender: TObject);

procedure SpinEdit1Change(Sender: TObject);

procedure SpinEdit2Change(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

type

Mas = array [1..1] of integer;

pMas = array [1..1] of ^mas;

var

pA: ^pMas;

m,n,max,min: integer;

procedure TForm1.FormCreate(Sender: TObject);

begin

SpinEdit1.Text:='6'; // начальное значение m

SpinEdit2.Text:='8'; // начальное значение n

m:=6;

n:=8;

StringGrid1.RowCount:=m; // количество строк

StringGrid1.ColCount:=n; // количество столбцов

end;

procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

m:=StrToInt(SpinEdit1.Text);

StringGrid1.RowCount:=m;

end;

procedure TForm1.SpinEdit2Change(Sender: TObject);

begin

n:=StrToInt(SpinEdit2.Text);

StringGrid1.ColCount:=n;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

label 1;

var

i,j,k,l,r,p: integer;

begin

Randomize; // инициализация датчика случайных чисел

GetMem(pA,4*m);

for i:=1 to m do

begin // формирование i-й строки массива

GetMem(pA^[i],SizeOf(integer)*n);

for j:=1 to n do

begin

1: r:=Random(1000); // генерирование случайного числа

for k:=1 to i do

begin

if k=i then p:=j-1 else p:=n;

for l:=1 to p do

if r=pA^[k]^[l] then goto 1; //если число есть в массиве,

//тогда сгенерировать новое число

end;

pA^[i]^[j]:=r; // случайное число занести в массив

end;

end;

for i:=1 to m do

for j:=1 to n do

StringGrid1.Cells[j-1,i-1]:=IntToStr(pA^[i]^[j]);

max:=pA^[1]^[1];

min:=max;

for i:=1 to m do

for j:=1 to n do

if max<pA^[i]^[j] then max:=pA^[i]^[j]

else if min>pA^[i]^[j] then min:=pA^[i]^[j];

Label8.Caption:=IntToStr(min);

Label9.Caption:=IntToStr(max);

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

begin

with StringGrid1.Canvas do

if StringGrid1.Cells[ACol,ARow]=IntToStr(min) then

begin

Brush.Color:=clGreen;

FrameRect(Rect);

end

else if StringGrid1.Cells[ACol,ARow]=IntToStr(max) then

begin

Brush.Color:=clRed;

FrameRect(Rect)

end

end;

end.

    1. Пример создания приложения

Использование динамических списков

Задание. Создать приложение для формирования стека, который заполняется путем ввода целых положительных чисел с клавиатуры. Как только будет введено первое отрицательное число, содержимое стека выводится на панель интерфейса, а память, занимаемая его элементами, освобождается.

11.4.1. Сохранение проекта

Для нового проекта создайте новую папку, например, X: \ 35эи \ LAB11_S.

Сохраните проект File | Save Project As…Сначала сохраните модуль под именем UnStek, затем файл проекта под именем Pr_Stek.

11.4.2. Размещение компонентов на Форме

Один из возможных вариантов панели интерфейса создаваемого приложения показан на рисунке 11.2.

Разместим на форме компоненты Label, Edit, Button, BitBtn, Memo.

Label

Edit

Button

BitBtn

Memo

Рис.11.2. Размещение компонентов на форме

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

Двойным нажатием клавиши «мыши» на Форме и кнопке Button создайте соответствующие процедуры обработки событий. Пользуясь текстом модуля UnStek, наберите операторы этих процедур.

      1. Текст модуля UnStek

unit UnStek;

interface

uses

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

Dialogs, StdCtrls, Buttons;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Button1: TButton;

BitBtn1: TBitBtn;

Memo1: TMemo;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

type

pSt=^zap;

zap=record

inf: integer;

adr: pSt

end;

var // объявление глобальных переменных

pVer, // указатель вершины стека

pTek: pSt; // текуший указатель

elSt: integer; // элемент стека

procedure TForm1.FormCreate(Sender: TObject);

begin

Memo1.Clear;

Edit1.Text:='';

pVer:=nil; // инициализировать указатель вершины

elSt:=0; // инициализировать элемент стека

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

New(pTek); // выделить память

elSt:=StrToInt(Edit1.Text);

pTek^.inf:=elSt; // в информационную часть стека занести elSt

pTek^.adr:=pVer; // в адресную часть занести указатель на вершину

pVer:=pTek; // указатель вершины должен указывать на

// последний элемент

if elSt>=0 then // если элемент стека неотрицательный, тогда …

begin

Edit1.Text:=''; // очистить окно редактора Edit1

Edit1.SetFocus; // передать фокус ввода редактору Edit1

end

else

begin

Memo1.Lines.Add('Элементы стека:'); // вывод заголовка

repeat

Memo1.Lines.Add(#9+IntToStr(pTek^.inf)); // вывод элементов

pVer:=pTek^.adr;

Dispose(pTek); // освободить память

pTek:=pVer;

until pTek=nil;

end;

end;

end.