これは Delphi Advent Calendar 2016 の補欠記事です。
さて、最近は現実逃避で Arduino を触る事も多いのですが、Arduino には便利な関数があります。
例えば Constrain() 関数。これは VCL フォームの Constraints プロパティと似たような役目をする関数です。
https://www.arduino.cc/en/Reference/Constrain
if a < 0 then a := 0 else if a > 100 then a := 100;
このような範囲チェックを行うコードをよく書くと思いますが、Constrain() を使うと
a := Constrain(a, 0, 100);
一行で書けます、便利ですね!でも、実はこの関数、既に Delphi にあるんです。名前は EnsureRange()。System.Math 名前空間にあります。
a := EnsureRange(a, 0, 100);
[System.Math.EnsureRange()]
http://docwiki.embarcadero.com/Libraries/ja/System.Math.EnsureRange
もうひとつ便利なのは Map() 関数。これはとある範囲にある数値を別の範囲にある数値へ変換するものです。これは (多分) Delphi に類似関数はないと思います。
https://www.arduino.cc/en/Reference/Map
var val: UInt32; begin val := 512; val := Map(Val, 0, 1023, 0, 255); ShowMessage(Val.ToString); end;
Val は 0..1023 の値で、Map() は 0..255 を返します。上記コードは 127 を表示します。
const Min_Val = 0; Max_Val = 100; var val: Integer; begin val := 25; val := Constrain(val, Min_Val, Max_Val); // 範囲チェック 0..100 val := Map(val, Min_Val, Max_Val, Max_Val, Min_Val); // 0..100 を 100..0 に変換 ShowMessage(Val.ToString); end;
上記コードは 75 を表示します。
と、Arduino にある関数をいくつか移植してみたのが uArduinoComp.pas になります。プラットフォーム依存のユニットは使っていないため、モバイル環境でも使えます。
- Constrain()
- Map()
- RandomSeed()
- Random()
- LowByte()
- HighByte()
- BitRead()
- BitWrite()
- BitSet()
- BitClear()
- Bit()
以下から DL できます。
[uArduinoComp]
http://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1833
|