Thema: Delphi GetMessage Problem?

Einzelnen Beitrag anzeigen

schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#1

GetMessage Problem?

  Alt 22. Okt 2005, 21:30
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.
  Mit Zitat antworten Zitat