我想实现:在TTreeView中右键单击某一节点,弹出快捷菜单,对节点进行操作,可是这时节点并未被选中,因此不知道哪一个TTreeNode被单击。
如何实现?能否实现?

解决方案 »

  1.   

    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var node: TTreeNode;
    begin
      if Button = mbRight then
      begin
        sendMessage(TreeView1.Handle,WM_LBUTTONDOWN,0,MakeLong(x,y));
      end;
    end;
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, Menus;type
      TForm1 = class(TForm)
        MainMenu1: TMainMenu;
        file1: TMenuItem;
        select1: TMenuItem;
        showroot1: TMenuItem;
        showbtn1: TMenuItem;
        showline1: TMenuItem;
        close1: TMenuItem;
        TreeView1: TTreeView;
        procedure showroot1Click(Sender: TObject);
        procedure showbtn1Click(Sender: TObject);
        procedure showline1Click(Sender: TObject);
        procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure close1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.showroot1Click(Sender: TObject);
    begin
      TreeView1.ShowRoot:=not TreeView1.ShowRoot;
      showRoot1.Checked:=TreeView1.ShowRoot;
    end;procedure TForm1.showbtn1Click(Sender: TObject);
    begin
      TreeView1.ShowButtons:=not TreeView1.ShowButtons;
      ShowBtn1.Checked:=TreeView1.ShowButtons;
    end;procedure TForm1.showline1Click(Sender: TObject);
    begin
      TreeView1.ShowLines:=not TreeView1.ShowLines;
      showline1.Checked:=TreeView1.ShowLines;
    end;procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      TreeView1.BeginDrag(False);
    end;procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    var
      TargetNode,SourceNode:TTreeNode;
    begin
      TargetNode:=TreeView1.GetNodeAt(X,Y);
      if (Source=Sender) and (TargetNode<>nil) then
        begin
          Accept:=true;
          SourceNode:=TreeView1.Selected;
          while (TargetNode.Parent<>nil) and (TargetNode<>SourceNode) do
            TargetNode:=TargetNode.Parent;
          if TargetNode=SourceNode then
            Accept:=False;
        end
      else
        Accept:=False;
    end;procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      TargetNode,SourceNode:TTreeNode;
    begin
      TargetNode:=TreeView1.GetNodeAt(X,Y);
      if TargetNode<>nil then
        begin
          SourceNode:=TreeView1.Selected;
          SourceNode.MoveTo(TargetNode,naAddChildFirst);
          TargetNode.Expand(False);
          TreeView1.Selected:=TargetNode;
        end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      TreeView1.LoadFromFile(ExtractFilePath(Application.ExeName)+'TreeText1.txt');
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      TreeView1.SaveToFile(ExtractFilePath(Application.ExeName)+'TreeText1.txt');
    end;procedure TForm1.close1Click(Sender: TObject);
    begin
      close;
    end;end.
      

  3.   

    procedure TfrmMain.TreeView1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      CurrNode: TTreeNode;
    begin
      if Button = mbRight then
      begin
        CurrNode := TreeView1.GetNodeAt(X, Y);
        if CurrNode <> nil then
          TreeView1.Selected := CurrNode;
      end;
    end;看來, fengjn(小枫) 兄的更簡單。