procedure xxxx(); message xxx

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 5313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

procedure xxxx(); message xxx

Beitrag von Mathias »

Wen ich in den Sourcen von der LCL gucke, finde ich mehrfach das Schlüsselwort "message"

Code: Alles auswählen

    procedure WMMove(var Message: TLMMove); message LM_MOVE;
    procedure WMSize(var Message: TLMSize); message LM_SIZE;
Ich vermute mal, das dies mit den Event-Handle des OS zu tun hat.
Gibt es eine Erklärung dafür, wie dies in etwa funktioniert ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1169
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: procedure xxxx(); message xxx

Beitrag von fliegermichl »

Diese Methoden kann man nur innerhalb von Formularen verwenden, da diese ein Fensterhandle des Betriebsystems haben.
Das Betriebssystem schickt Messages an die Applikation, welche diese in den meisten Fällen an das aktive Control weiterleitet.

Die wndproc Prozedur ruft dann automatisch die entsprechenden Methoden auf, welche mit dieser Message verbunden wurden.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5475
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: procedure xxxx(); message xxx

Beitrag von af0815 »

Bei GUI Applikationen (besonders windows) gibt es im Hintergund die MessageLoop des Betriebssystems. Das wird von Lazarus (und Delphi) vor dem Programmierer 'versteckt'. Der Autor Kosch hat da in einigen Büchern das sehr detailiert erklärt und auch die Hintergründe dazu (für Delphi damals). In Lazarus ist das ähnlich. Mit dem berühmten Application.ProcessMessages hälts du genau die Messageloop am laufen. :D

Egal ob Bildschirm refresh oder Tastendrücke, alles geht bei Windows durch das Messagesystem. Dabei kann das System auch gewisse Ereignisse zusammenfassen. Daher wenn etliche Bildschirm refresh anstehen, macht es keinen Sinn das mehrmals zu machen, also kann das System die überzähligen Refreshbotschaften einfach löschen, weil ja nur der letzte zieht. (So habe ich das verstanden - in der guten alten Zeit)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 5313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: procedure xxxx(); message xxx

Beitrag von Mathias »

Die wndproc Prozedur ruft dann automatisch die entsprechenden Methoden auf,
Dann wird dies unter Linux ähnlich sein.

Ich beschäftige mich momentan mit mit der direkten Programmierung von X11.
Da musste mich aber nicht mit solchen "messages" rumschlagen.

Einzig mit solch einem Befehl hatte ich Kontakt:

Code: Alles auswählen

    wm_delete_window := XInternAtom(dis, 'WM_DELETE_WINDOW', False);
Ausser dieser Kleinigkeit konnte ich alles über den Event-Handle abbarbeiten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 9568
Registriert: Mo 11. Sep 2006, 19:01

Re: procedure xxxx(); message xxx

Beitrag von theo »

Mathias hat geschrieben:
Fr 11. Nov 2022, 16:55
Ich beschäftige mich momentan mit mit der direkten Programmierung von X11.
Da musste mich aber nicht mit solchen "messages" rumschlagen.
Das macht dort auch nicht X11 sondern GTK und Qt.

PascalDragon
Beiträge: 623
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: procedure xxxx(); message xxx

Beitrag von PascalDragon »

Mathias hat geschrieben:
Fr 11. Nov 2022, 16:32
Wen ich in den Sourcen von der LCL gucke, finde ich mehrfach das Schlüsselwort "message"

Code: Alles auswählen

    procedure WMMove(var Message: TLMMove); message LM_MOVE;
    procedure WMSize(var Message: TLMSize); message LM_SIZE;
Ich vermute mal, das dies mit den Event-Handle des OS zu tun hat.
Gibt es eine Erklärung dafür, wie dies in etwa funktioniert ?
Vorwiegend wird dies im Zusammenhang mit der Ereignisbehandlung von GUI-Anwendungen verwendet, der Mechanismus an sich ist jedoch unabhängig davon. Eine Methode, welche einen message Modifizierer hat darf einen einzigen var-Parameter haben, welcher vom Typ record ist und als erstes Feld entweder einen 32-bit Wert oder einen ShortString hat (je nachdem, was bei message ConstantIdentifier angegeben ist. Aufrufen kannst du es dann mittels der Dispatch- oder DispatchStr-Methode (wieder je nach Typ) und einem passendem record. Je nach Wert des ersten Felds wird dann die passende Methode aufgerufen oder DefaultHandler bzw. DefaultHandlerStr, falls keine entsprechende Methode gefunden wird. Dabei ist es egal wann in der Klassenhierarchie die Methode deklariert ist. Außerdem sind diese immer implizit virtual.

Für mehr Informationen siehe die Dokumentation.
FPC Compiler Entwickler

Mathias
Beiträge: 5313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: procedure xxxx(); message xxx

Beitrag von Mathias »

Wen ich es richtig verstanden habe, dient das dazu, das eine GUI wie GTK nicht so grosse Event Blöcke mit "case of" haben ?
Mit den vielen Onxxxx Ereignissen in der LCL, bräuchte es sonst riesen "case of" Blöcke.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 623
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: procedure xxxx(); message xxx

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mo 14. Nov 2022, 09:00
Wen ich es richtig verstanden habe, dient das dazu, das eine GUI wie GTK nicht so grosse Event Blöcke mit "case of" haben ?
Mit den vielen Onxxxx Ereignissen in der LCL, bräuchte es sonst riesen "case of" Blöcke.
Vereinfacht formuliert ist das so, ja.
FPC Compiler Entwickler

Mathias
Beiträge: 5313
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: procedure xxxx(); message xxx

Beitrag von Mathias »

Jetzt habe ich einen neuen Vorzug von "message" kennen gelernt.
Folgendes Beispiel fängt die Tastatur ab.

Code: Alles auswählen

  TForm1 = class(TForm)
  private
    procedure LMKeyDown(var Message: TLMKeyDown); message LM_KEYDOWN;
Ich kann es aber auch so schreien:

Code: Alles auswählen

    procedure TasteGerdrueckt(var Message: TLMKeyDown); message LM_KEYDOWN;
Und es geht auch so. Somit kann man bei Message-Proceduren einen Namen wählen, was einem gefällt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

TBug
Beiträge: 165
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: procedure xxxx(); message xxx

Beitrag von TBug »

Mathias hat geschrieben:
Do 24. Nov 2022, 13:19
Ich kann es aber auch so schreien:
8) :mrgreen:
Ich muss auch mal probieren im Lazarus-Editor mit Spracheingabe zu programmieren!

Allerdings würde ich das Mikro dann nicht so weit von meiner Sitzposition entfernt aufstellen.
:lol: :lol: :lol:

Antworten