お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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