当动态重新定义快捷方式时,删除键会删除整个树视图

时间:2014-07-08 10:40:53

标签: delphi treeview shortcut vcl

我有以下代码:

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
  m: TMenuItem;
begin
  // Here, some dynamic stuff is done, so every node gets individual items in the mainmenu
  Node1.Clear;

  m := TMenuItem.Create(Self);
  m.Caption := 'Delete';
  m.ShortCut := VK_DELETE;
  m.OnClick := AcDelete;
  Node1.Add(m);
end;

procedure TForm1.AcDelete(Sender: TObject);
begin
  if not Assigned(TreeView1.Selected) then Exit;
  TreeView1.Selected.Delete;
end;

procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  // Only when I do this, the "Del"-key-loop will break. But then, the new
  // selected item won't get new menu individual items.
  // TreeView1.OnChange := nil;
end;

在表单中有一个TMainMenu和一个TTreeView

只要在树视图中选择了某些内容,就会为每个节点创建一个单独的菜单。此创建的菜单通常包括“删除节点”,其中包含快捷方式[Del]。但是,这也必须动态创建。

当我按下[Del]键时,AcDelete删除该项目,当然会选择关注节点。由于选择了关注节点,因此会调用TreeView1Change来创建新的单个菜单。在那之前一切都很好。

问题是,VCL仍然认为按下了[DEL]键,因此也会删除跟随节点。还有它的追随者。依此类推,直到整个列表为空。因此,使用[Del]键删除一个项目会删除所有内容。当然,当我使用鼠标时,这不会发生。

创建新菜单后,如何告诉VCL不再按下[Del]键?我可以在TreeView1Deletion中做一些解决方法吗?


DFM代码:

object Form1: TForm1
  Left = 192
  Top = 107
  Width = 1305
  Height = 750
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object TreeView1: TTreeView
    Left = 128
    Top = 56
    Width = 233
    Height = 193
    Indent = 19
    TabOrder = 0
    OnChange = TreeView1Change
    OnDeletion = TreeView1Deletion
    Items.Data = {
      04000000220000000000000000000000FFFFFFFFFFFFFFFF0000000000000000
      09323334323334323334210000000000000000000000FFFFFFFFFFFFFFFF0000
      0000000000000832336173647361641F0000000000000000000000FFFFFFFFFF
      FFFFFF0000000000000000067274656574721E0000000000000000000000FFFF
      FFFFFFFFFFFF0000000000000000053333333333}
  end
  object MainMenu1: TMainMenu
    Left = 88
    Top = 80
    object Node1: TMenuItem
      Caption = 'Node'
    end
  end
end

1 个答案:

答案 0 :(得分:1)

添加1个动作DeleteAction:分配了快捷方式的TAction(DEL)。改变这样的代码:

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
  m: TMenuItem;
begin
  // Here, some dynamic stuff is done, so every node gets individual items in the mainmenu
  Node1.Clear;

  m := TMenuItem.Create(Self);
  m.Caption := 'Delete';
  m.Action := DeleteAction;
  DeleteAction.OnExecute := AcDelete;
  Node1.Add(m);
end;

procedure TForm1.AcDelete(Sender: TObject);
begin
  if not Assigned(TreeView1.Selected) then Exit;
  TreeView1.Selected.Delete;
end;

procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  // Only when I do this, the "Del"-key-loop will break. But then, the new
  // selected item won't get new menu individual items.
  // TreeView1.OnChange := nil;
end;

它应该有用(因为我们不再在运行时创建具有相同快捷方式的项目)。