Watch, Follow, &
Connect with Us
Public Report
Report From: Delphi-BCB/FireMonkey/Components    [ Add a report in this area ]  
Report #:  110721   Status: Closed
TreeView drag over highlighted target is wrong
Project:  Delphi Build #:  17.0.4625.53395
Version:    17.0 Submitted By:   Mike Sutton
Report Type:  Basic functionality failure Date Reported:  11/22/2012 2:39:28 PM
Severity:    Serious / Highly visible problem Last Updated: 4/23/2013 8:01:41 AM
Platform:    All platforms Internal Tracking #:   33771
Resolution: Fixed (Resolution Comments) Resolved in Build: : XE4
Duplicate of:  None
Voting and Rating
Overall Rating: No Ratings Yet
0.00 out of 5
Total Votes: None
Description
When using drag/drop over a treeview, the target item under the mouse will be highlighted. But the highlighted item is only correct is Position = (0,0).

This is due to a call to AbsoluteToLocal on the point passed to the DragOver method.

P.S. This issue also affects the TCustomTreeView.DragDrop method.
Steps to Reproduce:
1. Add a TTreeView to a form.
2. Set it's Position to about (50,50);
3. Set AllowDrag := True;
4. Add a few TTreeViewItems.
5. Run.
6. Start a drag operation: Click an item to select, click it again to begin a drag.
7. Note that the highlighted item will be above the mouse position by the same amount as the tree views Position.Y, and no item will be highlighted if the mouse is less than Position.X pixels from the left of the treeview.
Workarounds
I have a component which fixes this and other FireMonkeyTTreeView drag/drop bugs at http://monkeystyler.com/blog/entry/fixing-drag-and-drop-in-a-firemonkey-tree-view
Attachment
TreeViewDropTarget.zip
Comments

Steffen Friedrich at 1/3/2013 10:12:44 AM -
Beim Update 1 wurde nicht das Problem in "procedure TCustomTreeView.DragOver" gelöst, hier wird der Point einfach mit AbsoluteToLocal umgewandelt, obwohl die Daten richtig übergeben werden an die Methode. Soll heißen die Umwandlung ist hier ein Bug der dazu führt, das kein Eintrag unter dem Mousecursor (bei AllowDrag = True) ausgewählt werden kann. Nur wenn die Baumansicht auf der Form ganz oben liegt, dann stimmen die Point Daten überein.

Hier sollte die Codezeile

P := AbsoluteToLocal(Point);  

in

P:=Point;

geändert bzw. entsprechend angepasst werden, dann gibt es das Probleme nicht mehr.


dito bei procedure TCustomTreeView.DragDrop

Server Response from: ETNACODE01