![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Такой вопросик. Можно ли создав свой класс на основе TTimer написать свой обработчик процедуры onTimer. Как это сделать, что то у меня выскакивают ошибки при использовании моего класса.
Код:
type
TLabelTimer = class(TTimer)
private
A:boolean;
T1:TTimer;
protected
procedure onTimer(Component: TLabeledEdit);
procedure Ed_L_Style_Red(Component: TLabeledEdit);
procedure Ed_L_Style_Custom(Component: TLabeledEdit);
public
constructor Create(mSec:Integer;Form:TForm;LabelEdit:TComponent);
published
end;
THintTimer = class(TTimer)
private
procedure HintTLabeledEdit(Component: TLabeledEdit;S:String;Form:TForm);
protected
H:THintWindow;
Lab:TLabelTimer;
HintRec:TRect;
procedure onTimer(Component: TLabeledEdit);
procedure Hint_Clear();
public
constructor Create(mSec:Integer;Form:TForm;LabelEdit:TComponent);// override;
procedure Start(Massage:string);
// destructor Destroy; override;
published
end;Код:
{ THintTimer }
constructor TLabelTimer.Create(mSec:Integer;Form:TForm;LabelEdit:TComponent);
begin
inherited Create(Form);
Self.Interval:=mSec;
A:=false;// ïåðåêëþ÷àëêà
end;
procedure TLabelTimer.Ed_L_Style_Custom(Component: TLabeledEdit);
begin
Component.EditLabel.Font.Color:=$00000000;
Component.EditLabel.Font.Style:=Component.EditLabel.Font.Style-[fsBold];
end;
procedure TLabelTimer.Ed_L_Style_Red(Component: TLabeledEdit);
begin
Component.EditLabel.Font.Color:=$000000FF;
Component.EditLabel.Font.Style:=Component.EditLabel.Font.Style+[fsBold];
end;
procedure TLabelTimer.onTimer(Component: TLabeledEdit);
begin
inherited Timer;
if A then
begin
Ed_L_Style_Red(Component);
A:=false;
end
else
begin
Ed_L_Style_Custom(Component);
A:=true;
end;
end;
procedure THintTimer.onTimer(Component: TLabeledEdit);
begin
Hint_Clear;
Lab.Ed_L_Style_Custom(Component);
Destroy;
end;
procedure THintTimer.Hint_Clear;
begin
if h<>nil then
H.ReleaseHandle;
end;
procedure THintTimer.Start(Massage:string);
begin
H.ActivateHint(HintRec,Massage);
Self.Enabled:=true;
Lab.Enabled:=true;
end;
{ THintTimer }
constructor THintTimer.Create(mSec:Integer;Form:TForm;LabelEdit:TComponent);
begin
inherited Create(Form);
H:=THintWindow.Create(Form);
Lab:=TLabelTimer.Create(mSec,Form,LabelEdit);
end;
procedure THintTimer.HintTLabeledEdit(Component: TLabeledEdit;S:String;Form:TForm);
begin
HintRec.Left:=Form.Left+Component.Left;
HintRec.Top:=Form.Top+Component.Top-20;
HintRec.Right:=Form.Left+Component.Left+Length(S)*5;
HintRec.Bottom:=Form.Top+Component.Top+10;
end;Код:
var Hint:THintTimer;
Hint.Start('gggggggggggggg');
Hint.OnTimer(Self); |
|
#2
|
||||
|
||||
|
С ума сойти. И что это всё должно означать?
|
|
#3
|
||||
|
||||
|
В OnTimer и так пишется свой обработчик. Думаю, проще использовать WinAPI'шные таймеры, если нужно другое, чем пытаться из сложного сделать простое путем усложнения.
Хотя я еще не встречал ситуации, чтоб нельзя было обойтись делфовским таймером. Опишите поподробнее суть задачи. |
|
#4
|
|||
|
|||
|
PHP код:
|
|
#5
|
||||
|
||||
|
Создаю класс в котором помещаю переменную типа TTimer. Как мне тогда добраться до её(переменной TTimer) поцедуры onTimer, чтобы туда записать действия, которые будут происходить при наступлении этого события(onTimer)?
|
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
||||
|
||||
|
Код:
type
TWhatTimer = class
private
FTimer: TTimer;
FLabeledEdit: TLabeledEdit;
procedure SetOnTimer(Sender: TNotifyEvent);
procedure InnerOnTimer(Sender: TObject);
public
property OnTimer: TNotifyEvent write SetOnTimer;
constructor Create(ALabeledEdit: TLabeledEdit);
destructor Destroy; override;
end;
constructor TWhatTimer.Create(ALabeledEdit: TLabeledEdit);
begin
inherited Create;
FLabeledEdit:=ALabeledEdit;
FTimer:=TTimer.Create(nil);
FTimer.Interval:=500;
FTimer.OnTimer:=InnerOnTimer; // назначаем внутренний обработчик (default)
end;
destructor TWhatTimer.Destroy;
begin
FTimer.Free;
inherited Destroy;
end;
procedure TWhatTimer.InnerOnTimer(Sender: TObject);
begin
// внутренний обработчик событий
FLabeledEdit.Text:=IntToStr(FLabeledEdit.Tag);
FLabeledEdit.Tag:=FLabeledEdit.Tag+1;
end;
procedure TWhatTimer.SetOnTimer(Sender: TNotifyEvent);
begin
if Assigned(Sender) then FTimer.OnTimer:=Sender
else FTimer.OnTimer:=InnerOnTimer;
end;использование: Код:
TForm1 = class(TForm)
LabeledEdit1: TLabeledEdit;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TForm1.FormCreate(Sender: TObject);
begin
FWhatTimer:=TWhatTimer.Create(LabeledEdit1); // создаем TWhatTimer
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FWhatTimer.Free; // уничтожаем TWhatTimer
end;
procedure TForm1.OuterOnTimer(Sender: TObject);
begin
// внешний обработчик событий TWhatTimer
LabeledEdit1.Text:=IntToStr(LabeledEdit1.Tag);
LabeledEdit1.Tag:=LabeledEdit1.Tag-1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FWhatTimer.OnTimer:=OuterOnTimer; // назначаем внешний обработчик
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FWhatTimer.OnTimer:=nil; // восстанавливаем внутренний обработчик
end;http://zalil.ru/32393085 внутренний обработчик таймера (по умолчанию) увеличивает значение, когда подключаем внешний обработчик (нажатием на кнопку 1) значение будет уменьшаться. кнопка 2 снова восстанавливает внутренний обработчик. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Fantomas_RUS (28.12.2011)
| ||
|
#8
|
||||
|
||||
|
Цитата:
Код:
LabelTimer.T1 := TTimer.Create(...); LabelTimer.T1.onTimer:=TimeronTimer; // TimeronTimer должно быть методом, желательно главной формы, т.е. Form1.TimeronTimer. |
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Fantomas_RUS (31.12.2011)
| ||
|
#9
|
||||
|
||||
|
Поясните пожалуйста эту строчку, что она означает
Код:
property OnTimer: TNotifyEvent write SetOnTimer; |
|
#10
|
||||
|
||||
|
это ж классика!)
она определяет public свойство OnTimer и указывает процедуру SetOnTimer, через которую "этому свойству присваивается значение". т.е. при присвоении свойству OnTimer какого-либо значения вызывается процедура SetOnTimer с этим значением в качестве параметра. тип свойства - метод. type TNotifyEvent = procedure (Sender: TObject) of object; |
|
#11
|
||||
|
||||
|
Цитата:
Вообще стало лего давать свои процедуры на выполнение, при каком нибудь событии. Спасибо. |