Hallo!
Im folgenden Quelltext hänge ich an While Windows.GetMessage() fest. Warum.
Delphi-Quellcode:
DoBreakRun := False;
while Windows.GetMessage(Msg, 0, 0, 0) and not DoBreakRun do
begin
Windows.TranslateMessage(msg);
Windows.DispatchMessage(msg);
end;
Die Variable Window(1) ist doch laut Delphi Hilfe definiert. Nach meinem Verständnis müßte ich doch, falls die Variable Windows nicht ordnungsgemäß initialisiert ist, eine
Exception kriegen. Krieg ich aber nicht! Stattdessen bleibt mein Programm an der WHILE-Anweisung einfach stehen, wie ich mit dem integrierten Debugger festgestellt habe. Ich müßte doch hier, falls keine Message ankommt, weiterspringen. Wenn Messages anliegen, was ich mal voraussetze, da ja der Befehlszähler an der While Schleife stehen bleibt, müßte ich bis zum Eintreffen von Alt+F4 ständig TranlateMessage->DispatchMessage->GetMessage
abarbeiten.
Warum funktioniert das nicht. Kann mir jemand Rat geben, wonach ich evtl. im Quellcode suchen muß. Gibt es eine Standard-Anweisungsfolge zur Initialisierung der Variablen Windows?
Der Create-Konstruktor meiner Fensterklasse sieht so hier aus:
Delphi-Quellcode:
constructor TGDIWindow.Create(AScreen: TGDIScreen; AParent: TGDIWindow;
AWindowType: TGfxWindowType);
const
WindowStyleTable:
array[TGfxWindowType]
of LongWord = (
WS_OVERLAPPEDWINDOW,
// wtWindow
WS_OVERLAPPED,
// wtBorderlessWindow
WS_POPUPWINDOW,
// wtPopup
WS_POPUP,
// wtBorderlessPopup
WS_OVERLAPPED,
// wtToolWindow
WS_CHILDWINDOW);
// wtChild
WindowStyleExTable:
array[TGfxWindowType]
of LongWord = (
WS_EX_APPWINDOW,
// wtWindow
WS_EX_APPWINDOW,
// wtBorderlessWindow
0,
// wtPopup
0,
// wtBorderlessPopup
WS_EX_PALETTEWINDOW,
// wtToolWindow
0);
// wtChild
var
ParentHandle: HWND;
begin
inherited Create;
FWindowType := AWindowType;
FScreen := AScreen;
// Initialize a window class, if necessary
if not Assigned(WindowClass.lpfnWndProc)
then
begin
with WindowClass
do
begin
style := CS_HREDRAW
or CS_VREDRAW;
//lpfnWndProc := WndProc(@fpGFXWindowProc);
hInstance := MainInstance;
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := 0;
lpszClassName := '
fpGFX';
end;
Windows.RegisterClass(WindowClass);
end;
if Assigned(AParent)
then
ParentHandle := AParent.Handle
else
ParentHandle := 0;
FWindowStyle := WindowStyleTable[AWindowType];
FWindowStyleEx := WindowStyleExTable[AWindowType];
FHandle := Windows.CreateWindowEx(
FWindowStyleEx,
// extended window style
'
fpGFX',
// registered class name
'
fpGFX Window',
// window name
FWindowStyle,
// window style
CW_USEDEFAULT,
// horizontal position of window
CW_USEDEFAULT,
// vertical position of window
CW_USEDEFAULT,
// window width
CW_USEDEFAULT,
// window height
ParentHandle,
// handle to parent or owner window
0,
// menu handle or child identifier
MainInstance,
// handle to application instance
Self);
// window-creation data
FCanvas := TGDIWindowCanvas.Create(
Handle);
end;
(1) Und in diesem Codeteil kommt die Variable Window vor, die ich oben erwähnt habe:
Delphi-Quellcode:
constructor TMainWindow.Create(ADisplay: TDefDisplay);
var RectSize: TSize;
begin
inherited Create;
Display := ADisplay;
Font := Display.CreateFont('-*-' + Display.GetDefaultFontName(fcSerif) +
'-*-r-normal--36-*-*-*-*-*-iso8859-1');
Window := ADisplay.DefaultScreen.CreateWindow(nil, wtWindow);
//Hier isse.
Window.Title := 'fpGFX Hello World example';
Window.OnPaint := Paint;
Window.Canvas.SetFont(Font);
TextSize.cx := Window.Canvas.TextWidth(HelloWorldString);
TextSize.cy := Window.Canvas.FontCellHeight;
Window.SetClientSize( gfxBase.Size( (TextSize.cx * 3) div 2, TextSize.cy * 2) );
RectSize := TextSize;
TGDIWindow(Window).SetMinMaxClientSize( gfxBase.TSize(TextSize), gfxbase.TSize(RectSize) );
Window.Show;
end;
Kann es sein, das in TranslateMessage/DipatchMessage die besagte Variable Window, statt des Unitbezeichners Windows zur Auffindung der
API Funktionen, dort stehen muß, wie wenn diese Unterprogramme zum konkreten Fenster gehören, das die Message(s) abarbeitet? Oder ist oben der Unitbezeichner richtig?
Ratlose Grüße von
schöni
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.