- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
- •Модуль GraphObj.
- •Модуль Point.
- •Модуль Circle.
- •Модуль Rect.
- •Модуль Line.
- •Модуль Square.
- •Модуль Trian.
- •Основной модуль oop_Lab3.
- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
- •Тема, цель работы, вариант задания.
-
Тема, цель работы, вариант задания.
-
Описание иерархии классов (рисунок диаграммы классов, текстовое описание свойств и методов каждого класса).
-
Исходный текст модулей программы.
Пример. Один подпроцесс изменяет свойство Visible элементов главного окна на противоположное значение, а другой подпроцесс выполняет циклический сдвиг текста, содержащегося в этих элементах.
Программа состоит из следующих модулей: MainForm (главная форма), MyThread (содержит абстрактный базовый класс подпроцессов), MyThread_1 и MyThread_2 – модули подпроцессов, выполняющих определённую задачу.
-
Модуль 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.
-
Модуль 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.
-
Модуль 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.
-
Модуль 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.
Главная форма.
Варианты заданий:
-
Один подпроцесс заменяет строчные символы Memo на прописные, а другой подпроцесс - наоборот. Символы выбираются случайным образом.
-
Один подпроцесс добавляет строки в ListBox1, а другой подпроцесс переносит их из ListBox1 в ListBox2.
-
Один подпроцесс случайным образом устанавливает фокус ввода элементам главного окна, а другой подпроцесс перемещает активный элемент.
-
Один подпроцесс изменяет свойство Visible элементов главного окна на противоположное значение, а другой подпроцесс выполняет циклический сдвиг текста, содержащегося в этих элементах.
-
Один подпроцесс удаляет текст элементов главного окна, а другой подпроцесс заносит в качестве текста символьное представление случайных чисел.
-
Один подпроцесс создает на главном окне визуальные компоненты, а другой подпроцесс случайным образом удаляет их.
-
В компонентах Min, Max:TSpinEdit задан диапазон изменения случайной функции, а подпроцесс непрерывно рисует график этой функции.
-
Один подпроцесс выполняет подсчет количества гласных букв во всех компонентах TEdit главного окна, а другой подпроцесс выполняет передачу фокуса ввода тем компонентам, название которых начинается с заглавной буквы.
-
Один подпроцесс создает бегущую строку, а другой подпроцесс выводит на экран текущее время.
-
На экране расположено несколько светофоров, каждым из которых управляет отдельный подпроцесс.
-
На главной форме находятся визуальные компоненты, расположением каждого из которых управляет отдельный подпроцесс.
-
Один подпроцесс изменяет цвет компонентов TLabel, расположенных на главной форме, а другой подпроцесс - шрифт.
-
На экране расположено несколько элементов TStatusBar, каждым из которых управляет отдельный подпроцесс.
-
Компонент TDrawGrid содержит таблицу чисел. Один подпроцесс увеличивает их, а другой подпроцесс уменьшает.
-
Компонент TRichEdit содержит текст. Один подпроцесс инвертирует регистр отдельных слов, а другой подпроцесс изменяет цвет слов.
Лабораторная работа №5
Потоки данных
Цель работы: приобретение навыков программирования потоков данных с использованием классов библиотеки VCL.
Задание:
-
Изучить основные приемы работы с потоками данных с использованием классов библиотеки VCL.
-
Разработать программу в соответствии с вариантом задания.
Содержание отчёта: