昨日のエントリ「TryStrToDateTime を完璧にする」ですが、全然完璧じゃありませんでした!/(^o^)\
2重ループを抜けていない、という問題がありました。
ということで、修正した物が↓こちらです。
function TryStrToDateTimeEx( const iStr: String; out oDateTime: TDateTime): Boolean; label Last; const DateSeps: array [0.. 1] of Char = ('/', '-'); TimeSeps: array [0.. 1] of Char = (':', '.'); var FS: TFormatSettings; i, j: Integer; begin FS := TFormatSettings.Create; for i := Low(DateSeps) to High(DateSeps) do begin FS.DateSeparator := DateSeps[i]; for j := Low(TimeSeps) to High(TimeSeps) do begin FS.TimeSeparator := TimeSeps[j]; Result := TryStrToDateTime(iStr, oDateTime, FS); if (Result) then goto Last; end; end; Last: end;
Delphi 言語には多重ループを一発で抜けるスマートな方法は用意されていません。
そのため、ここでは goto を使って抜けてみました。
本物のプログラマは goto を恐れずに使うからです!(まあ本物のプログラマは Pascal を使わずに FORTRAN を使うわけですがね……)
もしもここで、
for i = 0 to 99 do begin for j = 0 to 99 do begin Result := true; if (Result) Break; end; if (Result) Break; end;
なんて書いた方が冗長だと判って貰えると思います。
Exit が引数を取れるようになったように、Break も一発で抜けれる機構を採り入れてくれたら、良いかも知れないですね。
0 件のコメント:
コメントを投稿