안녕하세요?
컴포넌트 제작 일을 돕고 있는 학생이지요...
타이머를 포함한 컴포넌트를 만들려고 하는데, 뜻밖의 문제에 도달하였답니다.
소스도 같이 올립니다.
보통, 예를 들어 click 이벤트와 같이 사용자 이벤트가 직접적으로 주어지는 경우는
제대로 동작하였으나,
Timer의 OnTimer 즉, 가상메소드인 Timer를 이용하니,
컴포넌트로 코딩한대로 실행이 되지 않았습니다.
그래서, 실험정신(?)으로, 저의 임시 타이머 컴포넌트를 이용하여, 아래에 보시는
대로, 저의 컴포넌트에 OnTimer의 동작이 명시되어 있음에도 불구하고,
원래, Events 창에 있는 OnTimer를 이용하여 다시 유사한 동작을
명시하여 보았습니다.
그르니까, 저의 컴포넌트의 OnTiemr는 OnTime시에 'aaaa'를 ShowMessage로 띄
우게 하고, Events창의 OnTimer에게는 'bbbb' 메세지를 띄우게 하였습니다.
그러고 나서 실행하고 나니, aaaa와 bbbb가 교대로 띄워지지 않겠습니까?
학교 선배님의 추측으로는,
Timer는 사용자 이벤트로 직접적으로 주어지는 것이 아니라, 시스템적인 것이므로,
타이머는 원래 주어진 컴포넌트에서 요구가 있을때만 동작하는 것이 아니겠냐고
하시더군요.
정말 그런가요?
컴포넌트로 주어진 시간뒤에 어떤 동작을 할수 있게 하는 방법이 없나요?
아시는 고수님들!! 꼭 가르쳐 주세요!!
unit ExT;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
type
TExT = class(TTimer)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Timer; override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
end;
procedure Register;
implementation
constructor TExT.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
procedure TExT.Timer;
begin
inherited Timer;
ShowMessage('aaaa');
end;
procedure Register;
begin
RegisterComponents('Samples', [TExT]);
end;
end.
말씀하신대로 'aaaa'와 'bbbb'가 교대로 띄워지는게 제대로 작동하는 것입니다.
작성하신 타이머의 Timer메소드를 보시면 아래와 같이 부모의 Timer메소드를 호출하셨
더군요. 그러니까 부모의 Timer메소드에서 OnTimer를 호출하여 'bbbb'를 띄우고 그다음
아래 코드의 'aaaa'를 띄우는 것입니다. 그러니 타이머 이벤트마다 교대로 계속해서
뜨는 것입니다. 이것이 제대로된 동작입니다.
> procedure TExT.Timer;
> begin
> inherited Timer;
>
> ShowMessage('aaaa');
> end;
사실 TTimer.Timer메소드는 단지 OnTimer이벤트가 설정되어 있을때 호출하는 역활밖에
하지 않습니다.
제 추측입니다만 아마도 하실려는 일이 매번 타이머 이벤트(OnTimer)가 발생하는 것이
아니라 어떤 일정한 시간이 되면 OnTimer이벤트가 발생하게 하실려는것 같은데요.
타이머에 계수를 하나 설정해두고 그것이 어떤 시간을 가리킨다면 OnTimer이벤트를
실행하는 방식으로 짜신다면 될것같은데요. 아래와 같은식으로요...
procedure TExT.Timer;
begin
if 계수 = 일정한시간 then
begin
if Assigned(FOnTimer) then
OnTimer(Self);
end
else
계수 = 계수 + 1;
end;
아니면 타이머의 Interval을 설정하시는 것도 있구요.
^^ 항상 즐코하세요.
양은주 wrote:
> 안녕하세요?
> 컴포넌트 제작 일을 돕고 있는 학생이지요...
>
> 타이머를 포함한 컴포넌트를 만들려고 하는데, 뜻밖의 문제에 도달하였답니다.
> 소스도 같이 올립니다.
>
> 보통, 예를 들어 click 이벤트와 같이 사용자 이벤트가 직접적으로 주어지는 경우는
> 제대로 동작하였으나,
> Timer의 OnTimer 즉, 가상메소드인 Timer를 이용하니,
> 컴포넌트로 코딩한대로 실행이 되지 않았습니다.
> 그래서, 실험정신(?)으로, 저의 임시 타이머 컴포넌트를 이용하여, 아래에 보시는
> 대로, 저의 컴포넌트에 OnTimer의 동작이 명시되어 있음에도 불구하고,
> 원래, Events 창에 있는 OnTimer를 이용하여 다시 유사한 동작을
> 명시하여 보았습니다.
> 그르니까, 저의 컴포넌트의 OnTiemr는 OnTime시에 'aaaa'를 ShowMessage로 띄
> 우게 하고, Events창의 OnTimer에게는 'bbbb' 메세지를 띄우게 하였습니다.
>
> 그러고 나서 실행하고 나니, aaaa와 bbbb가 교대로 띄워지지 않겠습니까?
>
> 학교 선배님의 추측으로는,
> Timer는 사용자 이벤트로 직접적으로 주어지는 것이 아니라, 시스템적인 것이므로,
> 타이머는 원래 주어진 컴포넌트에서 요구가 있을때만 동작하는 것이 아니겠냐고
> 하시더군요.
> 정말 그런가요?
>
> 컴포넌트로 주어진 시간뒤에 어떤 동작을 할수 있게 하는 방법이 없나요?
> 아시는 고수님들!! 꼭 가르쳐 주세요!!
>
> unit ExT;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> ExtCtrls;
>
> type
> TExT = class(TTimer)
> private
> { Private declarations }
> protected
> { Protected declarations }
> procedure Timer; override;
> public
> { Public declarations }
> constructor Create(AOwner: TComponent); override;
> published
> { Published declarations }
> end;
>
> procedure Register;
>
> implementation
>
> constructor TExT.Create(AOwner: TComponent); // <<<<<<< 필요없는 코드
> begin
> inherited Create(AOwner);
> end;
>
> procedure TExT.Timer;
> begin
> inherited Timer;
>
> ShowMessage('aaaa');
> end;
>
> procedure Register;
> begin
> RegisterComponents('Samples', [TExT]);
> end;
>
> end.