ich versuche grade einer eigenen TreeViewKomponente ein Popupmenu bei einem Rechtsklick zuzuweisen. Hierzu fange ich die Message WM_RBUTTONDOWN ab.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| TRTreeView = class (TTreeview) private redirected : boolean; procedure WMRBUTTONUP(var Msg: TMessage); message WM_RBUTTONDOWN; procedure WMLBUTTONDOWN(var Msg: TMessage); message WM_LBUTTONDOWN; end; |
damit das richtige item in der Treeview selektiert wird, versuche ich nun als erstes einen Linksklick zu simulieren, damit der Delphi-eigene Messagehandler das zur Mausposition gehörige item selektiert.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure TRTreeView.WMLBUTTONDOWN(var Msg: TMessage);; var i :integer; p : tpoint; tgmsg : tagMSG; begin
if redirected then for i := 1 to Items.Count do if Items.Item[i].Selected then begin tag := i; getcursorpos(p); form1.popupmenu1.Popup(p.x,p.y); exit; end; redirected := false; end;
procedure TRTreeView.WMRBUTTONUP(var Msg: TMessage); begin redirected := true; mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); end;
procedure TForm1.FormShow(Sender: TObject); begin showwindow(handle,SW_MAXIMIZE); treeview1 := TRTreeview.Create(Form1); treeview1.Parent := Tabsheet3; treeview1.Align := alclient; end; |
anschliessend soll sich nun für das selektierte item das Popup öffnen. ich habe nun versucht einen boolean zu setzen anhand derer dann der eigene Handler für das WM_LBUTTONDOWN erkennt, ob es ein simulierter (also durch das RBUTTONDOWN geschickt) oder ein echter klick war.
sobald ich den handler aber setze wird der Klick nicht mehr an die ursprünglichen Messagehandler von TTreeview weitergeleitet...
Kann ich nun dem Debugger irgendwie beibringen, dass ich auch die eingebundenen VCL-Units debuggen kann ?
dann könnte ich nachsehen was eigentlich bei dem Event WM_LBUTTONDOWN passiert.