Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.48.212] |
|
Сообщ.
#1
,
|
|
|
В конструкторе я переопределяю процедуры событий OnClick, OnMouseMove, OnMouseLeave.
Свойство Cursor в Инспекторе Объектов скрыть получилось. Хотелось бы так скрыть вышеуказанные эвенты. Собственно проблема в том, что когда разработчик определяет событие в Design-time, событие моего компонента перекрывается и не срабатывает, а работает только событие определенное в design-time. unit URLLabel; interface uses SysUtils, Classes, Controls, StdCtrls, Graphics, Dialogs, DesignIntf; type TURLLabel = class(TLabel) private { Private declarations } FUnderlineUrl: boolean; FColorURL: TColor; FColorURLOnMouse: TColor; procedure SetUnderlineURL(Value:boolean); procedure SetColorURLOnMouse(Value:TColor); procedure SetColorURL(Value:TColor); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; {события} procedure URLOnClick(Sender: TObject); procedure URLOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure URLOnMouseLeave(Sender: TObject); published { Published declarations } //property Cursor:integer read FDummy; property UnderlineURL: boolean read FUnderlineURL write SetUnderlineURL; property ColorURL:TColor read FColorURL write SetColorURL; property ColorURLOnMouse:TColor read FColorURLOnMouse write SetColorURLOnMouse; end; procedure Register; implementation //{$R IconFileName.dcr} procedure Register; begin RegisterComponents('Samples', [TURLLabel]); RegisterPropertyEditor(TypeInfo(TCursor), TURLLabel, 'Cursor', nil); // скрываем свойство компонента в Инспекторе Объектов end; constructor TURLLabel.Create(AOwner: TComponent); begin inherited; FColorURL:=$00FF0000; FColorURLOnMouse:=$007C0089; Font.Color:=FColorURL; FUnderLineURL:=true; Cursor:=crHandPoint; OnMouseMove:=URLOnMouseMove; OnMouseLeave:=URLOnMouseLeave; OnClick:=URLOnClick; end; destructor TURLLabel.Destroy; begin inherited; end; procedure TURLLabel.SetColorURL(Value:TColor); begin if FColorUrl<>Value then begin FColorURL:=Value; Font.Color:=FColorURL; invalidate; end; end; procedure TURLLabel.SetUnderlineURL(Value:boolean); begin if Value=true then begin FUnderLineURL:=Value; Font.Style:=[fsUnderline]; Invalidate; end else begin FUnderLineURL:=Value; Font.Style:=[]; Invalidate; end; end; procedure TURLLabel.SetColorURLOnMouse(Value:TColor); begin if FColorUrlOnMouse<>Value then begin FColorURLOnMouse:=Value; end; end; procedure TURlLabel.URLOnMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); // двигаем мышью над контролом begin inherited; Font.Color:=FColorURLOnMouse; end; procedure TURLLabel.URLOnClick(Sender: TObject); begin inherited; ShowMessage(Caption); end; procedure TURLLabel.URLOnMouseLeave(Sender: TObject); // убираем мышь из границ контрола begin inherited; Font.Color:=FColorURL; end; end. |
Сообщ.
#2
,
|
|
|
перекрой метод Loaded и в нем изменяй OnClick... не забудь после себя, выполнить которые там уже были
или просто обрабатывай виндовые сообщения, тогда и ты управление получишь и тот кто использует твой компонент. |
Сообщ.
#3
,
|
|
|
Не нужно присваивать событиям свои обработчики, это дело конечного пользователя компонента, нужно переопределять динамические методы, вызывающие эти события. Например
TMyControl = class(TControl) protected procedure Click; override; procedure MouseMove(Shift: TShiftState; X, Y: Integer);override; end; procedure TMyControl.Click; begin // делаем свои действия, а потом вызываем родительский метод, который и обрабатывает событие пользователя (можем не вызывать, тогда OnClick вообще не сработает) inherited Click; end; procedure MouseMove(Shift: TShiftState; X, Y: Integer); begin // делаем свои действия inherited MouseMove(Shift, X, Y); end; Добавлено Если вам нужно скрыть свойство, унаследуйтесь от Custom-предка и не публикуйте событие. Если нет Custom-предка, скрыть событие в инспекторе можно зарегистрировав NIL-редактор для этого свойства, но в Run-Time свойство всё равно будет доступно. |
Сообщ.
#4
,
|
|
|
DimaBr, компилятор выдает, что MouseLeave не найден в базовом классе, но мне это событие нужно. А ведь OnMouseLeave в Tlabel есть.
Что делать? |
Сообщ.
#5
,
|
|
|
Цитата TechnoMag @ А ведь OnMouseLeave в Tlabel есть. Это один из немногих случаев, когда событие вызывается напрямую из обработчика сообщения CMMouseLeave, который и нужно переопределить: TUrlLabel = class(TLabel) private ... procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; ... end; procedure TUrlLabel.CMMouseLeave(var Message: TMessage); begin inherited; ... //доп.действия end; |
Сообщ.
#6
,
|
|
|
Всем спасибо!
|