16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"コンポーネントの中でコールバック関数を使う方法"
この発言に対し以下のコメントが寄せられています
#00354 FuKu さん コンポをインストールせずに使用する方法
みなさんこんにちは。FuKuです。
コンポを作っていてコールバック関数を
使用しなければならない時が良くあります。
先日、あるマルチメディア系のコンポを作っていて、
どうしてもコンポの中でコールバック関数を
使わなければならなくなりました。(^_^;)
nifty:FDELPHI/MES/11/3195 で
らせん企画の佐々木さんにやり方を教えていただきました。
どうもありがとうございました。m(__)m
で、他の方がこんな事で迷わないように(2日ぐらいつぶしてしまった・・・(T_T))
サンプルとしてアップする事にしました。
以下のリストがコールバックを
わかりやすく理解するために作ってみた単純なサンプルコンポです。
コンポのサンプルとしても
一通りの機能がシンプルにまとまっていると思いますので、
コンポの構造を理解するのにも良いのではないかなと思います。(^^ゞ
Kitchen Timerコンポの使い方です。
その名のとおり時間をセットしてスタートすれば
セットした時間になるとOnTimerイベントが起こります。(^_^;)
しかしDelphi付属のTTimerとは、
スタートしてからイベントは一回しか起らないと言う事と、
イベントの起こる時間がかなり正確であると言う点が異なります。
この発言のコメントにこのコンポを試すためのサンプルをつけます。
-------- 8< -------- 8< -------- 8< -------- 8< -------- 8< --------
unit KTimer;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, MmSystem;
type
TNotifyTimerEvent = procedure(Sender: TObject) of Object;
TKitchenTimer = class(TComponent)
private
FTimerID: Cardinal;
FOnTimer: TNotifyTimerEvent;
FInterval: Cardinal;
protected
procedure Timer;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Start;
published
property Interval: Cardinal read FInterval write FInterval;
property OnTimer: TNotifyTimerEvent read FOnTimer write FOnTimer;
end;
procedure Register;
implementation
{=====重要ポイント=========================================
このUnitの中でTKitchenTimerのインスタンスをCallBackTimeProc
の中で参照するためのThis}
var
This: TKitchenTimer;
procedure CallBackTimeProc(TimerID: UINT; Msg: UINT; User: DWORD;
Param1: DWORD; Param2: DWORD); stdcall;
begin
// スコープはTKitchenTimerの外ですがThisを通して参照しています
This.Timer;
end;
constructor TKitchenTimer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
{=====重要ポイント=========================================
Thisに自分自身(インスタンス)を参照させる}
This := Self;
FInterval := 1000;
end;
destructor TKitchenTimer.Destroy;
begin
if FTimerID <> 0 then
begin
timeKillEvent(FTimerID);
end;
inherited Destroy;
end;
procedure TKitchenTimer.Start;
begin
if FTimerID <> 0 then
begin
timeKillEvent(FTimerID);
end;
{=====重要ポイント=========================================
CallBackTimeProcをセットする}
FTimerID := timeSetEvent(FInterval, FInterval, @CallBackTimeProc,
DWORD(Self), TIME_ONESHOT);
if FTimerID = 0 then
begin
raise Exception.Create('タイマーをセットできません');
end;
end;
procedure TKitchenTimer.Timer;
begin
if Assigned(FOnTimer) then
begin
FOnTimer(Self);
end;
end;
procedure Register;
begin
RegisterComponents('Samples', [TKitchenTimer]);
end;
end.
-------- 8< -------- 8< -------- 8< -------- 8< -------- 8< --------
-------
98/01/17 (土)17:03:32
FuKu (SGV00305)
Original document by FuKu 氏 ID:(SGV00305)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|