Inhalt eines Treeviews als Kontextmenü anzeigen(Tipp drucken)



Ein Knoten in einem Treeview ist Teil des ganzen Baumes und hat einen Index, der sich auf seine Position im Baum bezieht. In einem Menü werden nur die Kinder der ersten Ebene als Teil betrachtet. Der Index beginnt dabei wieder von neuem mit 0.
TForm1 = class(TForm)
  //...
  private
    procedure OnPopupClick(Sender: TObject);
  // ...
  end;

implementation

procedure TForm1.OnPopupClick(Sender: TObject);
begin
  if (Sender is TMenuItem) then
    Treeview1.Selected := Treeview1.Items[(Sender as TMenuItem).Tag];
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  MI, MI1, MI2: TMenuItem;
  i, j: integer;
  vPos: integer;
  ActLevel: integer;
begin
  TreeView1.FullExpand;

  MI1 := nil;

  PopupMenu1.Items.Clear;
  ActLevel := 0;

  for i := 0 to TreeView1.Items.Count - 1 do
  begin
    MI := TMenuItem.Create(PopupMenu1);
    MI.Caption := TreeView1.Items[i].Text;
    MI.Tag     := i;
    MI.OnClick := OnPopupClick;

    if TreeView1.Items[i].Level = 0 then
    begin
      PopupMenu1.Items.Add(MI);
      MI2 := MI;
    end
    else
    begin
      if TreeView1.Items[i].Level = ActLevel then
      begin
        MI1 := MI2.Parent;
        MI1.OnClick := nil;
        MI1.Add(MI);
      end;
      if TreeView1.Items[i].Level > ActLevel then
      begin
        MI1 := MI2;
        MI1.Add(MI);
        MI1.OnClick := nil;
        MI2 := MI;
      end;
      if TreeView1.Items[i].Level < ActLevel then
      begin
        MI1 := MI2.Parent;
        for j := 0 to (ActLevel - TreeView1.Items[i].Level - 1) do
          MI1 := MI1.Parent;
        MI1.Add(MI);
        MI1.OnClick := nil;
        MI2 := MI;
      end;
    end;
    ActLevel := TreeView1.Items[i].Level;
  end;
end;