Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornye_OOP.doc
Скачиваний:
17
Добавлен:
11.03.2015
Размер:
1.04 Mб
Скачать
  1. Тема, цель работы, вариант задания.

  2. Описание иерархии классов (рисунок диаграммы классов, текстовое описание свойств и методов каждого класса).

  3. Исходный текст модулей программы.

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

Программа состоит из следующих модулей: MainForm (главная форма), MyThread (содержит абстрактный базовый класс подпроцессов), MyThread_1 и MyThread_2 – модули подпроцессов, выполняющих определённую задачу.

  1. Модуль MyThread.

unit MyThread;

interface

uses

Windows, Classes, Forms, StdCtrls, Controls;

type

{ TMyThread - абстрактный базовый класс подпроцессов,

содержащий следующие поля и методы:

Form - форма содержащая обрабатываемые подпроцессом элементы;

FEdit - вспомогательная перменная типа TEdit, непосредственно

обрабатываемая подпроцессом;

Execute - стандартный абстрактный метод, содержащий код, исполняемый

подпроцессом во время работы. Перекрывая его мы можем вставить свой код.

Activity - абстрактная процедура, описываемая в подпроцессах-

наследниках, которая и содержит наш вставляемый код.

Create - перекрываемый нами стандартный конструктор. }

TMyThread = class(TThread)

protected

Form: TForm;

FEdit: TEdit;

procedure Execute; override;

procedure Activity; virtual; abstract;

public

constructor Create(PriorityLevel: TThreadPriority;

CreateSuspended: Boolean; AForm: TForm);

end;

implementation

constructor TMyThread.Create;

begin

inherited Create(CreateSuspended); // перекрываем стандартный конструктор

// CreateSuspended - определяет, начнёт ли подпроцесс работу сразу после создания

Priority := PriorityLevel; // установка уровня приоритета подпроцесса

FreeOnTerminate := true; // подпроцесс будет автоматически уничтожен после завершения работы

Form := AForm;

end;

procedure TMyThread.Execute;

var

i: Word;

begin

repeat

with Form do

for i := 0 to ComponentCount - 1 do

if (Components[i] is TEdit) then

begin

// если элемент формы Form - типа TEdit, то выполняем обработку

FEdit := Components[i] as TEdit;

Sleep(50); // задержка в 50 мс

// выполнение кода абстрактного метода Activaty

Synchronize(Activity);

end;

until Terminated

end;

end.

  1. Модуль MyThread_1.

unit MyThread_1;

interface

uses

Classes, Forms, StdCtrls, MyThread;

type

// подпроцесс, инвертирует св-во Visible эл-ов типа TEdit главного окна Form

TMyThread1 = class(TMyThread)

protected

procedure Activity; override; // перекрываем для дальнейшего определения

end;

implementation

procedure TMyThread1.Activity;

begin

FEdit.Visible := not FEdit.Visible; // инвертирует св-во Visible

end;

end.

  1. Модуль MyThread_2.

unit MyThread_2;

interface

uses

Classes, Forms, StdCtrls, MyThread;

type

// подпроцесс, выполняет циклический сдвиг текста,

// содержащегося в элементах типа TEdit главного окна Form

TMyThread2 = class(TMyThread)

protected

procedure Activity; override; // перекрываем для дальнейшего определения

end;

implementation

procedure TMyThread2.Activity;

var

i, n: Word;

c: Char;

s: string;

begin

s := FEdit.Text;

n := Length(s);

c := s[n];

for i := n downto 2 do s[i] := s[i - 1]; // циклический сдвиг вправо

s[1] := c;

FEdit.Text := s;

end;

end.

  1. Модуль MainForm.

unit MainForm1;

interface

uses

Windows, Classes, Graphics, Controls, Forms, StdCtrls,

Buttons, SysUtils, MyThread_1, MyThread_2;

type

TForm1 = class(TForm)

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

bbInfo: TBitBtn;

bbExit: TBitBtn;

GroupBox1: TGroupBox;

GroupBox2: TGroupBox;

GroupBox3: TGroupBox;

sbThread1: TSpeedButton;

sbThread2: TSpeedButton;

procedure bbInfoClick(Sender: TObject);

