Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laba_5_3.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
141.1 Кб
Скачать

НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ

ІНСТИТУТ АЕРОКОСМІЧНИХ СИСТЕМ УПРАВЛІННЯ

КАФЕДРА ЕЛЕКТРОТЕХНІКИ ТА СВІТЛОТЕХНІКИ

1

Лабораторна робота № 5.3

(3-семестр 2012-2013рр.)

Виконав студент

Гоголушко Антон Андрійовіч

Группа ІАСУ СТ-202

Перевірив

Воронов С. І.

Дата _______________________________

Оцінка _____________________________

КИЇВ 2012

unit MAIN;

// Деменстрирует построение осциллографа на базе односязной очереди

// из полиморфных объектов, которая сдвигается к началу после достижения

// заданной длины.

interface

uses

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

Dialogs, StdCtrls, ExtCtrls, Buttons,

Service1, Service2, Service3;

type

TForm1 = class(TForm)

Memo1: TMemo;

Label2: TLabel;

Image1: TImage;

SpeedButton3: TSpeedButton;

SpeedButton4: TSpeedButton;

Bevel2: TBevel;

Bevel3: TBevel;

Timer1: TTimer;

Edit1: TEdit;

ComboBox1: TComboBox;

Label1: TLabel;

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure SpeedButton3Click(Sender: TObject);

procedure SpeedButton4Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

var IQueue : TIQueue; // Полиморфный объект осциллографа

RunFlag : boolean; // Разрешение работы АЦП

// Инициализация

procedure TForm1.FormCreate(Sender: TObject);

begin

RunFlag := False;

Randomize;

end;

// Освободить ресурсы при неожиданном завершении

procedure TForm1.FormDestroy(Sender: TObject);

begin

RunFlag := False;

if Assigned(IQueue) then IQueue.Free; end;

// ВКЛЮЧЕНИЕ

procedure TForm1.SpeedButton3Click(Sender: TObject);

begin

case ComboBox1.ItemIndex of

0 : begin

// Включить табличный режим

if not Assigned(IQueue) then IQueue := TIQueue.Create(Memo1);

end;

1 : begin

// Включить осциллографический режим

if not Assigned(IQueue) then IQueue := TDisplay.Create(Image1);

end;

2 : begin

// Включить осциллографический режим с индикатором

if not Assigned(IQueue) then IQueue := TDDisplay.Create(Image1,Edit1);

end;

else begin

// Включить табличный режим

if not Assigned(IQueue) then IQueue := TIQueue.Create(Memo1);

end;

end;

ComboBox1.Enabled := False; // Отключить выбор режима

RunFlag := True; // Включить АЦП

end;

// ВЫКЛЮЧЕНИЕ

procedure TForm1.SpeedButton4Click(Sender: TObject);

begin

if Assigned(IQueue)

then begin

RunFlag := False; // Отключить АЦП

IQueue.Free; // Освободить ресурсы

IQueue := nil;

ComboBox1.Enabled := True; // Включить выбор режима

end;

end;

// Имитатор АЦП

procedure TForm1.Timer1Timer(Sender: TObject);

begin

if RunFlag

then begin

// Добавить объект в в хвост очереди

IQueue.AddItemToTail(Random(Image1.Height - 1));

IQueue.ShowItemQueue();

end;

end;

end.

Unit Service1;

Interface

uses

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

Dialogs, StdCtrls, ExtCtrls;

//

type TQItem = class(TObject)

private

fPNext : pointer; // Указатель на следующий элемент

fData : integer; // Данные в элементе

public

procedure SetPNextToOBJ(RqPNext : pointer);

procedure SetDataToOBJ(RqData : integer);

function GetPNextFromOBJ() : pointer;

function GetDataFromOBJ() : integer;

end;

//

type TIQueue = class(TQItem)

protected

fMaxCount : integer; // Максимальная длина очереди

fPHead : TQItem; // Указагель элемента головы очереди

fPTail : TQItem; // Указатель элемента хвоста очереди

fICount : integer; // Счетчик элементов в очереди

fPBuf : TQItem; // Буферный указатель элемента очереди

fDisplay : TComponent; // Компонент для дисплея очереди

private

procedure SetMaxCount(aMaxCount : integer);

procedure ClearQueue();

public

constructor Create(RqDisplay : TComponent);

procedure Free();

procedure DeleteItemFromHead();

procedure AddItemToTail(RqData : integer);

procedure ShowItemQueue(); virtual;

property MaxCount : integer read fMaxCount write SetMaxCount;

end;

//

//type TDisplay = class(TIQueue)

// public

