Я пытаюсь скопировать часть Treeview во всплывающее меню, и мне не повезло, я просто не могу заставить рекурсию работать, и я знаю, что я, вероятно, все это неправильно.Как скопировать часть Treeview в меню
Возьмите этот пример изображение (который является скриншотом выполнения из кода ниже):
мне нужно в меню должны быть создано с теми же отношениями, как Treeview, но я не хочу, Добавление корневого элемента. Это то, что я хочу, чтобы это выглядело как:
Обратите внимание на первый пункт не значок настройки (Root), и что они находятся в уровнях, как Treeview.
Это код, у меня есть:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
Menus, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
MenuItem1: TMenuItem;
PopupMenu1: TPopupMenu;
TreeView1: TTreeView;
procedure MyMenuItemClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
procedure TreeViewToMenu(TreeView: TTreeView; BaseNode: TTreeNode; OutMenu: TMenu);
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.MyMenuItemClick(Sender: TObject);
begin
ShowMessage('You selected ' + TMenuItem(Sender).Name + ' - Tag: ' +
IntToStr(TMenuItem(Sender).Tag));
end;
procedure TForm1.TreeViewToMenu(TreeView: TTreeView; BaseNode: TTreeNode; OutMenu: TMenu);
var
I: Integer;
MenuItem: TMenuItem;
begin
MenuItem := TMenuItem.Create(nil);
with MenuItem do
begin
Caption := BaseNode.Text;
ImageIndex := BaseNode.ImageIndex;
OnClick := @MyMenuItemClick;
end;
for I := 0 to BaseNode.Count - 1 do
begin
MenuItem.Tag := I;
TreeViewToMenu(TreeView, BaseNode[I], OutMenu);
end;
OutMenu.Items.Add(MenuItem);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Pt: TPoint;
I: Integer;
Node: TTreeNode;
begin
Pt.X := Button1.Left + 1;
Pt.Y := Button1.Top + Button1.Height + 1;
Pt := ClientToScreen(Pt);
PopupMenu1.Items.Clear;
TreeViewToMenu(TreeView1, TreeView1.Items[0], PopupMenu1);
PopupMenu1.Popup(Pt.X, Pt.Y);
end;
end.
Я также пытаюсь добавить к категории собственности MenuItem таким образом я могу определить каждый пункт меню его тега.
Я думал, что рекурсия в основном означала вызов процедуры снова изнутри процедуры, поэтому она повторяется, как бы я ни делал с некоторой помощью.
Спасибо.
При экспериментировании с созданием TMenuItems во время выполнения я нахожу ужасную проблему по мере того, как меню растет по размеру. Каждый вызов «Добавить» вызывает полную перестройку меню. Обходной путь с помощниками классов возможен, что устанавливает 'ComponentState = [csLoading]' избегая сотни перестроек меню. Дерево из 100 предметов будет в 100 раз медленнее, чем дерево из 10 элементов для создания и т. Д. O (N^2). –
@ Уоррен - Спасибо за это. У меня когда-то была аналогичная проблема - если я правильно помню, что было вызвано RethinkHotkeys, - что я не мог найти решение и изменил дизайн. –
+1 Это точно соответствует ситуации с ОП. Но он будет работать только тогда, когда есть этот главный корневой элемент. – NGLN