Project Project1.exe raised exception class ERangeError with message 'Range check error'

1.1k Views Asked by At

I'm reading an old Delphi book on Windows API. This is an example from it.

unit Unit1;

interface

uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
    System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
    TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

{ Register the Window Class }
function RegisterClass: Boolean;
var
    WindowClass: TWndClass;
begin
    { setup our new window class }
    WindowClass.Style := CS_HREDRAW or CS_VREDRAW; { set the class styles }
    WindowClass.lpfnWndProc := @DefWindowProc;     { point to the default window procedure }
    WindowClass.cbClsExtra := 0;                   { no extra class memory }
    WindowClass.cbWndExtra := 0;                   { no extra window memory }
    WindowClass.hInstance := hInstance;            { the application instance }
    WindowClass.hIcon := 0;                        { no icon specified }
    WindowClass.hCursor := 0;                      { no cursor specified }
    WindowClass.hbrBackground := COLOR_WINDOW;     { use a predefined color }
    WindowClass.lpszMenuName := nil;               { no menu }
    WindowClass.lpszClassName := 'TestClass';      { the registered class name }

    { now that we have our class set up, register it with the system }
    Result := Winapi.Windows.RegisterClass(WindowClass) <> 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    hWindow: HWND;
begin
    { Step 1: Register our new window class }
    if not RegisterClass then
    begin
        ShowMessage('RegisterClass failed');
        Exit;
    end;

    { Step 2: Create a window based on our new class }
    hWindow := CreateWindowEx(0, { no extended styles }
        'TestClass',             { the registered class name }
        'New Window',            { the title bar text }
        WS_OVERLAPPEDWINDOW,     { a normal window style }
        CW_USEDEFAULT,           { default horizontal position }
        CW_USEDEFAULT,           { default vertical position }
        CW_USEDEFAULT,           { default width }
        CW_USEDEFAULT,           { default height }
        0,                       { no owner window }
        0,                       { no menu }
        hInstance,               { the application instance }
        nil                      { no additional information }
        );

    { Step 3: If our window was created successfully, display it }
    if hWindow <> 0 then
    begin
        ShowWindow(hWindow, SW_SHOWNORMAL);
        UpdateWindow(hWindow);
    end
    else
    begin
        ShowMessage('CreateWindow failed');
        Exit;
    end;
end;

end.

The UI is very simple. I just drag a button and drop it on the form. However, when I run the program with Embarcadero® Delphi 11.0 Version 28.0.42600.6491 and click the button on the form, I got Project Project1.exe raised exception class ERangeError with message 'Range check error'.. Following that, I got this error.

enter image description here

Could anyone help to take a look where is the problem?

Btw, I just tried Delphi 7 and the program works. When I click the button, an empty window pops. enter image description here

1

There are 1 best solutions below

7
On BEST ANSWER

Value of CW_USEDEFAULT constant does not align very well with declaration of CreateWindowEx function. Add following code to the top of Button1Click, near the var section:

const
  CW_USEDEFAULT = -MaxInt - 1;