![]() |
Problem mit Message
Ich habe jetzt auch ml mit nonVCL angefangen. Im großen und ganzen ist das nachfolgende Programm das aus dem Tutorial von Assarbard, da waren ein paar Fehler drin, die ich aber (bis auf einen) alle korrigieren konnte. Und um den gehts.
Delphi-Quellcode:
Wenn ich die markierte Zeile auskommentiere gehts, an sonsten ist im loword immer 0, egal was für ein Handle der Button hat. Hoffe, ihr könnt mir helfen.
program nonvcl;
uses windows, messages; const ClassName = 'nonvcl'; var WindowLeft: integer = 100; WindowTop: integer = 100; WindowWidth: integer = 300; WindowHeight: integer = 100; function WNDProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var IDOK: DWORD; begin Result := 0; case uMsg OF WM_CREATE: IDOK := CreateWindow('BUTTON', 'caption of a button', WS_VISIBLE OR WS_CHILD OR WS_BORDER, 100, 100, 200, 24, hwnd, 0, hInstance, nil); WM_DESTROY: PostQuitMessage(0); WM_COMMAND: if hiword(wparam) = BN_CLICKED then //######################################################################## if loword(wparam) = IDOK then //HIER HIER HIER //######################################################################## MessageBox(hwnd, 'button pressed', 'Info', 0); else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); end; end; var wc: TWndClassEx = ( cbSize: SizeOf(TWndClassEx); style: CS_OWNDC OR CS_HREDRAW OR CS_VREDRAW; cbClsExtra: 0; cbWndExtra: 0; hbrBackground: COLOR_WINDOW; lpszMenuName: NIL; lpszClassName: ClassName; hIconSm: 0); msg: TMSG; rect: trect; deskh, deskw: integer; ncm: tagNONCLIENTMETRICS; begin wc.hInstance := HInstance; wc.hIcon := LoadIcon(HInstance, MAKEINTRESOURCE(1)); wc.hCursor := LoadCursor(0, IDC_ARROW); wc.lpfnWndProc := @WndProc; systemparametersinfo(SPI_GETWORKAREA, 0, @rect, 0); deskw := rect.Right - rect.Left; deskh := rect.Bottom - rect.Top; ncm.cbSize := sizeof(ncm); systemparametersinfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, @ncm, 0); windowwidth := windowleft + windowwidth; windowheight := windowtop + windowheight + ncm.iMenuHeight + ncm.iCaptionHeight; Windowleft := (deskw DIV 2) - (windowwidth DIV 2); Windowtop := (deskh DIV 2) - (windowheight DIV 2); RegisterClassEx(wc); CreateWindowEx(WS_EX_WINDOWEDGE OR WS_EX_CONTROLPARENT OR WS_EX_APPWINDOW, ClassName, 'caption of a form', WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX OR WS_VISIBLE, windowleft, windowtop, windowwidth, windowheight, 0, 0, hInstance, NIL); while true do begin if not GetMessage(msg, 0, 0, 0) then break; translatemessage(msg); dispatchmessage(msg); end; ExitCode := GetLastError; end. |
Ich wäre da mal ganz vorsichtig, wenn du behauptest, dass Assarbad fehlerhafte Tutorials veröffentlicht. Ich habe sein Tutoriasl nicht mehr im Kopf - lang, lang ist's her - aber es läuft wahrscheinlich nicht, weil du es verschlimmbessert hast.
Kuck dir mal im PSDK oder alternativ in meinen Tutorials an, was im loword vom wParam von WM_COMMAND steht: Die ID des Controlls. Diese hast du beim Erzeugen des Buttons mit 0 angegeben und testest im WM_COMMAND Zweig testaber auf das Handle vom Button. Mach mal das: Als Konstante führst du IDOK mit 100 ein.
Delphi-Quellcode:
Dann in WM_CREATE:
IDOK = 100;
Delphi-Quellcode:
Das Erzeugen vom Button:
function WNDProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall; var hButton: Cardinal;
Delphi-Quellcode:
Und das Abfangen vom Klick auf dem Button:
hButton := CreateWindow('BUTTON', 'caption of a button',
WS_VISIBLE OR WS_CHILD OR WS_BORDER, 100, 100, 200, 24, hwnd, IDOK, hInstance, nil);
Delphi-Quellcode:
Dann geht das auch.
WM_COMMAND:
if hiword(wparam) = BN_CLICKED then //######################################################################## if loword(wparam) = IDOK then //HIER HIER HIER //######################################################################## MessageBox(hwnd, 'button pressed', 'Info', 0); Den WM_COMMAND-Zweig würde ich aber anderes schreiben, denn wenn du mehrer Controlls hast wird das mit if recht aufwendig und unübersichtlich:
Delphi-Quellcode:
Jetzt kannst du recht einfach und übersichtlich auf verschiedene Controlls reagieren.
WM_COMMAND:
begin if hiword(wparam) = BN_CLICKED then case loword(wparam) of IDOK: MessageBox(hwnd, 'button pressed', 'Info', 0); end; end; |
Hi, ich werde es versuchen. Mit Fehler meine ich, dass Delphi nivht kopilieren wollte, weil zb Zuweisungen für Konstanten gemacht wurden...
|
Zeigen.
|
Der Code vom Anfang war übrigens auch nicht falsch, Luckie. Guck mal wie er den Button erzeugt hat:
Delphi-Quellcode:
Die Aussage
CreateWindow('BUTTON', 'caption of a button',
WS_VISIBLE OR WS_CHILD OR WS_BORDER, 100, 100, 200, 24, hwnd, 0, // <-- HIER :o) hInstance, nil); Zitat:
|
|
Verdammt, du hast ja recht. Aber das muß eine alte Version sein. Heute würde er sowas nicht mehr machen.
|
Ist IDOK nicht eine vordefinierte Konstante mit dem Wert 1 und sollte daher besser nicht neu definiert werden, um Probleme damit zu vermeiden?
OK, ist hier lokal, aber gerade in einer WndProc braucht man das ja vielleicht mal. |
Richtig. IDCANCEL übrigens auch. Aber da haben wir z.B. festgestellt, dass es IDCANCEL unter Delphi 6 nicht zu geben scheint. Nur noch die Version mit dem Unterstrich ID_CANCEL, die letztlich die selbe ID hat.
Aber wenn man z.B. Dialoge benutzt, muss man keinen Shortcut für die ESC-Taste anlegen. Das geht einfach mit
Delphi-Quellcode:
if(wParam = IDCANCEL) then
SendMessage(hwndDlg,WM_CLOSE,0,0); Das Problem ist hier (im o.g. Beitrag) tatsächlich ein Fehler in Assarbads Tutorial. Eigentlich müsste man ihm das mal unter die Nase reiben. :twisted: Es tut gut zu sehen, dass auch die Profis mal angefangen haben. :) Gruß. |
Ich habe es ihm schon per ICQ gesagt, aber ich weiß nicht, ob die Wahrnehmung bis in seinen Bewußtsein vorgedrungen ist, da er nicht reagiert hat. :?
Aber verdammt, das muß ihm doch beim Kompilieren und Testen aufgefallen sein, dass das so nicht geht. Es ist mir ein Rätsel, wie er so was ins Netzt stellen kann. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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