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.
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.
CodePudding user response:
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;