![]() |
GetMessage Problem?
Hallo!
Im folgenden Quelltext hänge ich an While Windows.GetMessage() fest. Warum.
Delphi-Quellcode:
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->GetMessageDoBreakRun := False; while Windows.GetMessage(Msg, 0, 0, 0) and not DoBreakRun do begin Windows.TranslateMessage(msg); Windows.DispatchMessage(msg); end; 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:
(1) Und in diesem Codeteil kommt die Variable Window vor, die ich oben erwähnt habe:
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;
Delphi-Quellcode:
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?
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; Ratlose Grüße von schöni |
Re: GetMessage Problem?
hast du dir den quelltext einfach irgendwo her kopiert? Mir scheint es fast so denn du schreibst etwas von der variablen "windows". Allerdings handelt es sich dabei nicht um eine variable sonder einfach um den namen einer unit, du kannst bei deinem beispiel das "windows." sogar weglassen..
|
Re: GetMessage Problem?
Zitat:
Delphi-Quellcode:
Window := ADisplay.DefaultScreen.CreateWindow(nil, wtWindow);
|
Re: GetMessage Problem?
sorry, da hatte ich wohl etwas falsch gelesen (ein s zu viel). Dachte es bezog sich auf die Stelle "Windows.GetMessage"
|
Re: GetMessage Problem?
Zitat:
Zitat:
Bei den Stilen fehlt WS_VISIBLE und das folgende ist total unsinnig. Wozu würde man Nullen dort stehen lassen? Zitat:
Zitat:
Zitat:
Zitat:
Ansonsten ist dir schon bewußt, daß man nur eine Nachrichtenschleife pro Thread haben kann?! Du gibst uns zuwenig um wirklich helfen zu können, wobei Low-Level-VCL-Programmierung sowieso nicht mein Ding ist. Mindestens die Typendefinition deiner Klasse müßte noch her. |
Re: GetMessage Problem?
Hallo!
Danke erst mal für Eure Tips. Werde mir das erst mal in Ruhe angucken. Trotzdem paar Worte an: Sir Thornberry! Danke für die große Hilfe!!! JA ICH HABE MIR DEN QUELLTXT KOPIERT!!! HIER IST DER HERKUNFTSORT: ![]() Auf dieser Seite gibt es gleich oben folgende Email-Adresse: sg@freepascal.org Außerdem steht dort, das das Projekt unter ///// L G P L ///// steht. GLEICH OBEN!!! Ich habe also den die Quelltexte von diesem Autor der Software erhalten schöni P.S.: Was ist daran illegal??????? In Deutschland gilt immer noch der Unschuldsgrundsatz, bis eine eindeutige Schuld nachgewiesen ist. Bitte bestrafe, wenn schon, denn schon, die echten Raubkopierer!!!!! Je restriktiver die Moral, desto verlogener die Doppelmoral. War schon immer so in der Geschichte. Ich hoffe. Sir Thornberry, Du hast wirklich ALLE Programme auf Deinem PC auch wirklich bezahlt!!! Freeware erkenne ich unter diesen Umständen hier NICHT an. Die kleinen hängt man, die großen lässt man laufen. Die wirklichen Raubkopierer erscheinen in keinem Internetforum, kassieren ordentlich die Kohle und sind dann mit ihren dicken Autos und ihren Maßanzügen IN JEDER HINSICHT SOZIAL ANERKANNT. Im Ernstfall kann KEINEM IRGENDWAS NACGEWIESEN WERDEN. schöni |
Re: GetMessage Problem?
Hey Schöni,
Sir Thornberry hat doch schon geschrieben, dass er Deinen Beitrag falsch gedeutet hat und sich dafür entschuldigt. :roll: Zudem hat Dich niemand der Urheberrechtsverletzung beschuldigt - davon sprichst nur Du selber und niemand sonst. Also komme bitte wieder zur Ruhe - es ist ja nichts passiert. :roll: Im Übrigen hat sich Oliver recht ausführlich und sachlich mit Deinem Problem befasst - eine ebenso sachliche Antwort wäre absolut angemessen. |
Re: GetMessage Problem?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Olli!
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Hier ist sie:
Delphi-Quellcode:
Im Anhang ist der Komplette Quelltext dazu. Da wird sonst zu groß hier!
type
TGDIWindow = class(TGfxWindow) private FHandle: HWND; FMinSize, FMaxSize: TSize; FCaption: String; // Messages: procedure WMCreate(var Msg: TMessage); message WM_CREATE; procedure WMDestroy(var Msg: TMessage); message WM_DESTROY; procedure WMGetMinMaxInfo(var Msg: TMessage); message WM_GETMINMAXINFO; procedure WMActivate(var Msg: TMessage); message WM_ACTIVATE; procedure WMPaint(var Msg: TMessage); message WM_PAINT; procedure WMShowWindow(var Msg: TMessage); message WM_SHOWWINDOW; procedure WMMove(var Msg: TMessage); message WM_MOVE; procedure WMSize(var Msg: TMessage); message WM_SIZE; // Input messages: procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN; procedure WMLButtonUp(var Msg: TMessage); message WM_LBUTTONUP; procedure WMRButtonDown(var Msg: TMessage); message WM_RBUTTONDOWN; procedure WMRButtonUp(var Msg: TMessage); message WM_RBUTTONUP; procedure WMMButtonDown(var Msg: TMessage); message WM_MBUTTONDOWN; procedure WMMButtonUp(var Msg: TMessage); message WM_MBUTTONUP; procedure WMMouseMove(var Msg: TMessage); message WM_MOUSEMOVE; procedure WMMouseWheel(var Msg: TMessage); message WM_MOUSEWHEEL; procedure WMKeyDown(var Msg: TMessage); message WM_KEYDOWN; procedure WMKeyUp(var Msg: TMessage); message WM_KEYUP; procedure WMChar(var Msg: TMessage); message WM_CHAR; procedure WMSysKeyDown(var Msg: TMessage); message WM_SYSKEYDOWN; procedure WMSysKeyUp(var Msg: TMessage); message WM_SYSKEYUP; procedure WMSysChar(var Msg: TMessage); message WM_SYSCHAR; protected WindowClass: TWndClass; {!!!: static;} FWindowStyle, FWindowStyleEx: LongWord; // values used for creation FMouseInWindow, FHasMouseCapture, FHasFocus: Boolean; function GetCaption: String; procedure SetCaption(const ATitle: String); procedure DoSetCursor; override; procedure UpdateWindowButtons; function DoMouseEnterLeaveCheck(const Msg: TMessage): Boolean; public constructor Create(AScreen: TGDIScreen; AParent: TGDIWindow; AWindowType: TGfxWindowType); destructor Destroy; override; procedure DefaultHandler(var Message); override; procedure SetPosition(const APosition: TPoint); override; procedure SetSize(const ASize: TSize); override; procedure SetMinMaxSize(const AMinSize, AMaxSize: TSize); override; procedure SetClientSize(const ASize: TSize); override; procedure SetMinMaxClientSize(const AMinSize, AMaxSize: TSize); override; procedure Show; override; procedure Invalidate(const ARect: TRect); override; procedure PaintInvalidRegion; override; procedure CaptureMouse; override; procedure ReleaseMouse; override; property Caption: String read GetCaption write SetCaption; property Handle: HWND read FHandle; end; Zitat:
Deine Mail hab ich auch erhalten! Hoffentlich kriegen die Webhoster das Problem der Verfügbarkeit dieser Seite bal wieder in den Griff schöni [edit=sakura] Zitat-Tags korrigiert. Mfg, sakura[/edit] |
Re: GetMessage Problem?
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Ich versuche es irgendwie dazwischenzuschieben und mir den Code mal anzuschauen. Wenn du bis Ende kommender Woche keine Antwort erhalten hast, dann PM an mich! Gruß, |
Re: GetMessage Problem?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Ich bin mit dem genannten Problem immer noch nicht viel weiter. Außer: Wenn ich die Widgettest.exe außerhalb der IDE starte, wird ein Fenster angezeigt. Ich kann es verschieben und dessen Größe ändern. Super! Aber der Clientbereich wird nicht korrekt gezeichnet. Ich habe überlegt, ob ich nun alle Units der fpGUI hier hochlade, oder nur das, was zum Start der Widgettest.exe gebraucht wird. Ich habe mich für letzteres entschieden, obwohl fpGUI unter LGPL steht. Sollten also noch mehr Units zur Einsichtnahme gebraucht werden, lade ich die fpGUI insgesamt hier hoch, genauso als Anhang zum Beitrag. Die Widgettest.exe startet also erst mal und zeigt ein Fenster an, das etwas hoöer ist, als die Titelleiste. Es läßt sich vergrößern und verschieben. Beim Vergrößern scheint der Hintergrund durch. Wenn ich danach verschiebe, wird der Hintergrund gezeichnet (Bildschirmfoto des Hintergrundes vor dem Verschieben). Wenn ich danach wieder vergrößere, scheint in dem hinzugekommenen Bereich der aktuelle Hintergrund durch, der beim nächsten Verschieben wie ein Bildschirmfoto mitgenommen wird. Wie erreiche ich, das der Clientbereich korrekt gezeichnet wird. Die Zeichenfunktionen stecken alle in der Unit gfx_gdi.pas, die in einem früheren Beitrag dieses Threads als Anhang beigefügt wurde. Deshalb hier auch nur Widgettest in der folgenden .zip - Datei. Wenn Ihr doch die fpGUI insgesamt braucht, lasst es mich wissen, dann lade ich die noch hier hoch. Ist, wie schon gesagt LGPL. Wer kann mir hier helfen. Auch mit Luckies WinAPI-Handbuch finde ich den Fehler nicht. Gibt es eine Möglichkeit, eine Message abzuschicken, die dem Fenster sagt "Du bist schon verschoben worden, also zeichne den Hintergrund des Clientbereiches? Eine ebensolche Message müßte dann auch bei Größenänderung und Zoom abgeschickt werden. es grüßt ein verzweifelter schöni |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz