Auf mehrere Messages reagieren - Win32 Bug?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Auf mehrere Messages reagieren - Win32 Bug?

Beitrag von RSE »

Kann ich eine Message-Methode nicht irgendwie auch gleich auf mehrere Messages reagieren lassen? Folgendes akzeptiert der Compiler zwar beides, aber dann wird bei beiden Varianten zumindest auf LM_UPDATESCROLLBAR (meine eigene Message) nicht mehr reagiert:

Code: Alles auswählen

procedure Update(var Msg); message LM_UPDATESCROLLBAR; message LM_HSCROLL; message LM_VSCROLL;
procedure Update(var Msg); message LM_UPDATESCROLLBAR or LM_HSCROLL or LM_VSCROLL;
Wenn ich die hinteren beiden wieder wegnehme, funktioniert alles wie gewünscht, also der "Fehler" liegt auch definitiv an dieser Stelle ;-)

Ich könnte auch zwei weitere Message-Prozeduren erstellen, die nur Update aufrufen... wär halt schön wenns eleganter ginge.
Zuletzt geändert von RSE am Do 29. Okt 2009, 16:56, insgesamt 1-mal geändert.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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: Message-Methode soll auf mehrere Messages reagieren

Beitrag von mschnell »

OOps, Ich hatte gedacht, procedure....message wäre gar kein Sprach-Element von FPC..., weil es Betriebssystem - abhängig und nicht portierbar ist.

-Michael

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Message-Methode soll auf mehrere Messages reagieren

Beitrag von RSE »

mschnell hat geschrieben:...weil es Betriebssystem - abhängig und nicht portierbar ist.
AFAIK ist diese Aussage falsch. Da auch Lazarus intern mit Messages arbeitet, kann es eigentlich nicht auf Windows beschränkt sein. Auch das Vorkommen von LM_MESSAGENAME statt WM_MESSAGENAME ist ein starkes Indiz für Betriebssystemunabhängigkeit. Zudem werden die Messages ja auch programmintern gehandelt. AFAIK ist das Message-System tatsächlich ein von MS "abgegucktes" Feature, das auch in Unixen umgesetzt ist. Zumindest erweckt die Doku da an manchen Stellen den Eindruck (aber frag jetzt bitte nicht nach Beispielen!).
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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: Message-Methode soll auf mehrere Messages reagieren

Beitrag von mschnell »

OK,

Ich kann das Beispiel in Linux fast übersetzen. "Procedure....; message;" wird problemlos erkannt. Ich habe testweise LM_UPDATESCROLLBAR etc einfach 'mal durch 1 ersetzt und es geht durch den Compiler. Die Message 1 kommt natürlich nie.

Wo ist dennLM_HSCROLL etc definiert ? (Online-Hilfe dazu gibt es anscheinend nicht.) Edit: Gefunden in LMessages.

Ich glaube nicht, dass Verodern von Message-Nummern etwas sinnvolles macht.

-Michael
Zuletzt geändert von mschnell am Do 29. Okt 2009, 13:01, insgesamt 1-mal geändert.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Message-Methode soll auf mehrere Messages reagieren

Beitrag von RSE »

RSE hat geschrieben:LM_UPDATESCROLLBAR (meine eigene Message)
Die wirst du also nicht finden ;-) Die anderen beiden sind aber Standard-Messages, die beim Betätigen der jeweiligen Standardscrollbar auftreten. Schau dir mal die Unit LMessages an. Wenn du eigene Messages definierst, solltest du ein Offset von LM_USER benutzen.

Hoffentlich findet sich noch jemand, der mir auch meine Frage beantworten kann :|
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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: Message-Methode soll auf mehrere Messages reagieren

Beitrag von mschnell »

Ich konnte nun (in Linux) ein Message fangen

Warum machst Du nicht

Update(var Msg: TLMessage )
?

Dann kannst Du die Message und ihre Parameter im Programm abfragen.

-Michael

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Message-Methode soll auf mehrere Messages reagieren

Beitrag von RSE »

Das brauche ich gar nicht, aber die Prozedur muss bei allen 3 Messages aufgerufen werden, das ist mein eigentliches Problem.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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: Message-Methode soll auf mehrere Messages reagieren

Beitrag von mschnell »

