amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > GetMsg->Maustasteproblem [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2005-07-06, 16:56 h

Ralf27
Posts: 2779
User
Theoretisch funktioniert es, aber in der Praxis gibt hin und wieder Schwierigkeiten die ich mir nich erklären kann. Anbei mal etwas MBasic-Code(ich muß hier gleich tippen das ich hier gleiche die Zahlenwerte angegeben habe und nicht die Konstanten von den Includes):

REM MessageSystem auslesen
m&=GetMsg&(Userport&)
w&=0
IF m& THEN
w&=PEEKL(m&+20):ReplyMsg! m&
ELSE
REM Warten bis was passiert
xWait& 1& << PEEK(userport&+15)
END IF

Genau so lese ich das Messagesystem aus. Und im Normalfall läuft das ganze auch rund. Das ganze befindet sich in einer WHILE-WEND-Schleife.

Wenn ich jetzt z.b. jetzt ganz wild mit der Maus rumklicke, dann fängt das System irgend wann mal an die Maustastenevents irgendwie invertiert(?!?) zu übertragen. Ich frage die Maus über das MouseButtons ( 8 )-Event ab.
Wenn ich jetzt die Events auf dem Bildschirm ausgeben die ich von GetMsg bekomme, dann bekomme ich irgendwann dann plötzlich die 8 bei *nicht* gedrückter Maustaste und 0 bei gedrückter. Und genau das versteh ich nicht. Wie kann sowas passieren?
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2005-07-06, 17:15 h

thomas
Posts: 7717
User
Zitat:
Original von Ralf27:
Wenn ich jetzt z.b. jetzt ganz wild mit der Maus rumklicke,
[...]
dann bekomme ich irgendwann dann plötzlich die 8 bei *nicht* gedrückter Maustaste und 0 bei gedrückter. Und genau das versteh ich nicht. Wie kann sowas passieren?


Nun, Basic ist langsam. Wenn du "wild rumklickst", kann es passieren, daß zwei Messages nacheinander auf dem Port stehen. Du holst aber immer nur eine ab, bevor du wieder wartest.

Du brauchst zwei Schleifen:

code:
programm_nicht_zuende = 1
WHILE programm_nicht_zuende
   WaitPort (port)
   m = GetMsg (port)
   WHILE m <> 0
      ; verarbeiten
      ; z.B. wenn Fensterschließsymbol gedrückt, programm_nicht_zuende = 0
      ReplyMsg (m)
      m = GetMsg (port)
   WEND
WEND


In deinem Codeausschnitt gehst du davon aus, daß du immer nur ein MOUSEBUTTON-Event bekommst, außerdem schreibst du nicht, was du außerdem noch in der Schleife machst. Ich vermute, du prüfst auch noch mit Basic-Mitteln auf andere Eingaben (z.b. Fensterschließsymbol). Das verträgt sich natürlich nicht mit dem Wait(), denn Wait kommt wirklich nur zurück, wenn eine (neue) Message auf dem Port ist.

Schau mal auf http://thomas-rapp.homepage.t-online.de/examples/index.html, da sind mehrere Beispiele, die die Fenstereingaben abfragen. Z.B. KeyJoy fragt die Cursor-Tasten ab oder Show_Pic wartet, bis die linke Maustaste gedrückt wird, um das Programm zu beenden.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2005-07-06, 18:25 h

Ralf27
Posts: 2779
User
[quote]
Original von thomas:
Zitat:
Nun, Basic ist langsam. Wenn du "wild rumklickst", kann es passieren, daß zwei Messages nacheinander auf dem Port stehen. Du holst aber immer nur eine ab, bevor du wieder wartest.
Also so langam ist Basic nun auch wieder nicht. Aber auch wenn das so wäre und es wären einige Events auf dem "Stack", dann würde meine Routine die nacheinander abarbeiten bis wieder nix mehr da ist.
Ich hole immer nur eine ab und die wird abgearbeitet. Wenn ich das gemacht habe, dann wird der nächste Event geholt. Wenn aber nix mehr da ist zum abarbeiten, dann wird mit xWait das Programm zum warten geschickt.
Zitat:
Du brauchst zwei Schleifen:

code:
programm_nicht_zuende = 1
WHILE programm_nicht_zuende
   WaitPort (port)
   m = GetMsg (port)
   WHILE m <> 0
      ; verarbeiten
      ; z.B. wenn Fensterschließsymbol gedrückt, programm_nicht_zuende = 0
      ReplyMsg (m)
      m = GetMsg (port)
   WEND
WEND


In deinem Codeausschnitt gehst du davon aus, daß du immer nur ein MOUSEBUTTON-Event bekommst, außerdem schreibst du nicht, was du außerdem noch in der Schleife machst. Ich vermute, du prüfst auch noch mit Basic-Mitteln auf andere Eingaben (z.b. Fensterschließsymbol). Das verträgt sich natürlich nicht mit dem Wait(), denn Wait kommt wirklich nur zurück, wenn eine (neue) Message auf dem Port ist.

Ich bezog mich nur auf das Mausevent. Die anderen werden ja auch abgearbeitet wie z.b. die Tastaturabfrage und das geht ja.

Beim Aufbau des Fensters kann man ja angeben welche Events man haben möchte und genau diese arbeite ich dann auch ab.

Das Beispiel von mir oben ist in einer WHILE-WEND-Schleife drin. In dieser Schleife ist die Abfrage des Ports und danach die Abarbeitung der Events.

Selbst wenn Basic so langsam wäre, die Events warten doch, oder? Selbst wenn Basic 1 Sekunde bräuchte, die Events warten doch (einfach mal eine Annahme von mir)

Aber dennoch, das erklärt nicht die Sache, das ich eine 8 bekomme beim *loslassen* der Maustaste und eine 0 beim drücken der Maustaste. Genau das bringt mich zum staunen.

PS: Wegen dem Speed von MBasic. Schau dir mal beim BMP-Reader an beim Enpacken von IFF-ILBM oder BMP. Das ist in MBasic und auch nicht gerade langsam.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2005-07-06, 18:29 h

Ralf27
Posts: 2779
User
@thomas:

Dein Programmcode in Basic sieht ungefähr so aus wie mein Programm. Vereinfacht sieht es so aus:

code:
taste$=""

WHILE taste$<>"Q"

 REM MessageSystem auslesen
 m&=GetMsg&(Userport&)
 w&=0
 IF m& THEN
  w&=PEEKL(m&+20):ReplyMsg! m&
 ELSE
  REM Warten bis was passiert
  xWait& 1& << PEEK(userport&+15)
 END IF

 [Code für Eventverarbeitung]

WEND


Sollte der Rechner warten und nach xWait weiterarbeiten, dann hat er als Eventwert (w&) eine NULL, bzw. kein Event. Der Rechner wartet wirklich nur dannm, wenn als Message eine NULL kommt und auch nur dann.

Ich überprüfe mit keinem Basic-Bordmittel die Fenster, was ja auch nicht geht. Denn für Basic gibt es diese Fenster ja gar nicht. :D

PS: Jetzt ist mir auch klar wie man hier im Forum am besten Programmcode darstellt. :)

