Entwickler-Ecke

Windows API - delphi eigene Messagehandler debuggen


retnyg - Sa 29.01.05 18:54
Titel: delphi eigene Messagehandler debuggen
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 Click(sender: tobject); override;
    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.


Delphi-Quelltext
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
{    getcursorpos(p);
    tgmsg.hwnd :=handle;
    tgmsg.message := WM_LBUTTONDOWN;
    tgmsg.wParam := msg.Wparam;
    tgmsg.lParam :=msg.LParam;
    tgmsg.time := gettickcount;
    tgmsg.pt := p;           }

//    inherited click;
//    getmessage(tgMsg,handle,0,0);
//    DispatchMessage(tgMsg);
//    click;
    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, 0000);
   mouse_event(MOUSEEVENTF_LEFTUP, 0000);
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.


Sprint - Sa 29.01.05 19:12
Titel: Re: delphi eigene Messagehandler debuggen
retnyg hat folgendes geschrieben:
ich versuche grade einer eigenen TreeViewKomponente ein Popupmenu bei einem Rechtsklick zuzuweisen. Hierzu fange ich die Message WM_RBUTTONDOWN ab.

Warum benutzt du nicht die Eigenschaft PopupMenu?

Zitat:
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.

Häckchen bei Menüleiste--->Projekt--->Optionen--->Compiler--->Mit Debug-DCUs


retnyg - Sa 29.01.05 19:38

gracias :)


retnyg - So 30.01.05 16:56

hmmmm....wie auch immer ich das mache, wird bei einem rechtsklick immer das popupmenu auf den selektierten eintrag bezogen.
da mit rechtsklick aber nichts selektiert wird, muss man jetzt also immer zuerst links, dann rechts klicken...was mir nicht gefällt. deswegen ackere ich mich gerade durch die WndProcs von Delphi...dazu hätte ich noch eine frage, und zwar werden meine änderungen in der classes.pas vom compiler einfach ignoriert, sieher hier http://www.delphi-forum.de/viewtopic.php?p=212180#212180 .
wäre nett wenn du da mal nen blick drauf werfen könntest ^^