Matemática para zoom de imagem lenta

Eu tenho uma imagem .bmp com um layout de quadrinhos. Atualmente meu código funciona assim. Se clico com o botão direito do mouse e pressiono o botão do mouse, posso desenhar uma caixa do tipo letreiro ao redor de um dos quadros da página de quadrinhos. Quando eu solto o botão, ele aumenta o zoom nesse quadro. Mas é instantâneo. E eu gostaria que tivesse um efeito de animação.

Assim, em vez de ir e definir os valores de PicRect para o "valor final"

PicRect.Left
PicRect.right
PicRect.top
PicRect.bottom

como visto no código abaixo, eu preciso de uma maneira de chegar lá lentamente, algum tipo de loop while que define esses valores um pouco de cada vez até que chegue ao "valor final" Mas eu não estou 100% certo sobre como essa matemática está funcionando. Nem qualquer um dos meus loop while tenta fazer nada além de ampliar demais. Esse é o procedimento.

procedure TZImage.MouseUp(Button: TMouseButton; Shift: TShiftState;
                      X, Y: Integer);
    var coef:Double;
    t:integer;
begin
   if FMouse=mNone then Exit;
   if x>ShowRect.Right then x:=ShowRect.Right;
   if y>ShowRect.Bottom then y:=ShowRect.Bottom;
   if FMouse=mZoom then begin  //calculate new PicRect
     t:=startx;
     startx:=Min(startx,x);
     x:=Max(t,x);
     t:=starty;
     starty:=Min(starty,y);
     y:=Max(t,y);
     FMouse:=mNone;
     MouseCapture:=False;
//enable the following if you want to zoom-out by dragging in the opposite direction}
    {     if Startx>x then begin
            DblClick;
            Exit;
         end;}
         if Abs(x-startx)<5 then Exit;
         if (x - startx < y - starty) then
         begin
           while (x - startx < y - starty) do
           begin
              x := x + 100;
              startx := startx - 100;
           end;
         end
         else if (x - startx > y - starty) then
         begin
            while (x - startx > y - starty) do
            begin
                y := y + 100;
                starty := starty - 100;
            end;
         end;


    //This is were it sets the zoom info. This is were
    //I have to change to slowly get the PICRECT.Left/right/top/bottom
         if (PicRect.Right=PicRect.Left)
         then
            coef := 100000
         else
            coef:=ShowRect.Right/(PicRect.Right-PicRect.Left);
         PicRect.Left:=Round(PicRect.Left+startx/coef);
         PicRect.Right:=PicRect.Left+Round((x-startx)/coef);
         if (PicRect.Bottom=PicRect.Top)
         then
            coef := 100000
         else
            coef:=ShowRect.Bottom/(PicRect.Bottom-PicRect.Top);
         PicRect.Top:=Round(PicRect.Top+starty/coef);
         PicRect.Bottom:=PicRect.Top+Round((y-starty)/coef);
       end;
       if FMouse=mDrag then begin
         FMouse:=mNone;
         Canvas.Pen.Mode:=pmCopy;
         Screen.Cursor:=crDefault;
       end;
       Invalidate;
    end;

Eu acredito que isso pode ser feito no código acima. mas também queria adicionar isso caso ajude.

type
    TZImage = class(TGraphicControl)
  private
    FBitmap        : TBitmap;
    PicRect        : TRect;
    ShowRect       : TRect;
    FShowBorder    : boolean;
    FBorderWidth   : integer;
    FForceRepaint  : boolean;
    FMouse         : (mNone, mDrag, mZoom);
    FProportional  : boolean;
    FDblClkEnable  : boolean;
    startx, starty,
    oldx, oldy     : integer;

Obrigado por qualquer ajuda em conseguir que isso funcione.

questionAnswers(4)

yourAnswerToTheQuestion