Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.12.2011, 02:17
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
Восклицание Изменение класса TTimer

Такой вопросик. Можно ли создав свой класс на основе 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  
Старый 28.12.2011, 02:24
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

С ума сойти. И что это всё должно означать?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 28.12.2011, 02:35
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

В OnTimer и так пишется свой обработчик. Думаю, проще использовать WinAPI'шные таймеры, если нужно другое, чем пытаться из сложного сделать простое путем усложнения. Хотя я еще не встречал ситуации, чтоб нельзя было обойтись делфовским таймером. Опишите поподробнее суть задачи.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 28.12.2011, 04:53
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

PHP код:
tMyLabelTimer = class(tTimer)
private
  
fLabeltLabel;
  
procedure MyonTimer(SendertObject);
  
constructor Create(aIntervalIntegeraLabeltLabel);
end;

/////////////////////

procedure TForm1.Button1Click(SenderTObject);
begin
  tMyLabelTimer
.Create(1000Label1);
end;

tMyLabelTimer }

constructor tMyLabelTimer.Create(aIntervalIntegeraLabeltLabel);
begin
  inherited Create
(nil);
  
Interval := aInterval;
  
fLabel := aLabel;
  
OnTimer := MyonTimer// <===
end;

procedure tMyLabelTimer.MyonTimer(SendertObject);
begin
  fLabel
.Caption := IntToStr(random(100));
end
кстати по умолчанию enabled=true после создания
Ответить с цитированием
  #5  
Старый 28.12.2011, 12:37
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
Вопрос

Создаю класс в котором помещаю переменную типа TTimer. Как мне тогда добраться до её(переменной TTimer) поцедуры onTimer, чтобы туда записать действия, которые будут происходить при наступлении этого события(onTimer)?
Ответить с цитированием
  #6  
Старый 28.12.2011, 12:41
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
По умолчанию

Цитата:
Сообщение от angvelem
С ума сойти. И что это всё должно означать?
Я компонент TTimer не помещал на форму. Я его просто обявляю в классе. Хочу написать класс который будет через определённый интервал временни менять значение EditLabel.
Ответить с цитированием
  #7  
Старый 28.12.2011, 13:37
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 28.12.2011, 16:30
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Как мне тогда добраться до её(переменной TTimer) поцедуры onTimer, чтобы туда записать действия, которые будут происходить при наступлении этого события(onTimer)?
Я бы просто записал нужную процедуру в соответствующее поле при создании:
Код:
 LabelTimer.T1 := TTimer.Create(...);
 LabelTimer.T1.onTimer:=TimeronTimer; // TimeronTimer должно быть методом, желательно главной формы, т.е. Form1.TimeronTimer.
Ведь фактически редактирование свойства onTimer в инспекторе объектов и есть запись соотв. значения в нужное поле.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Fantomas_RUS (31.12.2011)
  #9  
Старый 28.12.2011, 16:33
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
По умолчанию

Поясните пожалуйста эту строчку, что она означает
Код:
property OnTimer: TNotifyEvent write SetOnTimer;
Ответить с цитированием
  #10  
Старый 28.12.2011, 16:47
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

это ж классика!)
она определяет public свойство OnTimer и указывает процедуру SetOnTimer, через которую "этому свойству присваивается значение". т.е. при присвоении свойству OnTimer какого-либо значения вызывается процедура SetOnTimer с этим значением в качестве параметра. тип свойства - метод.
type TNotifyEvent = procedure (Sender: TObject) of object;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 31.12.2011, 13:22
Аватар для Fantomas_RUS
Fantomas_RUS Fantomas_RUS вне форума
Прохожий
 
Регистрация: 12.10.2010
Сообщения: 47
Репутация: 11
По умолчанию

Цитата:
Сообщение от Bargest
Я бы просто записал нужную процедуру в соответствующее поле при создании:
Код:
 LabelTimer.T1 := TTimer.Create(...);
 LabelTimer.T1.onTimer:=TimeronTimer; // TimeronTimer должно быть методом, желательно главной формы, т.е. Form1.TimeronTimer.
Ведь фактически редактирование свойства onTimer в инспекторе объектов и есть запись соотв. значения в нужное поле.

Вообще стало лего давать свои процедуры на выполнение, при каком нибудь событии. Спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025