Смекни!
smekni.com

Учебно-методическое пособие для студентов физико-математических специальностей вузов Балашов (стр. 17 из 18)

Поместим на форму два компонента Edit, в одном из которых будет выдаваться имя класса, а во втором — размер класса. Определим дополнительное поле class1 типа TClass, в котором будем хранить имя класса. Вся работа в программе сводится к двум процедурам обработки событий — это создание формы и нажатие на кнопку. При создании формы в переменной class1 будем записывать имя произвольного класса, а при нажатии кнопки будем в одном компоненте Edit выдавать имя класса в другой размер данного класса, а также определять класс непосредственного предка.

Тогда программа будет иметь вид:

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, AxCtrls, OleCtrls, vcf1, MPlayer, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Button1: TButton;

Edit2: TEdit;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

class1:TClass; {описание поля - класс}

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

Class1:=TButton; {задание произвольного класса}

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Edit1.Text:=class1.ClassName; {определение имени класса}

Edit2.Text:=IntToStr(class1.InstanceSize); {определение размера объекта класса}

class1:=class1.ClassParent; {определение непосредственного предка}

end;

end.

Класс TPersistent (постоянный) является потомком класса TObject
и предком всех классов, объекты которых могут быть помещены в память и взяты оттуда.

Класс TComponent является родоначальником всех компонентов, используемых в приложении. Класс TComponent содержит ряд свойств
и методов, обеспечивающих отношение объектов основной/вспомогатель-ный. Целочисленное ComponentCount определяет число вспомогательных компонентов текущего компонента. Это свойство доступно только для чтения и только во время выполнения программы и автоматически изменяет свое значение при добавлении вспомогательного компонента методом InsertComponent или удаления компонента методом RemoveComponent. Свойство ComponentIndex определяет положение компонента в списке вспомогательных компонентов основного компонента. Нумерация компонент начинается с 0.

Свойство Component[Index:Integer] типа TComponent задает список вспомогательных компонентов. Свойство Owner типа TComponent содержит указатель на основной компонент.

Пример 2

Получить имена и классы всех компонентов, расположенных на форме.

Поместим на форму четыре компонента Edit и один компонент Button. В разделе public формы опишем целочисленную переменную i, в которой будем хранить номер компонента. Начальное значение данной переменной будет задаваться при создании формы. При нажатии на кнопку в соответствующих компонентах Edin будем выдавать имя компонента, имя класса и порядковый номер. Тогда программа может иметь следующий вид:

procedure TForm1.FormCreate(Sender: TObject);

begin

I:=0;

Edit4.Text:=IntToStr(Form1.ComponentCount);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

If i<=Form1.ComponentCount-1 then

begin

Edit1.Text:=Form1.Components[i].Name;

Edit2.Text:=Form1.Components[i].ClassName;

Edit3.Text:=IntToStr(i);

i:=i+1;

end;

end;

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

Класс TControl является родоначальником всех элементов управления, с помощью которых вводится информация на экран при помощи клавиатуры и мыши. Все компоненты управления могут отображаться на экране, а следовательно, они должны содержать свойства, в которых хранятся экранные координаты компонента (Left, Top, Height, Weight), свойства определяющие внешний вид и положение элемента на экране (Align, Color, Caption, Cursor, Fount, Visible, ...).

Класс TWinControl характеризуется наличием у объектов его семейства оконных функций, что приводит к возможности реакции такого элемента на внешнее воздействие. Класс имеет характеристики, позволяющие формировать изображение элементов управления в стиле Windows.

Класс TScrollingWinControl является предком всех прокручиваемых элементов управления. Дополнительно к наследуемым характеристикам он обладает средствами прокрутки изображения, если оно целиком
не умещается в окне.

Класс TGraphControl отличается тем, что у объектов его семейства отсутствуют оконные функции, в силу чего они не могут реагировать на внешние воздействия. В связи с этим такие элементы могут служить только для вывода на экран графической информации.

Правило Object Pascal о совместимости типов классов позволяет использовать класс-потомок там, где требуется класс-предок, но не наоборот.

Делая явное преобразование типов, мы можем вызвать очень неприятную ошибку времени выполнения (или, что еще хуже, незаметное изменение содержимого памяти), поскольку компилятор не может определить, является ли тип объекта корректным и существуют ли в действительности вызываемые методы.