--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 06.07.2005 um 18:34 Uhr editiert. ]

[ - Answer - Quote - Direct link - ]

2005-07-06, 18:48 h

Ralf27
Posts: 2779
User
Jedenfalls bekomme ich dann bei gedrückter Maustaste kein Event und wenn ich sie gehn lasse das Maustastenevent. Und genau das ist mein Problem. Genau das kann ja nicht sein. Das ist ein Problem was mich wirklich nervt... :dance3:
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2005-07-06, 19:24 h

thomas
Posts: 7717
User

Erstmal solltest du den Dingen Namen geben. "20" ist nicht sehr aussagekräftig. "Class" schon

Class& = 20
...
w& = PEEKL(m& + Class&)

Wäre viel lesbarer.

Außerdem fragst du in deinem Programm überhaupt nicht ab, ob die Taste gedrückt oder losgelassen wird.

Nach dem ReplyMsg ist die Message weg, dann darfst du m& nicht mehr benutzen. Du kannst in deinem Event-Handling also nur auf w& zurückgreifen, weil das das einzige ist, was du aus der Message gerettet hast.

w& ist die Klasse (IntuiMessage->Class). Wenn die 8 ist (IDCMP_MOUSEBUTTONS), dann heißt das nur, daß irgendwas mit den Mausknöpfen passiert ist, aber nicht, was. Du mußt dann noch IntuiMessage->Code abfragen, um herauszufinden, was eigentlich passiert ist, oder IntuiMessage->Qualifier, um den aktuellen Stand aller sog. "Modifier" herauszufinden (das sind Ctrl, Shift, Alt, Amiga, die Maustasten und einige andere).

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2005-07-06, 19:32 h

