Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Верткальное Меню с TTreeView в Delphi: Перенос Событий и Атрибутов

Delphi , Компоненты и Классы , TTreeView

При работе с компонентом 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TTreeView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 11:00:19/0.0059847831726074/0