RSE hat geschrieben:die Prozedur muss bei allen 3 Messages aufgerufen werden, das ist mein eigentliches Problem.
Wenn nicht das, was tut dann Dein Code ?

procedure Update(var Msg); message LM_UPDATESCROLLBAR; message LM_HSCROLL; message LM_VSCROLL;

Scheint bei mir zu klappen. Das der andere nicht wie gewünscht funktioniert ist klar.

-Michael

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Message-Methode soll auf mehrere Messages reagieren

Beitrag von RSE »

Hm, also wenn

procedure Update(var Msg); message LM_UPDATESCROLLBAR; message LM_HSCROLL; message LM_VSCROLL;

bei dir mit allen 3 Messages auch aufgerufen wird, dann handelt es sich wohl um einen Win32 Bug. Wenn ich die hinteren beiden Messages auskommentiere, wird Update wie gewünscht aufgerufen. Kommentiere ich sie wieder ein, wird Update nicht mehr aufgerufen.

Wenn es bei dir mit mehreren message Keywords so funktioniert, liegt es vielleicht daran, dass die 3 von mir gewählten Message Identifier mit unterschiedlichen Messagetypen daherkommen, die damit übersendet werden... Ich werd da noch mal ein bissl mit rumprobieren.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Message-Methode soll auf mehrere Messages reagieren

Beitrag von RSE »

Die Randbedingungen:
Ich habe mir eine eigene Klasse für meine Scrollbars gebaut, die einen Owner haben muss, bei dem dann die Scrollbars eingebaut werden. Meine Scrollbar-Klasse hat also kein eigenes Windows-Handle und bekommt somit die LM_HSCROLL und LM_VSCROLL messages nicht, sondern nur die eigene LM_UPDATESCROLLBAR. LM_HSCROLL und LM_VSCROLL müssen in der Owner-Klasse abgefangen werden. Momentan habe ich nur eine vertikale Scrollbar, der Owner erhält also auch nur die LM_VSCROLL. Ich habe meine Klassen also folgendermaßen angepasst:
-In der Scrollbar-Klasse soll nur noch auf LM_UPDATESCROLLBAR reagiert werden (1x message)
-In der Owner-Klasse gibt es eine Message-Prozedur, die nun auf LM_HSCROLL und LM_VSCROLL reagiert und intern Update aus der Scrollbarklasse aufruft.

Symptome:
Folgende Methode wird bei LM_VSCROLL ausgeführt:

Code: Alles auswählen

procedure UpdateScrollBars(var Msg); message LM_HSCROLL; message LM_VSCROLL;
Folgende Methode wird bei LM_VSCROLL nicht ausgeführt (LM_VSCROLL; message LM_HSCROLL vertauscht):

Code: Alles auswählen

procedure UpdateScrollBars(var Msg); message LM_VSCROLL; message LM_HSCROLL;
Ich schließe daraus, dass nur das letzte message aktiv ist.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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: Auf mehrere Messages reagieren - Win32 Bug?

Beitrag von mschnell »

Tja, Ist das ein Bug oder ein Feature ?

Hast Du das 'mal mit Delphi probiert ?

-Michael

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Auf mehrere Messages reagieren - Win32 Bug?

Beitrag von RSE »

Hab leider kein Delphi.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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: Auf mehrere Messages reagieren - Win32 Bug?

Beitrag von mschnell »

Das kostenlose Turbo-Delphi kann man leider nicht mehr downloaden :(.

-Michael

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

Re: Auf mehrere Messages reagieren - Win32 Bug?

Beitrag von af0815 »

Laut den Reference Guide (siehe 6.3.1 und 6.3.5) ist auch die mehrfach Definition von 'message' (wie auch 'virtual', ' reintroduce') nicht vorgesehen. Im Syntaxdiagramm ist keine Loop für 'method directives' vorgesehen.

Ich würde auch Vorschlagen bei solchen Fragen zuerst mal in den Reference Guide zu sehen, der - so wie die restliche vorhandene Dokumentation - viel an Information bietet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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: Auf mehrere Messages reagieren - Win32 Bug?

Beitrag von mschnell »

Delphi macht eine Fehlermeldung, wenn mehrfach "message" angegeben wird.

Vermutlich ist es also ein FPC-Bug, dass der Code akzeptiert wird..

-Michael

Antworten