Чтобы решить эту проблему, мы можем использовать технику, основанную на информации о типе времени выполнения (Run-time type information, RTTI). Суть состоит в том, что каждый объект «знает» свой тип, а также класс своего родителя. Мы можем обратиться к этой информации, используя оператор is или некоторые методы класса TObject. Параметрами оператора is являются объект и тип класса, а возвращаемое значение имеет тип Boolean. Например,

If Omyclass is TMyClass then

Выражение is принимает значение True, если OMyClass в данный момент ссылается на объект класса TMyClass или его потомка. Теперь, когда вы уверены, что переменная совместима с типом TMyClass, можно произвести безопасное приведение (преобразование) типов.

Такие же операции выполняются напрямую другим оператором RTTI, оператором as, который преобразует объект только в том случае, если тип запрашиваемого класса совместим с текущим. Параметрами оператора as являются объект и тип класса, а результатом является объект, приведенный к новому типу.

Разница между традиционным преобразованием типов и использованием оператора as заключается в том, что последний вызывает исключительную ситуацию (EInvalidCast), если тип объекта не совместим с типом класса, к которому вы пытаетесь его привести.

Задание:

1. Проверьте все программы из данной лабораторной работы.

Лабораторная работа 12. Потоки

Цель: изучить классы TStream и TThread, возможности при создании многопоточных приложений.

В языке программирования Delphi имеется два различных вида потоков: поток данных и поток команд.

В начале несколько слов о потоках данных — класс TStream. Потоки данных — это обобщенная модель двоичных данных, размещенных на устройствах-накопителях, таких как диски, оперативная память и т. д. Любой поток обладает двумя ключевыми свойствами — размером в байтах (свойство Size) и текущей позицией (Position). Родоначальником всех потоков является абстрактный класс TStream, от которого порождены некоторые специализированные потоки, такие как: TFileStream (файловый поток), TMemoryStream (поток буферов в памяти) и т. д. Более подробно данные потоки можно изучить самостоятельно, а сейчас рассмотрим потоки событий.

Одна из возможностей, которая имеется в операционной системе Windows и поддерживается языком программирования Delphi — это потоки действий или нити (thread). Смысл потоков заключается в том, что одновременно может выполняться несколько различных видов работы. Например, приложения Word и Excel задействуют сразу несколько потоков. Word может одновременно корректировать грамматику, печатать документ
и осуществлять ввод данных с клавиатуры.

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

В языке программирования Delphi потоки реализованы в виде объектов, которые получают время работы процессора квантами (около 19 мс).

Класс TThread позволяет программировать потоки. В отличие от визуальных компонентов из библиотеки VCL, которые автоматически формируются при создании формы, потоки необходимо самостоятельно инициализировать посредством конструктора Creat(CreatS:Boolean). Если значение логического параметра CreatS имеет значение False, то поток сразу после создания начинает исполняться, если значение данного параметра будет True, то для запуска метода на исполнение необходимо использовать метод Resume. Деструктор Destroy вызывается, когда необходимость в потоке отпадает, при этом поток останавливается и освобождаются все ресурсы, связанные с этим потоком. Метод Terminate осуществляет завершение потока (без последующего запуска), а метод Suspend позволяет приостановить выполнение потока. Логическое свойство Suspended проверяет, приостановлен ли поток или продолжает выполняться. С помощью этого свойства можно приостановить и запустить поток на исполнение. Установив его в True, получаем тот же эффект, что и при вызове метода Suspend, а установив в False, возобновляем выполнение потока, как и метод Resume.

Главный метод потока из класса TThread — это виртуальный, абстрактный метод Execute. В его теле должен содержаться код, который
и представляет собой поток. Поскольку данный метод является абстрактным, то рассматривать переменную данного класса бессмысленно, необходимо породить дочерний тип, в котором этот метод будет переопределен.

Рассмотрим еще несколько важных свойств и методов потоков.

Свойство Priority класса TThreadPriority позволяет запрашивать и определять приоритет потоков. Приоритет определяет, насколько часто поток будет получать время работы процессора. Допустимые значения приоритетов tpIdle, tpLowest, tpLower, tpHigher, tpHigest, tpTImeCritical. В данном списке перечислены приоритеты от самого низкого — фонового приоритета, до самого высокого — приоритета реального времени. Необходимо быть очень внимательным при использовании двух последних приоритетов, поскольку они могут влиять на выполнение всего приложения. Как правило, используются приоритеты tpLowest и tpLower.