Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi nonVCL: Nachrichtenschleife (https://www.delphipraxis.net/16700-nonvcl-nachrichtenschleife.html)

Pseudemys Nelsoni 22. Feb 2004 07:06


nonVCL: Nachrichtenschleife
 
hoi,

luckie hat in seinen win32api tuts diese nachrichtenschleife:

Delphi-Quellcode:
function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM):
  LRESULT; stdcall;
begin
  Result := 0;

  case uMsg of
    WM_CREATE:
      // Funktionen ausführen
    WM_DESTROY:
      PostQuitMessage(0);
    else
      Result := DefWindowProc(wnd,uMsg,wp,lp);
  end;
end;
dazu habe ich einige fragen...


1: Wer oder was ruft diese function auf? MUSS sie WndProc heissen?
2: Was ist UINT? unsigned integer(?) und wieso nicht integer oder longint?

MathiasSimmack 22. Feb 2004 07:42

Re: nonVCL: Nachrichtenschleife
 
Erstens ist das keine Nachrichtenschleife sondern die Nachrichtenfunktion, und wenn du die Tutorials weiter gelesen hättest, wüsstest du die Antwort zu 1
Die Nachrichtenfunktion (Fenster-Tutorial)
Zuständig für Nachrichten innerhalb unseres Programms ist eine eigene Funktion. Die meisten Programme verwenden den Namen "WndProc" für diese Funktion, der auch so in der Microsoft-Hilfe zu finden ist.

Womit schon mal klar ist, dass du den Namen selbst wählen kannst. "WndProc" ist so eine Art Standard, der sich in den meisten Programmen eingebürgert hat. Aufgerufen, oder besser gesagt: zugewiesen, wird sie entweder in der Fensterklasse:
Delphi-Quellcode:
var
  {Struktur der Fensterklasse}
  wc: TWndClassEx = (
    cbSize         : SizeOf(TWndClassEx);
    Style          : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc    : @WndProc;
    cbClsExtra     : 0;
    cbWndExtra     : 0;
    hbrBackground  : COLOR_APPWORKSPACE;
    lpszMenuName   : nil;
    lpszClassName  : ClassName;
    hIconSm        : 0;
  );
oder bei Dialogen in der Funktion, die den Dialog erzeugt:
Delphi-Quellcode:
DialogBox(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc);
Aber das klärt sich meiner Ansicht nach eigentlich, wenn man die Tutorials liest.

Und zu 2) Die Deklaration entspricht eigentlich dem C-Vorbild:
Code:
LRESULT CALLBACK WindowProc(          HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);
wobei ich immer den von dir zitierten Teil bevorzuge, in dem "wp" und "lp" benutzt werden, denn Delphi unterscheidet nicht zwischen Groß- und Kleinschreibung, darum verwende ich als Variablennamen ungern bestehende Typennamen. Und laut "Windows.pas" steckt hinter UINT ein LongWord. Wenn du mal in die Hilfe von Delphi schaust, dann ist das IMHO bloß ein Cardinal-Wert. Integer und Longint verbieten sich damit wohl, weil sie vorzeichenbehaftet sind.

Pseudemys Nelsoni 22. Feb 2004 07:50

Re: nonVCL: Nachrichtenschleife
 
hallo,

sorry hatte mich verschrieben, ich meine natürlich die funktion.

Ich verstehe aber immernoch nicht wo diese funktion:

Delphi-Quellcode:
function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM):
  LRESULT; stdcall;
begin
  Result := 0;

  case uMsg of
    WM_CREATE:
      // Funktionen ausführen
    WM_DESTROY:
      PostQuitMessage(0);
    else
      Result := DefWindowProc(wnd,uMsg,wp,lp);
  end;
end;
mit "WndProc(?, ?, ?, ?);" aufgerufen wird. Also ich sehe nur die funktion, aber nirgends ein aufruf

Sharky 22. Feb 2004 07:55

Re: nonVCL: Nachrichtenschleife
 
Hai Pseudemys Nelsoni,

schaue dir in dem Posting von Mathias mal die Beschreibung der Fensterklasse an. Dort wird als dritter Parameter ein Pointer auf die Funktion angegeben.

MathiasSimmack 22. Feb 2004 07:56

Re: nonVCL: Nachrichtenschleife
 
open Ur Is

Zitat:

Zitat von MathiasSimmack
Aufgerufen, oder besser gesagt: zugewiesen, wird sie entweder in der Fensterklasse:
Delphi-Quellcode:
var
  {Struktur der Fensterklasse}
  wc: TWndClassEx = (
    { ... }
    lpfnWndProc    : @WndProc;
    { ... }
  );

Aber das steht auch exakt so in den Tutorials drin. Ich weiß nicht womit du anfängst, und ich will dich auch nicht kritisieren, aber schau mal unter "Fenster und Controls -> Fenster -> Die Nachrichtenfunktion". Da steht´s gleich ganz oben. ;)

Pseudemys Nelsoni 22. Feb 2004 08:01

Re: nonVCL: Nachrichtenschleife
 
ok, danke *g*, vielleicht kommts ja noch *weiterles*

MathiasSimmack 22. Feb 2004 08:53

Re: nonVCL: Nachrichtenschleife
 
Ohne dich beleidigen zu wollen: aber vielleicht solltest du so ein Kapitel erst mal komplett lesen? Viele Fragen klären sich dann von selbst, und falls nicht, dann ist Luckie ja immer noch anwesend.

Pseudemys Nelsoni 22. Feb 2004 09:18

Re: nonVCL: Nachrichtenschleife
 
jo, aber ich weiss nicht ob ich ein thema eröffnet hätte, wenn ich mich nicht auch gefragt hätte was "UINT" heisst, das wird da nicht drin stehen

Chewie 22. Feb 2004 13:25

Re: nonVCL: Nachrichtenschleife
 
Wenn du mal einen Typ nicht kennst, versuch mal, mit der rechten Maustaste daraufzuklicken und dort "Deklaration suchen" auszuwählen. Alternativ gehts auch mit Strg+Linksklick. Dort siehst du dann die Typdefinition.

Pseudemys Nelsoni 22. Feb 2004 17:47

Re: nonVCL: Nachrichtenschleife
 
ah, danke, kann man auch direkt "LongWord" benutzen? statt UINT?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr.
Seite 1 von 2  1 2      

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