Autor Beitrag
retnyg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Sa 29.01.05 18:54 
ich versuche grade einer eigenen TreeViewKomponente ein Popupmenu bei einem Rechtsklick zuzuweisen. Hierzu fange ich die Message WM_RBUTTONDOWN ab.

ausblenden 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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 29.01.05 19:12 
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

_________________
Ciao, Sprint.
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: Sa 29.01.05 19:38 
gracias :)
retnyg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2754

SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
BeitragVerfasst: 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 www.delphi-forum.de/....php?p=212180#212180 .
wäre nett wenn du da mal nen blick drauf werfen könntest ^^