日付が有効か否かを検証するには?

解決


amide  2004-08-03 10:57:12  No: 10195  IP: 192.*.*.*

ユーザーに日付の入力を求めて、それが有効でない日付のときはエラーを回避するため現在の日付を返すようにしています。

var S:string;
    D:TDate;

S:=inputbox('','日付を ****/**/** の書式で入力してください','');
if S='' then exit;
D:=StrtoDatedef(S,Date);

ユーザーが有効でない日付を入力したとき、再入力を求めたいのですが、
入力された日付が有効か否かを検証するにはどうすればいいのですか?

編集 削除
TtPIPICH  URL  2004-08-03 13:56:22  No: 10196  IP: 192.*.*.*

まず、「/」で区切って(ansipos+LeftStr/RightStr)
それぞれをStrToIntDef(デフォルトは-1)で数値にし、
範囲内かどうかを調べる

編集 削除
TtPIPICH  2004-08-03 14:01:39  No: 10197  IP: 192.*.*.*

間違えました
デフォルトで指定した日付が返ってきたら入力した値は無効です

まず、適当な日付と比較し、
同じでなければ、
StrToIntDef(入力した値,さきほどの日付)
として、
さきほどの値なら再入力を求めて下さい

編集 削除
にしの  2004-08-03 14:12:51  No: 10198  IP: 192.*.*.*

わざわざ'/'で切らなくても、try...exceptでできるかと。

function StrToDateValidate(const S: String; var D: TDate): Boolean;
begin
  try
    D := StrToDate(S);
    Result := True;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S:string;
  D:TDate;
  IsDate: Boolean;
begin
  IsDate := False;
  while not IsDate do
  begin
    S:=inputbox('','日付を ****/**/** の書式で入力してください','');
    if S='' then exit;
    IsDate := StrToDateValidate(S, D);
  end;
  ShowMessage(DateToStr(D));

end;

編集 削除
amide  2004-08-03 17:32:09  No: 10199  IP: 192.*.*.*

よくわかりました。
ありがとうございました。

編集 削除