При работе с компонентом TTreeView в Delphi для создания вертикального меню, зачастую возникает необходимость переноса событий и атрибутов из TMainMenu. Одна из распространенных задач - это получение имени ассоциированного TMenuItem при клике по узлу дерева.
Проблема
Разработчик сталкивается с проблемой, когда ему необходимо получить имя ассоциированного TMenuItem при клике на узел TTreeView. Пример кода, который должен был вывести имя, возвращает пустую строку.
procedure TForm1.TreeViewClick(Sender: TObject);
begin
if Assigned ((Sender as TTreeView).Selected) then
begin
TMenuItem ((Sender as TTreeView).Selected.Data).Click;
TMenuItem ((Sender as TTreeView).Selected.Data).Name; // Имя пустое
end;
end;
Решение
Проблема заключается в том, что при создании узлов для TTreeView необходимо передать в метод AddChildObject все три обязательных аргумента: родительский узел, текст узла и ссылка на TMenuItem. В примере кода, предоставленного разработчиком, отсутствует третий аргумент, который необходим для сохранения ссылки на TMenuItem.
Исправленный код:
procedure CopyMenuToTreeView( aMenu: TMenu; aTreeView: TTreeView );
procedure AddItems( anItem: TMenuItem; aParentNode: TTreeNode );
var
node: TTreeNode;
i: Integer;
begin
for i := 0 To anItem.Count - 1 do begin
node := aTreeView.Items.AddChildObject(
aParentNode,
anItem.Items[i].Caption,
anItem.Items[i]);
AddItems( anItem.Items[i], node );
end;
end;
begin
Assert( Assigned( aTreeView ), 'No treeview' );
aTreeView.Items.BeginUpdate;
try
aTreeView.Items.Clear;
if Assigned( aMenu ) then
AddItems( aMenu.Items, nil );
aTreeView.FullExpand;
finally
aTreeView.Items.EndUpdate;
end;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var
MenuItem : TMenuItem;
begin
if Assigned ((Sender as TTreeView).Selected) then begin
MenuItem := TMenuItem((Sender as TTreeView).Selected.Data);
MenuItem.Click;
ShowMessage(MenuItem.Name);
end;
end;
При клике на узел дерева, теперь можно получить имя ассоциированного TMenuItem и использовать его в дальнейшей обработке событий.
Пример кода для DFM файла
object Form1: TForm1
// Описание компонентов формы
object TreeView1: TTreeView
Left = 16
Top = 24
Width = 205
Height = 257
Indent = 19
TabOrder = 0
OnClick = TreeView1Click
end
// Остальные компоненты формы
end
В данном примере разработчик использовал Delphi 10.4.1, где был успешно протестирован и исправлен код. Важно внимательно следить за аргументами метода AddChildObject, чтобы избежать подобного рода ошибок в будущем.
Вопрос касается разработки вертикального меню с использованием компонента `TTreeView` в среде Delphi, где необходимо правильно перенести события и атрибуты из `TMainMenu`, с акцентом на получение имени ассоциированного `TMenuItem` при
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.