I STRONGLY DISAGREE with you on this issue.
The wrong order is peculiar to TListView. It follows the order of
1) OnSelectItem of unselected item
2) OnSelectItem of selected item
3) OnExit of previously focused control (if Listview itself was not focused)
4) OnEnter of ListView itself.
Think of a situation. I did some editing on Edit1. And I want to save the content of Edit1 to another variable within Edit1Exit procedure, and fill in the Edit1 with new value (for example, ListView1.SubItems[2].Text) at the moment of clicking any listview item. If thing happen in the above order, the Edit1 content will be filled with new value (by ListView1SelectItem) before saved to a variable (by Edit1Exit procedure).
Treeview is different. Here,
1) Other control's OnExit
2) Treeview OnEnter
3) Treeitem OnChanging
4) Treeview OnSelectionChange
5) Treeitem OnChange
This is right and normally expected order.
Still there is a bug. In Treeview's OnChanging event, this should happen to a treenode which is about to be "UNSELECTED". Currently newly SELECTED node is passed as a parameter both in OnChanging and OnChange methods.
I had to rewrite some procedures when I transformed Delphi program to Lazarus. In Delphi, I can finish works on previous node at OnChanging, and then fill the controls on the form with values of newly selected node (at OnChange event). This is not possible in Lazarus.