いつもお世話になります。
StringGridのCols[0]に日付を表示させ、Cols[1]に期間を表示させたくて
DaysBetweenという関数を使用してみたのですが、下記のコードで実行すると
'''は日付ではありません'というエラーになってしまいます。
procedure TForm1.Button1Click(Sender: TObject);
var
x,y:TDateTime;
begin
with StringGrid1 do
begin
Cells[0,RowCount]:=DateToStr(DateTimePicker1.Date);
StringGrid1.RowCount:=StringGrid1.RowCount+1;
x:=StrToDate(Cells[0,RowCount]);
y:=StrToDate(Cells[0,RowCount-1]);
Cells[1,RowCount]:=DateToStr(DaysBetween(x,y));
end;
end;
どなたかご教示下さい。
Cells[0,RowCount]に日付が入っていないからです。
入れておけばよいのですが、たぶん期待通りの動作はしないと思います。
Cells[0, RowCount]は、絶対に表示されないということは理解されていますか?
もちろん、RowCount+1すれば、前回のCells[0,RowCount]は表示されますが、RowCountが変化した直後のCells[0,RowCount]は「絶対に」表示されません。
エラーになっていたのは、行数を増やしているのにx,yに代入するところで
行数を増やす前の行番で代入していたため。
行数を増やすタイミングと1番最初に入力されるとき(前回の日付時間が
ない状態)のときの処理も考えたほうがいいかも。
最後の
>Cells[1,RowCount]:=DateToStr(DaysBetween(x,y));
ですが、
DaysBetween関数は日数を返すのでDateToStrよりIntToStrの方がいいのでは?
procedure TForm1.Button1Click(Sender: TObject);
var
x,y:TDateTime;
begin
with StringGrid1 do
begin
RowCount:=RowCount+1;
Cells[0,RowCount-2]:=DateToStr(DateTimePicker1.Date);
if RowCount < 3 then Exit;
x:=StrToDate(Cells[0,RowCount-2]);
y:=StrToDate(Cells[0,RowCount-3]);
Cells[1,RowCount-2]:=IntToStr(DaysBetween(x,y));
end;
end;
にしのさん、kazuさん、ご指導ありがとうございました。
お蔭様で、どうにか自分の思ったとおりのことが出来ました。
にしのさん、kazuさん、ご指導ありがとうございました。
お蔭様で、どうにか自分の思ったとおりのことが出来ました。
ツイート | ![]() |