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

Поместить список контролов и пунктов меню в TTreeView

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

Поместить список контролов и пунктов меню в TTreeView

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

uses
   ComCtrls, Menus, Classes, Forms, Controls, Windows, Messages;

 function GetControlCaption(Control: TWinControl): ShortString;
   //  Slightly modified version of Twister's Tip 
  // 
  //  function GetCaptionAtPoint(pt: TPoint): string; 
  // 
var
   TextLength: Integer;
   Text: PChar;
 begin
   if not Boolean(Control.Handle) then Exit;

   Result := Control.Name;  //  if Control doesn't have Caption 
  //  Control.Name is returned 

  TextLength := SendMessage(Control.Handle, WM_GETTEXTLENGTH, 0, 0);
   if TextLength  0 then
   begin
     GetMem(Text, TextLength + 1);
     SendMessage(Control.Handle, WM_GETTEXT, TextLength + 1, Integer(Text));
     Result := Text;
     FreeMem(Text);
   end;
 end;

 //  function GetCaptionAtPoint(pt: TPoint): ShortString; 
//  begin 
//    Result:= GetControlCaption(FindVCLWindow(pt)); 
//  end; 


procedure FindAllMenuItems(AppTree: TTreeView; MenuItem: TMenuItem; Parent: TTreeNode);
 var
   loop: Integer;
   Node: TTreeNode;
   mItem: TMenuItem;
   Name: ShortString;
 begin
   for loop := 0 to MenuItem.Count - 1 do
   begin
     mItem := MenuItem.Items[loop];
     Name  := mItem.Caption;
     Node  := AppTree.Items.AddChildObject(Parent, Name, mItem);
     if mItem.Count  0 then findAllMenuItems(AppTree, mItem, Node);
   end;
 end;

 procedure FindAllControls(AppTree: TTreeView; Comp: TComponent; Parent: TTreeNode);
 var
   Child: TComponent;
   loop, start, Index: Integer;
   Name: ShortString;
   Node, Mnode: TTreeNode;
 begin
   start := 0;
   if Comp is TApplication then
   begin
     // Parent:= AppTree.Items.AddObjectFirst(Parent, 'Application', nil); 
    //  if you want to see the root ('Application') uncomment 
    start := 1;
   end;

   for loop := start to Comp.ComponentCount - 1 do
   begin
     Child := Comp.Components[loop];
     Name  := Child.Name;

     if Child is TControl then
     begin
       if Child is TWinControl then
       begin  //  does Child have Caption property?? 
        Name := GetControlCaption(TWinControl(Child));
       end;
       Node := AppTree.Items.AddChildObject(Parent, Name, Child);
       if Child.ComponentCount  0 then FindAllControls(AppTree, Child, Node);
     end;

     if Child is TMenu then
     begin
       Node := AppTree.Items.AddChildObject(Parent, Name, Child);
       for Index := 0 to TMenu(Child).Items.Count - 1 do
       begin
         Mnode := AppTree.Items.AddChildObject(Node, TMenu(Child).Items[Index].Caption,
           TMenu(Child).Items[Index]);
         FindAllMenuItems(AppTree, TMenu(Child).Items[Index], Mnode);
       end;
     end;
   end;
 end;

Перевод контента на русский язык:

Код Delphi, который пополняет TTreeView списком контролов и пунктов меню из приложения. Код состоит из двух процедур: FindAllControls и FindAllMenuItems.

Процедура FindAllControls

Эта процедура рекурсивно обходит компоненты заданного TComponent (например, формы или контрола) и добавляет его дочерние контролы в TTreeView. Она также проверяет, является ли каждый контроль TWinControl, и если да, то получает его заголовок с помощью функции GetControlCaption. Процедура использует следующую логику:

  1. Итерируемся по компонентам заданного TComponent.
  2. Для каждого компонента проверяем, является ли он TControl. Если да, то рекурсивно вызываем FindAllControls для этого контрола.
  3. Если контроль является TWinControl, получаем его заголовок с помощью GetControlCaption и добавляем его в TTreeView.
  4. Если контроль имеет дочерние компоненты, рекурсивно вызываем FindAllControls для этих детей.

Процедура FindAllMenuItems

Эта процедура пополняет TTreeView пунктами меню из заданного TMenuItem. Она использует следующую логику:

  1. Итерируемся по пунктам заданного TMenuItem.
  2. Для каждого пункта добавляем его заголовок в TTreeView как дочерний узел.
  3. Если пункт имеет подпункты, рекурсивно вызываем FindAllMenuItems для этих подпунктов.

Пример использования

Чтобы использовать этот код, создайте экземпляр TTreeView, например, AppTree, и затем вызовите FindAllControls или FindAllMenuItems, чтобы пополнить его контролами и пунктами меню из вашего приложения. Например:

var
  MyForm: TMyForm; // предположим, что это форма с контролами и пунктами меню
begin
  AppTree := TTreeView.Create(nil);
  FindAllControls(AppTree, MyForm, nil); // пополнить деревоview контролами
end;

Обратите внимание, что функция GetControlCaption используется для получения заголовка каждого контрола. Если контроль не имеет заголовка, то будет использоваться его имя.

Код хорошо структурирован и легко понятен, но есть несколько минорных проблем:

  1. Процедура FindAllMenuItems может быстрее работать с ошибками, если пункт имеет подпункты.
  2. Код предполагает, что все контролы и пункты меню имеют валидный заголовок или имя. Если не, то вам может потребоваться дополнительная обработка ошибок.

В целом, код хорошо написан и должен работать как ожидается с минимальными изменениями.

В статье описывается способ вывода списка контролов и пунктов меню на дерево элементов (TTreeView) в приложении на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по 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 16:57:18/0.0054609775543213/1