Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2013, 17:34   #1
Wizard_Adeptus
 
Аватар для Wizard_Adeptus
 
Регистрация: 06.02.2007
Сообщений: 8
Печаль Delphi, TreeView, иерархия классов

Здравствуйте. У меня совсем нет опыта. Подскажите пожалуйста, наставьте, так сказать, на путь истинный.
Задача: Создать две закладки PageControl с деревьями TreeView.
1) Элементы управления
1.jpg

2) Иерархия классов
2.jpg

На закладке «Элементы управления» показать иерархию расположения объектов формы. Иерархию отобразить в виде дерева с помощью компонента TTreeView. Для текущего узла дерева справа в StringGrid показывать его свойства (Name, Type, Top, Left, Width, Hight). Т. е. в дереве должны быть те обьекты, которые используются в данной программе.

На закладке «Иерархия классов» отобразить иерархию классов, использованных для создания объектов формы. Иерархию отобразить в виде дерева с помощью компонента TTreeView. Для текущего узла дерева справа показывать размер его объектов в байтах.

Вопросы: Откуда черпать эти "элементы управления"? Как это выглядит в коде, хотя бы примерно? На какое событие можно/лучше привезать формирование этого дерева, на TForm1.FormCreate? Те же вопросы по «иерархии классов». Или подскажите где можно покопать на эту тему.
Перерыл много интернета, нашел лишь не глубокие темы по TreeView.

Последний раз редактировалось Wizard_Adeptus; 14.05.2013 в 17:49. Причина: Дополнение заголовка
Wizard_Adeptus вне форума Ответить с цитированием
Старый 20.05.2013, 11:47   #2
Wizard_Adeptus
 
Аватар для Wizard_Adeptus
 
Регистрация: 06.02.2007
Сообщений: 8
Хорошо Задача решена.

Оказалось, нужно было делать так:

Код:
procedure TForm1.AddSubNodes(Node: TTreeNode; Cntrl: TControl);
var
  i: integer;
  NewNode: TTreeNode;
  s: String;
  MyClass: TClass;
begin
  //Создание узла соответствующего элементу управления Cntrl
  If Cntrl.Name = '' then
    s := '<без имени>'
  else
    s := Cntrl.Name;

  NewNode := TreeView1.Items.AddChildObject(Node, s, Cntrl);
  //Добавить в дерево иерархии классов узел для класса Cntrl
  MyClass := Cntrl.ClassType; // Получение ссылки на класс
  AddClass(MyClass); //Добавление класса в дерево иерархии классов

  //если элемент управления типа TWinControl, то он может содержать другие элементы
  //управления, которые необходимо включить в дерево
  If Cntrl is TWinControl then
    With (Cntrl as TWinControl) do
    //Посторение фрагмента дерева элементов управления, непосредственно подчиненных
    //элементу управления Cntrl
      For i := 0 to ControlCount - 1 do begin
        AddSubNodes(NewNode, Controls[i] as TControl);
      end;
end;

function TForm1.GetNode(ClassName: string): TTreeNode;
var
  Node1: TTreeNode;
begin
  //Поиск узла, соответствующего классу
  Result := nil; //Не найден
  //Поиск узла в дереве
  Node1 := TreeView2.Items.GetFirstNode;
  While Node1 <> nil do begin
    If Node1.Text = ClassName then begin
      Result := Node1;
      Exit;
    end;
    Node1 := Node1.GetNext;
  end;
end;

function TForm1.AddClass(NewClass: TClass): TTreeNode;
var
  ParentNode: TTreeNode;
begin
  //поиск узла класса в дереве
  Result := GetNode(NewClass.ClassName);
  If Result = nil then begin //Если класс не найден
    If NewClass.ClassParent <> nil then begin
      //Поиск родителя и добавления, если узел родительского класса не найден
      ParentNode := AddClass(NewClass.ClassParent);
      //Добавление нового класса
      Result := TreeView2.Items.AddChildObject(ParentNode, NewClass.ClassName, Pointer(NewClass));
    end else
      //Добавление нового класса как корнего узла
      Result := TreeView2.Items.AddChildObject(nil, NewClass.ClassName, Pointer(NewClass));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddSubNodes(nil, Form1);
  With StringGrid1 do begin
    DefaultColWidth := 260;
    DefaultRowHeight := 24;
    ColCount := 2;
    RowCount := 14;
    Cells[0, 0] := 'Name';
    Cells[0, 1] := 'Type';
    Cells[0, 2] := 'Size';
    Cells[0, 3] := 'Top';
    Cells[0, 4] := 'Left';
    Cells[0, 5] := 'Width';
    Cells[0, 6] := 'Height';
  end;
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  With StringGrid1 do begin
    Cells[1, 0] := TControl(Node.Data).Name;
    Cells[1, 1] := TControl(Node.Data).ClassType.ClassName;
    Cells[1, 2] := IntToStr(TControl(Node.Data).ClassType.InstanceSize) + ' байт';
    Cells[1, 3] := IntToStr(TControl(Node.Data).Top) + ' pixl';
    Cells[1, 4] := IntToStr(TControl(Node.Data).Left) + ' pixl';
    Cells[1, 5] := IntToStr(TControl(Node.Data).Width) + ' pixl';
    Cells[1, 6] := IntToStr(TControl(Node.Data).Height) + ' pixl';
  end;
end;

procedure TForm1.TreeView2Change(Sender: TObject; Node: TTreeNode);
begin
  Label5.Caption := 'Класс: ' + TClass(Node.Data).ClassName;
  Label6.Caption := 'Размер объекта: ' + IntToStr(TClass(Node.Data).InstanceSize) + ' байт';
end;
Сам бы не догадался.
Тему можно перенести в раздел Delphi, может кому-то пригодится.
Wizard_Adeptus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ИЕРАРХИЯ КЛАССов DEVU Помощь студентам 2 15.05.2012 08:17
Иерархия классов К_С_Ю Помощь студентам 1 19.04.2012 02:39
Иерархия классов на C++ Владилена Помощь студентам 1 08.04.2012 23:21
иерархия классов Freek123 Фриланс 3 28.10.2011 09:14
Иерархия классов lirikoff Помощь студентам 7 21.10.2010 23:51