ある数値を最小値と最大値の間に収めたいとします。
gfniNumLimtでは範囲外の数値は最小値と最大値のどちらかに張りつかせました。
このgfniNumLoopでは循環リストっぽく、最小値と最大値の間で循環させた値にします。
メディアプレーヤーのループ再生用に作りました。
2→3
↑ ↓
5←4
2の次は3、3の次は4、4の次は5、5の次は2、2の次は3...
2←3
↓ ↑
5→4
2の前は5、5の前は4、4の前は3、3の前は2、2の前は5...
function gfniNumLoop(iNum: Integer; iMin, iMax: Integer): Integer;
//数値を範囲内でループさせた値を返す。
var
li_Diff, li_Interval, li_Tmp: Integer;
begin
if (iMin = iMax) then begin
Result := iMin;
end else begin
//iMinとiMaxの値を間違えて指定したときへの対処
if (iMin > iMax) then begin
li_Tmp := iMin;
iMin := iMax;
iMax := li_Tmp;
end;
li_Interval := iMax - iMin + 1; //間隔
if (iNum < iMin) then begin
li_Diff := Abs(iNum - iMin);
Result := iMax - (li_Diff mod li_Interval) +1;
end else if (iNum > iMax) then begin
li_Diff := iNum - iMax;
Result := iMin + (li_Diff mod li_Interval) -1;
end else begin
Result := iNum;
end;
end;
end;
gfniNumLoop(テストする値, 下限値, 上限値)
戻り値は、
下限値〜上限値ならそのままの値。
下限値を下回る場合は上限値に戻って下限値に向かって残りの値を引いた結果の値。
上限値を上回る場合は下限値に戻って上限値に向かって残りの値を足した結果の値。
例えば10曲のリストがあって10曲目の次を1曲目としたいループ再生のときなどに使います。
iNum := 10;
iNum := gfniNumLoop(iNum +1, 1, 10);
iNum := gfniNumLoop(-2, 0, 3); //iNum は 2
iNum := gfniNumLoop(-1, 0, 3); //iNum は 3
iNum := gfniNumLoop( 2, 0, 3); //iNum は 2
iNum := gfniNumLoop( 4, 0, 3); //iNum は 0
iNum := gfniNumLoop( 5, 0, 3); //iNum は 1