Saya mencoba menyalin bagian dari Treeview ke menu popup, dan saya tidak beruntung sama sekali. Sepertinya saya tidak bisa menjalankan rekursi dan saya tahu saya mungkin melakukan semuanya dengan salah.
Ambil contoh gambar ini (yang merupakan screenshot runtime dari kode di bawah):
Saya perlu menu dibuat dengan hubungan yang sama dengan Treeview, tapi saya tidak ingin item Root ditambahkan. Inilah yang saya inginkan agar terlihat seperti ini:
Perhatikan bahwa item pertama bukanlah ikon pengaturan (Root), dan item tersebut berada pada level seperti Treeview.
Ini adalah kode yang saya miliki:
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.
Saya juga mencoba menambahkan properti Tag MenuItem sehingga saya dapat mengidentifikasi setiap item menu berdasarkan tagnya.
Saya pikir rekursi pada dasarnya berarti memanggil kembali prosedur dari dalam prosedur, jadi ini berulang, apa pun yang bisa saya lakukan dengan bantuan.
Terima kasih.