این رو الان نوشتم، تست کن بهم بگو.
function Date_MoveMonth(Dt: string; Step: integer; DateBase: TDateBase): string;
var
years, months, days: integer;
SYear, SMonth, SDay: integer;
MaxValid: integer;
begin
SYear := StrToInt(Copy(Dt, 1, 4));
SMonth := StrToInt(Copy(Dt, 6, 2));
SDay := StrToInt(Copy(Dt, 9, 2));
years := Step div 12;
months := Step mod 12;
SYear := SYear + years;
SMonth := SMonth + months;
if SMonth > 12 then
begin
dec(SMonth, 12);
inc(SYear);
end;
if SMonth < 1 then
begin
inc(SMonth, 12);
dec(SYear);
end;
MaxValid := Date_DaysPerMonth(SYear, SMonth, DateBase);
SDay := IfThen(SDay > MaxValid, MaxValid, SDay);
Result := RightStr('000' + IntToStr(SYear), 4) + '/' + RightStr('0' + IntToStr(SMonth), 2) + '/' + RightStr('0' + IntToStr(SDay), 2);
end;