Range check error on canvas painting

I got a range validation error in this piece of code:

{ This procedure is copied from RxLibrary VCLUtils }
procedure CopyParentImage(Control: TControl; Dest: TCanvas);
var
  I, Count, X, Y, SaveIndex: Integer;
  DC: HDC;
  R, SelfR, CtlR: TRect;
begin
  if (Control = nil) OR (Control.Parent = nil)
  then Exit;

  Count := Control.Parent.ControlCount;
  DC    := Dest.Handle;
  with Control.Parent
   DO ControlState := ControlState + [csPaintCopy];

  TRY
    with Control do
     begin
      SelfR := Bounds(Left, Top, Width, Height);
      X := -Left; Y := -Top;
     end;

    { Copy parent control image }
    SaveIndex := SaveDC(DC);
    TRY
      SetViewportOrgEx(DC, X, Y, nil);
      IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
      with TParentControl(Control.Parent) DO
       begin
        {$R-}
        Perform(WM_ERASEBKGND, DC, 0); <--------------- HERE
        {$R+}        
        PaintWindow(DC);
       end;
    FINALLY
      RestoreDC(DC, SaveIndex);
    END;

    { Copy images of graphic controls }
    for I := 0 to Count - 1 do begin
      if Control.Parent.Controls[I] = Control then Break
      else if (Control.Parent.Controls[I] <> nil) and
        (Control.Parent.Controls[I] is TGraphicControl) then
      begin
        with TGraphicControl(Control.Parent.Controls[I]) do begin
          CtlR := Bounds(Left, Top, Width, Height);
          if Bool(IntersectRect(R, SelfR, CtlR)) and Visible then
          begin
            ControlState := ControlState + [csPaintCopy];
            SaveIndex := SaveDC(DC);
            try
              SetViewportOrgEx(DC, Left + X, Top + Y, nil);
              IntersectClipRect(DC, 0, 0, Width, Height);
              {$R-}              
              Perform(WM_PAINT, DC, 0);  <--------------- HERE
              {$R+}
            finally
              RestoreDC(DC, SaveIndex);
              ControlState := ControlState - [csPaintCopy];
            end;
          end;
        end;
      end;
    end;
  FINALLY
    with Control.Parent DO
     ControlState := ControlState - [csPaintCopy];
  end;
end;

Someone issued a code without activating a range check :(

I put {$ R -} {$ R +} around the lines that generate the error, and the code is working now, but I'm not sure what the consequences are. Later, I don’t need some strange mistake.


Delphi, Win 7 32bit

+3
source share
2 answers

Perform , WParam, . Delphi 3, HDC ( ). NT , MaxInt, WParam. .

, :

Perform(wm_EraseBkgnd, WParam(DC), 0);

Perform . , HDC, . , .

+9

, / . WM_ERASEBKGND , VCL, , Controls.pas, {$ R-}.

+2

Source: https://habr.com/ru/post/1772550/


All Articles