Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   MouseEnter trotz MouseDown abfragen (https://www.delphipraxis.net/156609-mouseenter-trotz-mousedown-abfragen.html)

G-Baumstamm 8. Dez 2010 16:54

Delphi-Version: 5

MouseEnter trotz MouseDown abfragen
 
Joho :)

ich habe aus relativ vielen von TPanel abgeleiteten Komponenten eine Art Tabelle gebastelt. Jetzt würde ich gerne à-la Excel durch Ziehen der Maus mehrere dieser Zellen (also Panels) markieren, dafür muss ich meinen bereits implementierten Prozeduren nur noch sagen welche Zellen denn grade ausgewählt wurden.

Theoretisch hatte ich mir das so gedacht, dass ich im MouseDown jedes Panels eine Variable (zB MouseIstDown) auf true setze, die ich dann im MouseUp wieder auf false setze. Wenn dann MouseEnter von einem Panel aufgerufen wird und MouseIstDown = true gilt, soll die aktuelle Zelle in mein dynamisches Array eingetragen werden, welches die markierten Zellen enthält.

Das Problem ist aber, daas OnMouseEnter (ebenso wie OnMouseLeave) nicht ausgelöst werden, solange ich die Maus gedrückt, aber noch nicht wieder losgelassen hab. Ich hab auch durch manuellen Aufruf von OnMouseUp versucht Delphi zu täuschen, leider ist es nicht drauf reingefallen ...

Jetzt könnte ich natürlich solange MouseIstDown = true gilt in einem Timer die Cursorposition auslesen und die entsprechenden Zellen eintragen, irgendwie erscheint mir das aber ziemlich unsauber, außerdem führt das sicherlich zu unnötiger Systembelastung ...

Hat da jemand nen cooleren Vorschlag?

Danke :)

stahli 8. Dez 2010 18:22

AW: MouseEnter trotz MouseDown abfragen
 
Ich weiß nicht, ob MouseMove noch werkelt, wenn Du Dein ursprüngliches Control verlässt. Sonst könntest Du darüber die Position in Deiner "Tabelle" ermitteln.
Alternativ ginge es vielleicht auch mit DragOver zu arbeiten.

G-Baumstamm 9. Dez 2010 16:13

AW: MouseEnter trotz MouseDown abfragen
 
Mhmmm ... das ist seltsam :)

Du hast völlig Recht ... Mit dem DragOver gehts zwar nicht, das MouseMove arbeitet aber weiter. Ich hab mir das mal genauer angeschaut und bin zu folgendem Ergebnis gekommen: Während die Maus gedrückt ist dehnt Delphi virtuell den Bereich der Komponente auf den gesamten Bildschirm aus. D.h. Maus-Ereignisse anderer Komponenten (zB OnMouseEnter, OnMouseMove, OnMouseUp) werden nicht ausgelöst, dafür arbeitet zB MouseMove weiter, auch wenn ich mit dem Cursor die Komponente, ja sogar die Form, verlasse. Es ist übrigens egal über welcher Komponente ich die Maus wieder loslasse, das OnMouseUp geht immer an die Ausgangskomponente ...

Finde ich persönlich extrem unlogisch und hinderlich, wenn mans weiß kann man aber zumindest damit arbeiten ^^
Trotzdem muss ich jetzt über X und Y vom MouseMove die entsprechende Komponente, über der die Maus grade is, manuell berechnen, so wahnsinnig anders als der Timer den ich mir als Notlösung überlegt hatte isses also garnich mehr -.- ^^

Danke für die Hilfe ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz