AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Message

Ein Thema von nailor · begonnen am 6. Mai 2003 · letzter Beitrag vom 7. Mai 2003
Antwort Antwort
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#1

Problem mit Message

  Alt 6. Mai 2003, 18:06
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:
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.
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.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 6. Mai 2003, 18:25
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.
  IDOK = 100; Dann in WM_CREATE:
Delphi-Quellcode:
function WNDProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
                  lParam: LPARAM): LRESULT; stdcall;
var
  hButton: Cardinal;
Das Erzeugen vom Button:
Delphi-Quellcode:
hButton := CreateWindow('BUTTON', 'caption of a button',
        WS_VISIBLE OR WS_CHILD OR WS_BORDER, 100, 100, 200, 24,
        hwnd, IDOK, hInstance, nil);
Und das Abfangen vom Klick auf dem Button:
Delphi-Quellcode:
WM_COMMAND:
      if hiword(wparam) = BN_CLICKED then
      //########################################################################
        if loword(wparam) = IDOK then //HIER HIER HIER
      //########################################################################
          MessageBox(hwnd, 'button pressed', 'Info', 0);
Dann geht das auch.

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:
WM_COMMAND:
begin
  if hiword(wparam) = BN_CLICKED then
    case loword(wparam) of
      IDOK: MessageBox(hwnd, 'button pressed', 'Info', 0);
    end;
end;
Jetzt kannst du recht einfach und übersichtlich auf verschiedene Controlls reagieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#3
  Alt 6. Mai 2003, 19:09
Hi, ich werde es versuchen. Mit Fehler meine ich, dass Delphi nivht kopilieren wollte, weil zb Zuweisungen für Konstanten gemacht wurden...
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 6. Mai 2003, 19:27
Zeigen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5
  Alt 6. Mai 2003, 20:11
Der Code vom Anfang war übrigens auch nicht falsch, Luckie. Guck mal wie er den Button erzeugt hat:
Delphi-Quellcode:
CreateWindow('BUTTON', 'caption of a button',
  WS_VISIBLE OR WS_CHILD OR WS_BORDER, 100, 100, 200, 24,
  hwnd,
  0, // <-- HIER :o)
  hInstance, nil);
Die Aussage
Zitat:
... an sonsten ist im loword immer 0,
wundert mich also gar nicht.
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6
  Alt 6. Mai 2003, 20:21
http://www.tutorials.delphi-source.d.../file003.shtml
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 6. Mai 2003, 20:42
Verdammt, du hast ja recht. Aber das muß eine alte Version sein. Heute würde er sowas nicht mehr machen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#8
  Alt 7. Mai 2003, 14:50
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9
  Alt 7. Mai 2003, 16:44
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. Es tut gut zu sehen, dass auch die Profis mal angefangen haben.

Gruß.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 7. Mai 2003, 17:01
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz