perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 19
Click for quality!




12.02.2012 / 03:59

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


Beitrag<Motion> und <Enter>
Seitenanfang
Hallo!

Vielleicht weiß hierzu jemand eine Lösung:

Auf dem Tk::Canvas gibt es zwei Kreise. Diese werden durch eine Linie verbunden, wenn man auf den ersten Kreis mit der linken Maustaste klickt, sie gedrückt hält und dann zum zweiten Kreis zieht. Der Zielkreis soll dabei blau gefüllt werden, solange die Maus sich innerhalb des Kreises befindet.

Zur Realisierung sind die Events <B1-Press>, <B1-Motion>, <B1-Release>, <B1-Enter> und <B1-Leave> definiert, wobei "Enter" und "Leave" nur an Objekte mit dem Tag "Kreis" gebunden sind.

Das Problem: Hält man nun auf dem Startkreis die linke Maustaste gedrückt und bewegt sie hin und her, so funktioniert sowohl das Enter- und Leave-Event als auch das B1-Motion-Event. Beim zweiten Kreis (und allen anderen außer dem, von dem aus gestartet wurde), tut sich nichts. Woran könnte das liegen?

Michael

Datum: 04.09.2005-10:46

Beitragre: <Motion> und <Enter>
Seitenanfang
Warum sollte sich da auch was tun? Das jeweilige Event wird immer nur an das gerade beteiligte (also angeklickte) Objekt geschickt, nicht an alle vorhandenen die auf das Event reagieren koenn(t)en.

Wenn Du bei Bewegung eines Kreises weitere mitbewegen oder fuellen (oder irgendwas anderes mit Ihnen anstellen) willst, musst Du dich selbst darum kuemmern.

Datum: 04.09.2005-11:00

Beitragre: <Motion> und <Enter>
Seitenanfang
Aber was macht es dann für einen Sinn, Befehle wie "$self->bind("Kreis", '<B1-Enter>' => \&_kreis);" anzugeben? Ist es nicht Sinn und Zweck der Sache, dass eben alle Elemente mit dem Tag "Kreis" auf das Event reagieren? Und vor allem: Warum ist das "gerade beteiligte" das, das ich angeklickt habe? Im Übrigen: Wenn die Maustaste nicht gedrückt ist, reagieren ja auch ALLE Kreise auf <Enter> und <Leave> und nicht nur der, den ich vorher angeklickt habe.

Datum: 04.09.2005-11:46

Beitragre: <Motion> und <Enter>
Seitenanfang
Also so hatte ich die Tk::Canvas Doku zumindest verstanden... Hier die relevanten Auszuege:

ITEM IDS AND TAGS
..
The tag current is managed automatically by Tk; it applies to the current item, which is the topmost item whose drawn area covers the position of the mouse cursor. If the mouse is not in the canvas widget or is not over an item, then no item has the current tag.
..
Some methods only operate on a single item at a time; if tagOrId is specified in a way that names multiple items, then the normal behavior is for the methods is to use the first (lowest) of these items in the display list that is suitable for the method. Exceptions are noted in the method descriptions below.

Und die Beschreibung von bind besagt dazu:

$canvas->bind(tagOrId?, sequence? ?,callback?)
..
Enter and Leave events trigger for an item when it becomes the current item or ceases to be the current item; note that these events are different than Enter and Leave events for windows. Mouse-related events are directed to the current item, if any. Keyboard-related events are directed to the focus item, if any
..
If there are multiple matching bindings for a single tag, then only the most specific binding is invoked.

Datum: 07.09.2005-14:25

Beitragre: <Motion> und <Enter> - Nachtrag
Seitenanfang
Zur verdeutlichung warum das so ist:

Stell dir vor dein Canvas waere ein Multiline Text-Widget.

Stell dir weiter vor dein Kreis mit dem Tag "Kreis" waere ein Wort im Text des Text-Widgets mit dem Tag "Fett".

Wenn Du jetzt per Mausklick ein Contextmenu fuer ein Wort mit dem Tag "Fett" aufrufen willst und eine Funktion ausfuehrst, oder den fetten Text per Drag'n'Drop in einen anderen Absatz verschieben wuerdest, hast Du die gleiche Situation wie bei denen Kreisen.

Und da soll ja auch nur das eine Wort bearbeitet werden und nicht mit alle anderen die das gleiche Tag haben auch. Einzeloperationen werden halt viel oefter gebraucht, daher dieses verhalten.

Aber Du kannst doch in deinem Event-Handler immernoch mit $canvas->move(tagOrId, xAmount, yAmount) alle items verschieben, also eigentlich kein Problem, oder?

Datum: 07.09.2005-14:36

Beitragre: <Motion> und <Enter>
Seitenanfang
etwas code wäre nicht verkehrt...

Datum: 05.09.2005-09:34

-






-
-