// procedure ShowItemQueue(); override;

//end;

Implementation

// -----------------------------------------------------------------------

// Реализация класса TQItem

// -----------------------------------------------------------------------

procedure TQItem.SetPNextToOBJ(RqPNext : pointer);

begin fPNext := RqPNext; end;

procedure TQItem.SetDataToOBJ(RqData : integer);

begin fData := RqData; end;

function TQItem.GetPNextFromOBJ() : pointer;

begin Result := fPNext; end;

function TQItem.GetDataFromOBJ() : integer;

begin Result := fData; end;

// -----------------------------------------------------------------------

// Реализация класса TIQueue

// -----------------------------------------------------------------------

// Полная очистка очереди

procedure TIQueue.ClearQueue();

begin

// Освободить все элементы очереди

if (fICount > 0) and Assigned(fPHead) and Assigned(fPTail)

then begin

repeat

fPBuf := fPHead; // Выборка элемента в буфер

fPHead := fPHead.GetPNextFromOBJ(); // Новый указатель головы

fPBuf.Free; // Освобождение элемента

until not Assigned(fPHead);

end;

end;

// Обслуживание свойства MaxCount

procedure TIQueue.SetMaxCount(aMaxCount : integer);

begin

if aMaxCount < fICount

then begin

ClearQueue(); // Полная очистка очереди

fMaxCount := aMaxCount; // Установка нового предельной длины очереди

end

else fMaxCount := aMaxCount; // Установка нового предельной длины очереди

ShowItemQueue(); // Отображение очереди с новыми параметрами

end;

// КОНСТРУКТОР

constructor TIQueue.Create (RqDisplay : TComponent);

begin

inherited Create;

fMaxCount := 30; // Максимальная длина очереди по умолчанию

fDisplay := RqDisplay; // Компонент для дисплея

end;

// ДЕСТРУКТОР

procedure TIQueue.Free();

begin

ClearQueue(); // Полная очистка очереди

inherited Free; // Освободить объект очередь

end;

// УДАЛИТЬ ОБЪЕКТ ИЗ ГОЛОВЫ ОЧЕРЕДИ С ПОСЛЕДУЮЩЕЙ ЕГО ЛИКВИДАЦИЕЙ

procedure TIQueue.DeleteItemFromHead();

begin

if (fICount > 0) and Assigned(fPHead)

then begin

// Для непустой очереди

fPBuf := fPHead; // Сохраним указатель на элемент головы

fPHead := fPBuf.GetPNextFromOBJ(); // Указатель головы на следующий элемент

fPBuf.Free; // Освободим элемент

fICount := fICount - 1; // Уменьшим счетчик объема очереди

if not Assigned(fPHead)

then begin

// Если новое состояние очереди пустое

fPTail := nil; // Очистим указатель хвоста очереди

fICount := 0; // Очистим счетчик объема очереди

end; end; end;

// ДОБАВИТЬ НОВЫЙ ОБЪЕКТ В ХВОСТ ОЧЕРЕДИ

procedure TIQueue.AddItemToTail(RqData : integer);

begin

if Assigned(fPTail) // Проверим указатель хвоста очереди

then begin

// Оченедь содержит элементы (добавим элемент в очередь)

fPBuf := fPTail; // Старый указатель на хвостовой элемент

fPTail := TQItem.Create; // Создадим новый элемент очереди

fPBuf.SetPNextToOBJ(fPTail); // Свяжем старый и новый элементы

fICount := fICount + 1; // Увеличим объем очереди

end else begin

// Очередь пустая (включем в нее первый элемент)

fPTail := TQItem.Create; // Создадим новый элемент очереди

fPTail.SetPNextToOBJ(nil); // Очистим указатель свяи элементов

fPHead := fPTail; // Установи новый указатель головы

fICount := 1; // Объем очереди равен единице

end;

fPTail.SetDataToOBJ(RqData); // Запишем в элемент данные

// Если допустимый объем очереди превышен удалить один элемент из головы

if (fICount > MaxCount)

then DeleteItemFromHead();

end;

// ОТОБРАЗИТЬ ОЧЕРЕДЬ

procedure TIQueue.ShowItemQueue();

begin

if (fDisplay is TMemo)

then begin

with fDisplay as TMemo do

begin

Clear;

if (fICount > 0) and Assigned(fPHead) and Assigned(fPTail)

then begin

fPBuf := fPHead;

repeat

Lines.Add(IntToStr(fPBuf.GetDataFromOBJ));

fPBuf := fPBuf.GetPNextFromOBJ();

until not Assigned(fPBuf);

end; end; end; end; end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]