procedure bbExitClick(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure sbThreadClick(Sender: TObject);

public

// подпроцесс, инвертирует св-во Visible эл-ов типа TEdit главного окна

Thread1 : TMyThread1;

// подпроцесс, выполняет правый циклический сдвиг текста,

// содержащегося в этих элементах

Thread2 : TMyThread2;

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

{ создание подпроцессов с уровнем приоритета tpLower,

со свойством FreeOnTerminate установленным в True и

работающих с элементами формы Form1 }

Thread1 := TMyThread1.Create(tpLower, True, Form1);

Thread2 := TMyThread2.Create(tpLower, True, Form1);

end;

{ обработчик события OnClick кнопок sbThread1 и sbThread2,

запускающий/ приостанавливающей выполнение подпроцессов }

procedure TForm1.sbThreadClick(Sender: TObject);

var

Thread: TThread;

begin

// определение имени нажатой кнопки и соответствующего ей подпроцесса

if (Sender as TSpeedButton).Name = 'sbThread1' then Thread := Thread1

else Thread := Thread2;

if Thread.Suspended then // если подпроцесс Thread - приостановлен, то...

begin

(Sender as TSpeedButton).Font.Color := clRed;

// меняем цвет шрифта кнопки

(Sender as TSpeedButton).Caption := 'Выполняется...';

// изменяем заголовок

Thread.Resume; // запускаем подпроцесс.

end

else begin

(Sender as TSpeedButton).Font.Color := clWindowText;

(Sender as TSpeedButton).Caption := 'Пуск';

Thread.Suspend; // приостанавливаем подпроцесс

end;

end;

{ вывод информации о разработчике программы }

procedure TForm1.bbInfoClick(Sender: TObject);

begin

Application.MessageBox('Выполнил Фёдоров Виталий, гр. ПВ-33. ',

' Информация', MB_ICONINFORMATION)

end;

{ завершение приложения }

procedure TForm1.bbExitClick(Sender: TObject);

begin

Application.Terminate;

end;

{ уничтожение подпроцессов во время закрытия формы }

procedure TForm1.FormDestroy(Sender: TObject);

begin

if Assigned(Thread1) then

begin

Thread1.Terminate;

if not Thread2.Suspended then

Thread1.WaitFor;

end;

if Assigned(Thread2) then

begin

Thread2.Terminate;

if not Thread1.Suspended then

Thread2.WaitFor;

end;

end;

end.

Главная форма.

Варианты заданий:

  1. Один подпроцесс заменяет строчные символы Memo на прописные, а другой подпроцесс - наоборот. Символы выбираются случайным образом.

  2. Один подпроцесс добавляет строки в ListBox1, а другой подпроцесс переносит их из ListBox1 в ListBox2.

  3. Один подпроцесс случайным образом устанавливает фокус ввода элементам главного окна, а другой подпроцесс перемещает активный элемент.

  4. Один подпроцесс изменяет свойство Visible элементов главного окна на противоположное значение, а другой подпроцесс выполняет циклический сдвиг текста, содержащегося в этих элементах.

  5. Один подпроцесс удаляет текст элементов главного окна, а другой подпроцесс заносит в качестве текста символьное представление случайных чисел.

  6. Один подпроцесс создает на главном окне визуальные компоненты, а другой подпроцесс случайным образом удаляет их.

  7. В компонентах Min, Max:TSpinEdit задан диапазон изменения случайной функции, а подпроцесс непрерывно рисует график этой функции.

  8. Один подпроцесс выполняет подсчет количества гласных букв во всех компонентах TEdit главного окна, а другой подпроцесс выполняет передачу фокуса ввода тем компонентам, название которых начинается с заглавной буквы.

  9. Один подпроцесс создает бегущую строку, а другой подпроцесс выводит на экран текущее время.

  10. На экране расположено несколько светофоров, каждым из которых управляет отдельный подпроцесс.

  11. На главной форме находятся визуальные компоненты, расположением каждого из которых управляет отдельный подпроцесс.

  12. Один подпроцесс изменяет цвет компонентов TLabel, расположенных на главной форме, а другой подпроцесс - шрифт.

  13. На экране расположено несколько элементов TStatusBar, каждым из которых управляет отдельный подпроцесс.

  14. Компонент TDrawGrid содержит таблицу чисел. Один подпроцесс увеличивает их, а другой подпроцесс уменьшает.

  15. Компонент TRichEdit содержит текст. Один подпроцесс инвертирует регистр отдельных слов, а другой подпроцесс изменяет цвет слов.

Лабораторная работа №5

Потоки данных

Цель работы: приобретение навыков программирования потоков данных с использованием классов библиотеки VCL.

Задание:

  1. Изучить основные приемы работы с потоками данных с использованием классов библиотеки VCL.

  2. Разработать программу в соответствии с вариантом задания.

Содержание отчёта:

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