16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"メソッド名を指定して実行"
アプリケーション内で使用する種々のオブジェクトに対して共通のメソッド
を持たせるには,それらオブジェクトに共通の基底クラスにpublicなメソッド
を宣言できれば簡単ですが,共通の基底クラスを作れない場合でも
「同じ名前,型のメソッドをpublishedに宣言」
することで,そのメソッドを持つ異なるクラスのインスタンス
に対して共通の手続きでアクセスすることが可能です.
------ 呼び出す人のコード --------
type
TGetFunction =
function(const Index: integer): string of object;
// そのインスタンスに'GetString'という名前の関数があれば実行する
function GetString( Inst: TPersistent; Index: integer ): string;
var
Method: TMethod;
begin
Method.Data := Inst;
Method.Code := Inst.MethodAddress( 'GetString' );
if Method.Code <> nil then
Result := TGetFunction( Method )( Index )
else
Result := '';
end;
------- 参照されるインスタンスのクラス宣言 -----------
type
TMyClass2 = class( TPanel );
published
function GetString( Index: integer ): string; // TGetFunction型
end;
TMyClass3 = class( TShape );
published
function GetString( Index: integer ): string;
end;
implementation
function TMyClass2.GetString( Index: integer ): string;
begin
Result := '私はTPanel派生のTMyClass2です';
end;
function TMyClass3.GetString( Index: integer ): string;
begin
Result := '私はTShape派生のTMyClass3です';
end;
TN(CQJ01721)
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 00/10/12 -
Original document by TN 氏 ID:(CQJ01721)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|