if Y>FRow*Block_Height then
    Y := FRow*Block_Height-1;

应该为
if Y>=FRow*Block_Height then
    Y := FRow*Block_Height-1;

少了一个等号。。害的溢出了无数次

还有bug
玛超发现,还是要等多些问题总结才找得出来