Ralf27
Posts: 2779
User
Zitat:
Original von thomas:

Erstmal solltest du den Dingen Namen geben. "20" ist nicht sehr aussagekräftig. "Class" schon

Class& = 20
...
w& = PEEKL(m& + Class&)

Wäre viel lesbarer.

Außerdem fragst du in deinem Programm überhaupt nicht ab, ob die Taste gedrückt oder losgelassen wird.

Nach dem ReplyMsg ist die Message weg, dann darfst du m& nicht mehr benutzen. Du kannst in deinem Event-Handling also nur auf w& zurückgreifen, weil das das einzige ist, was du aus der Message gerettet hast.

w& ist die Klasse (IntuiMessage->Class). Wenn die 8 ist (IDCMP_MOUSEBUTTONS), dann heißt das nur, daß irgendwas mit den Mausknöpfen passiert ist, aber nicht, was. Du mußt dann noch IntuiMessage->Code abfragen, um herauszufinden, was eigentlich passiert ist, oder IntuiMessage->Qualifier, um den aktuellen Stand aller sog. "Modifier" herauszufinden (das sind Ctrl, Shift, Alt, Amiga, die Maustasten und einige andere).

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/


Also, das wußte ich nicht das man da nochmals abfragen muß. Ich dachte, wenn die 8 kommt, dann ist die Maustaste gedrückt und das wars, aber das da nochmals unterschieden wird, wußte ich nicht. Und genau *das* wird er Fehler sein! *freu* :)

Wie würde das als Code aussehn?
Also, ich hab jetzt bei Class denn IDCMP_Mousebuttons und dann muß ich noch abfragen was genau mit denn Maustasten ist. Wie geht das?
Code ist 24, also a=peekl(m&+24).
Also, wenn ich a habe, was ist dann was? Ich schau mir später noch Dein Programmlink an. Aber leider muß ich jetzt kurz noch was erledigen.
Aber es freut mich das es eine Lösung für mein Rätsel gibt. :D

PS: Ich weiß das ich eigentlich die Includes einbinden sollte und dann auch die Namen benutzen sollte. Ich muß mich wohl noch dazu zwingen. :D
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2005-07-06, 19:43 h

thomas
Posts: 7717
User
Zitat:
Original von Ralf27:
Ich dachte, wenn die 8 kommt, dann ist die Maustaste gedrückt und das wars, aber das da nochmals unterschieden wird, wußte ich nicht.


Und was ist mit dem rechten Mausknopf ? Und mit dem mittleren ? Und was passiert, wenn die Knöpfe losgelassen werden ?

Zitat:
Code ist 24, also a=peekl(m&+24).
Also, wenn ich a habe, was ist dann was?


linker Knopf = 104
rechter Knopf = 105
mittlerer Knopf = 106

Beim Loslassen kommt der gleiche Code, nur um 128 höher (also 232, 233 und 234).

Hier ist noch ein Beispiel, das sich auf die Mausabfrage konzentriert: http://thomas-rapp.homepage.t-online.de/examples/maus.c


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2005-07-06, 22:28 h

Ralf27
Posts: 2779
User
Danke! Das erklärt wirklich alles und das gibt mir jetzt auch noch mehr Möglichkeiten für mein Programm. Ich kann also somit auch noch die mittlere Maustaste unterstützen. :P

Also, die Events bieten mir da schon einiges mehr als die Basic-Befehle. Wesentlich mehr. So langsam geht es wieder vorwärts. :)

Wegen den Includes:
Ich sollte mal wirklich die mal einbinden. Das macht es wirklich lesbarer.
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2005-07-07, 08:08 h

thomas
Posts: 7717
User
Zitat:
Original von Ralf27:
Ich kann also somit auch noch die mittlere Maustaste unterstützen.


Du kannst sogar das Scrollrad unterstützen. Hol dir mal das NewMouse-Archiv aus dem Aminet, da steht beschrieben, welche InputEvents man von dem Scrollrad bekommt. Es waren glaube ich RAWKEY-Messages mit den Codes $7a und $7b oder so.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > GetMsg->Maustasteproblem [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.