Чтение онлайн

на главную - закладки

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:
Листинг 1.24. Базовая часть класса
TLine

type

 TLine = class(TComponent)

 private

// FCoords хранит координаты линии. Начало линии

// находится в точке (FCoords[0], FCoords[1]),

// конец - в (FCoords[2], FCoords[3]).

FCoords:array[0..3] of Integer;

// Конструктор класса
написан так, что владельцем TLine

// может стать только TWinControl или его наследник.

// Но свойство Owner имеет тип TComponent, поэтому при

// использовании свойств и методов класса TWinControl

// Owner придется каждый раз приводить к типу

// TWinControl. Чтобы избежать приведений типа,

// используется поле FWinOwner. Оно указывает на тот же

// объект, что и Owner, но имеет тип TWinControl.

FWinOwner: TWinControl;

// Здесь хранится адрес обработчика сообщений, бывший до

// перехвата.

FOldProc: TWndMethod;

// Цвет линии

FColor: TColor;

// Состояние линии. Если FStartMoving = True, в данный

// момент пользователь перемещает начало линии, если

// FEndMoving = True - ее конец.

FStartMoving, FEndMoving: Boolean;

// Если FDrawLine = False, линия не рисуется. Это

// используется, когда нужно стереть линию.

FDrawLine: Boolean;

procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;

procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;

procedure WMLButtonUp(var Msg: TWMButtonUp); message WM_LBUTTONUP;

procedure WMMouseMove(var Msg: TWMMouseMove); message WM_MOUSEMOVE;

procedure SetColor(Value: TColor);

procedure SetCoord(Index, Value: Integer);

 protected

// Этот метод будет новым обработчиком сообщений

// владельца

procedure HookOwnerMessage(var Msg: Message);

 public

constructor Create(AOwner: TComponent); override;

destructor Destroy; override;

procedure DefaultHandler(var Msg); override;

 published

property Color: TColor read FColor write SetColor default clWindowText;

property StartX: Integer index 0 read FCoords[0] write SetCoord default 10;

property StartY: Integer index 1 read FCoords[1] write SetCoord default 10;

property EndX: Integer index 2 reed FCoords[2] write SetCoord default 50;

property EndY: Integer index 3 read FCoords[3] write SetCoord default 50;

 end;

...

constructor TLine.Create(AOwner: TComponent);

begin

 if not Assigned(AOwner) then raise EWrongOwner.Create(

'Должен
быть назначен владелец компонента TLine');

 if not (AOwner is TWinControl) then raise EWrongOwner.Create(

'Владелец компонента TLine должен быть наследником TWinControl');

 FWinOwner := AOwner as TWinControl;

 inherited;

 FCoords[0] := 10;

 FCoords[1] := 10;

 FCoords[2] := 50;

 FCoords[3] := 50;

 FColor := clWindowText;

 FStartMoving := False;

 FEndMoving := False;

 FDrawLine := True;

 // Запоминаем старый обработчик сообщений владельца и

 // назначаем новый.

 FOldProc := FWinOwner.WindowProc;

 FWinOwner.WindowProc := HookOwnerMessage;

 FWinOwner.Refresh;

end;

destructor TLine.Destroy;

begin

 // Восстанавливаем старый обработчик сообщений владельца.

 FWinOwner.WindowProc := FOldProc;

 FWinOwner.Refresh;

 inherited;

end;

procedure TLine.HookOwnerMessage(var Msg: TMessage);

begin

 // Единственное, что делает перехватчик сообщений -

 // передает их методу Dispatch. Было бы оптимальнее

 // назначить обработчиком сообщений сам метод Dispatch,

 // но формально он имеет прототип, несовместимый с

 // типом TWndMethod, поэтому компилятор не разрешает

 // подобное присваивание. Фактически же Dispatch

 // совместим с TWndMethod, поэтому, используя хакерские

Поделиться:
Популярные книги

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Пипец Котенку! 3

Майерс Александр
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода