[Gelöst] Ausführung bestimmter Messages unterbinden?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

[Gelöst] Ausführung bestimmter Messages unterbinden?

Beitrag von TBug »

Wie unterbinde ich die Ausführung bestimmter Messages unter Lazarus?

Unter Delphi kann ich zum Beispiel die WndProc einer Komponente überschreiben um die weitere Verarbeitung von Messages zu unterbinden.

Code: Alles auswählen

 
procedure TNewCheckBox.WndProc(var AMessage: TMessage);
var
  lDoInherited: Boolean;
begin
  lDoInherited := true;
 
  if (    (AMessage.msg = WM_LButtonDown)
       or (AMessage.msg = WM_LButtonUp)
       or (AMessage.msg = WM_LButtonDblClk)
       or (AMessage.msg = WM_MouseMove)
     ) then
   begin
    lDoInherited := false;
   end;
 
  if (lDoInherited) then
   begin
    inherited WndProc(AMessage);
   end;
end;
 

Der obige Code würde unter Delphi nun verhindern, dass die Checkbox sich "verfärbt", wenn die Maus darüber bewegt wird und es wird verhindert, dass die CheckBox angeklickt werden kann.

Lazarus hingegen lässt dies völlig kalt, ausser dass die dazugehörigen Events nicht mehr geworfen werden. Aber die Ausführungen in der Komponente selbst werden nicht unterbunden.

Hat jemand eine Idee, wo hier bei Lazarus angesetzt werden muss?

.
Zuletzt geändert von TBug am Sa 3. Okt 2015, 17:50, insgesamt 1-mal geändert.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Ausführung bestimmter Messages unterbinden?

Beitrag von mschnell »

Derartig Windows-spezifische Spezialitäten sind bei einem System, das dazu gedacht ist auf vielen verschiedenen Plattformen zu laufen natürlich von untergeordneter Bedeutung.

-Michael

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

Re: Ausführung bestimmter Messages unterbinden?

Beitrag von TBug »

mschnell hat geschrieben:Derartig Windows-spezifische Spezialitäten sind bei einem System, das dazu gedacht ist auf vielen verschiedenen Plattformen zu laufen natürlich von untergeordneter Bedeutung.

Ähm?

Einen Maus-Klick zu unterbinden ist doch wohl eher plattformunabhängig und nicht Windows-Spezifisch.


.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Ausführung bestimmter Messages unterbinden?

Beitrag von Komoluna »

Kommt drauf an, ob Systemweit oder nur für die eigene Anwendung...

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

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

Re: Ausführung bestimmter Messages unterbinden?

Beitrag von TBug »

Komoluna hat geschrieben:Kommt drauf an, ob Systemweit oder nur für die eigene Anwendung...

Es geht hier um den Klick auf eine plattformunabhängige Komponente!

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Ausführung bestimmter Messages unterbinden?

Beitrag von Michl »

Ich hatte da mal ein wenig gelesen und probiert, es aber dann irgendwann verworfen. Viel Ahnung habe ich von den Internas nicht wirklich, aber ich kann dir aber mal kurz meine Gedanken dazu mitteilen.

Generell scheinen mehrere Leute ein Interesse an einem Ereignis Control.OnMessage zu haben (lt. Suchmaschine). Dieses hatte ich auch erfolgreich implementiert. Ich konnte zwar (alle) Messages damit auswerten, die Durchleitung an die Controls ohne bedenkliche Nebenerscheinungen nicht unterbinden.

Dazu hatte ich einfach eine Exception in der Procedure TMyCheckBox.WndProc(var Message: TLMessage); geworfen, das Programm mit GDB gestartet und mir den Stacktrace mal angeschaut, um einen Ansatzpunkt zu finden:

Code: Alles auswählen

  Stack trace:
  $004247F5  TMYCHECKBOX__WNDPROC,  line 72 of unit1.pas
  $00533FF9  DELIVERMESSAGE,  line 112 of lclmessageglue.pas
  $004C95C7  TWINDOWPROCHELPER__DOWINDOWPROC,  line 2443 of ./win32/win32callback.inc
  $004C9C5B  WINDOWPROC,  line 2608 of ./win32/win32callback.inc
  $772E62FA
  $772E6D3A
  $772E77C4
  $772E788A
  $004CA8A6  TWIN32WIDGETSET__APPPROCESSMESSAGES,  line 367 of ./win32/win32object.inc
  $00421ABD  TAPPLICATION__HANDLEMESSAGE,  line 1260 of ./include/application.inc
  $00421EDE  TAPPLICATION__RUNLOOP,  line 1395 of ./include/application.inc
  $00424A40  TWIDGETSET__APPRUN,  line 54 of ./include/interfacebase.inc
  $00421E8E  TAPPLICATION__RUN,  line 1383 of ./include/application.inc
  $00402C30  main,  line 19 of project1.lpr
 
Mein Ansatzpunkt war DELIVERMESSAGE, da es imho von allen Widgetsets aufgerufen wird und damit platformunabhängig wäre. Dazu hatte ich ein property OnMessage dem TControl zugefügt und im DELIVERMESSAGE gefeuert. Möglicherweise ist dies aber schon zu spät und man müsste das Ereignis tatsächlich in den Widgetsets unterbringen?!

Wie gesagt, der Ansatz war nicht zielführend, evtl. hilft es dir ja aber als Gedankenanstoß. Die meisten Beiträge beziehen sich darauf, die Messages nur auszuwerten, nicht diese auch zu verwerfen oder nicht ausgewertete Messages einzufangen. Siehe z.B.:http://wiki.lazarus.freepascal.org/Win32/64_Interface#Processing_non-user_messages_in_your_window

Evtl. könnte dir jemand von der Mailing-List mehr helfen?!

Oder teste solange (den Code hast du ja vorliegen) bis du eine hieb- und stichfeste Lösung hast und teile sie (im Bugtracker) :wink:

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: [Gelöst] Ausführung bestimmter Messages unterbinden?

Beitrag von TBug »

Problem gelöst.

Der Ansatz liegt doch in der WndProc.

Beispiel mit einem zusätzlichen OnMessage-Event mit Handled-Parameter kommt später.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [Gelöst] Ausführung bestimmter Messages unterbinden?

Beitrag von mschnell »

TBug hat geschrieben:Der Ansatz liegt doch in der WndProc. Beispiel mit einem zusätzlichen OnMessage-Event mit Handled-Parameter kommt später.


Ist das Plattform-übergreifend oder Windows-only ?

-Michael

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

Re: [Gelöst] Ausführung bestimmter Messages unterbinden?

Beitrag von TBug »

mschnell hat geschrieben:
TBug hat geschrieben:Ist das Plattform-übergreifend oder Windows-only ?

So weit ich mich durch den LCL-Quellcode durchgewühlt habe müßte es eigentlich plattform-übergreifend sein.

Einfach mal das Test-Programm im Anhang benutzen und um eigene Messages, welche unterbunden werden sollen, erweitern.

Feedback erwünscht!


.
Dateianhänge
WndProc.zip
(125.8 KiB) 93-mal heruntergeladen

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [Gelöst] Ausführung bestimmter Messages unterbinden?

Beitrag von Michl »

:oops: ...jetzt weiss ich auch, warum alle meine Tests erfolglos waren - ich hatte nur auf die vom ersten Beitrag geposteten Messages getestet. Diese zu überprüfen bzw. sie zu erweitern, daran hatte ich überhaupt nicht gedacht. Sowas...

TBug hat geschrieben:Feedback erwünscht!
Funktioniert unter Windows 7, 64bit, Lazarus 32- und 64bit.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten