畳を敷く(4)
オブジェクト機能をつかって生きた畳ツールを作ってみましょう。
第4章 カスタム関数を作ってみる

ここまでで、5つのプログラムができました。
このまま5つのオブジェクトプラグインを作ってもいいのですが、1つにまとめましょう。
本来のカスタム関数(ユーザ定義関数)の使い方は、同じような処理が頻繁に出てくる場合に、関数化してソースコードをまとめることでプログラム変更を容易にする役割がありますが、それ以外にもメイン部分にダラダラと書くのではなく、機能ごとに細分化しプログラムが見やすくする役目もあります。こちらの場合には関数化というより、サブルーチン化と言った方がいいかもしれません。
書き方はメインになる(呼び出す側)プログラムの変数定義(VAR)のところにプログラムをいれます。
PROCEDURE tatami;
VAR
ii : INTEGER;
PROCEDURE SubRoutine;{関数の宣言}
BEGIN
END;
BEGIN{メイン}
SubRoutine;
END;
Run( tatami );
各関数は畳数となりますので、この部分もパラメータ化(pTType)しておきましょう。
変数の内容によって、描く畳数(実行する関数)がかわるようにIF文を使って分岐させます。
pTTypeに文字列として「四畳半」「六畳」「八畳」「十畳」「十二畳」が入ってくると各畳数が描かれます。
PROCEDURE tatami;
CONST
pTSize = 880.0;
pTAtumi = 60.0;
pTType = '四畳半';
{ pTType = '六畳';}
{ pTType = '八畳';}
{ pTType = '十畳';}
{ pTType = '十二畳';}
VAR
ii : INTEGER;
PROCEDURE tatami45;
BEGIN
BeginXtrd( 0, pTAtumi );
Rect( 0.0, 0.0, pTSize*2, pTSize );
Rect( pTSize*2, 0.0, pTSize*3, pTSize*2 );
Rect( 0.0, pTSize, pTSize, pTSize*3 );
Rect( pTSize, pTSize*2, pTSize*3, pTSize*3 );
Rect( pTSize, pTSize, pTSize*2, pTSize*2 );
EndXtrd;
END;
PROCEDURE tatami6;
BEGIN
BeginXtrd( 0, pTAtumi );
Rect( 0.0, 0.0, pTSize, pTSize*2 );
Rect( pTSize, 0.0, pTSize*3, pTSize );
Rect( pTSize, pTSize, pTSize*3, pTSize*2 );
Rect( pTSize*3, 0.0, pTSize*4, pTSize*2 );
Rect( 0.0, pTSize*2, pTSize*2, pTSize*3 );
Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 );
EndXtrd;
END;
PROCEDURE tatami8;
BEGIN
BeginXtrd( 0, pTAtumi );
Rect( 0.0, 0.0, pTSize*2, pTSize );
Rect( pTSize*2, 0.0, pTSize*4, pTSize );
Rect( 0.0, pTSize, pTSize, pTSize*3 );
Rect( pTSize, pTSize, pTSize*3, pTSize*2 );
Rect( pTSize, pTSize*2, pTSize*3, pTSize*3 );
Rect( pTSize*3, pTSize, pTSize*4, pTSize*3 );
Rect( 0.0, pTSize*3, pTSize*2, pTSize*4 );
Rect( pTSize*2, pTSize*3, pTSize*4, pTSize*4 );
EndXtrd;
END;
PROCEDURE tatami10;
BEGIN
BeginXtrd( 0, pTAtumi );
Rect( 0.0, 0.0, pTSize, pTSize*2 );
Rect( 0.0, pTSize*2, pTSize, pTSize*4 );
Rect( pTSize, 0.0, pTSize*3, pTSize );
Rect( pTSize*3, 0.0, pTSize*5, pTSize );
Rect( pTSize, pTSize, pTSize*2, pTSize*3 );
Rect( pTSize*2, pTSize, pTSize*4, pTSize*2 );
Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 );
Rect( pTSize*4, pTSize, pTSize*5, pTSize*3 );
Rect( pTSize, pTSize*3, pTSize*3, pTSize*4 );
Rect( pTSize*3, pTSize*3, pTSize*5, pTSize*4 );
EndXtrd;
END;
PROCEDURE tatami12;
BEGIN
BeginXtrd( 0, pTAtumi );
Rect( 0.0, 0.0, pTSize, pTSize*2 );
Rect( 0.0, pTSize*2, pTSize, pTSize*4 );
Rect( pTSize, 0.0, pTSize*3, pTSize );
Rect( pTSize*3, 0.0, pTSize*5, pTSize );
Rect( pTSize, pTSize, pTSize*2, pTSize*3 );
Rect( pTSize*2, pTSize, pTSize*4, pTSize*2 );
Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 );
Rect( pTSize*4, pTSize, pTSize*5, pTSize*3 );
Rect( pTSize, pTSize*3, pTSize*3, pTSize*4 );
Rect( pTSize*3, pTSize*3, pTSize*5, pTSize*4 );
Rect( pTSize*5, 0.0, pTSize*6, pTSize*2 );
Rect( pTSize*5, pTSize*2, pTSize*6, pTSize*4 );
EndXtrd;
END;
BEGIN
IF pTType = '四畳半' THEN
BEGIN
tatami45;
END
ELSE IF pTType = '六畳' THEN
BEGIN
tatami6;
END
ELSE IF pTType = '八畳' THEN
BEGIN
tatami8;
END
ELSE IF pTType = '十畳' THEN
BEGIN
tatami10;
END
ELSE IF pTType = '十二畳' THEN
BEGIN
tatami12;
END
ELSE
BEGIN
BeginXtrd( 0, pTAtumi );
Rect( 0.0, 0.0, pTSize, pTSize );
EndXtrd;
END;
END;
Run( tatami );