
НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ
ІНСТИТУТ АЕРОКОСМІЧНИХ СИСТЕМ УПРАВЛІННЯ
КАФЕДРА ЕЛЕКТРОТЕХНІКИ ТА СВІТЛОТЕХНІКИ
Лабораторна робота № 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.