Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Crear Un Object Tree View (https://www.clubdelphi.com/foros/showthread.php?t=48120)

mightydragonlor 16-09-2007 01:23:51

Crear Un Object Tree View
 
Hola a todos, deseo saber como puedo insertar en un Tree View los Controles y sus Componentes existentes en un Formulario, como lo hace el object Tree View, lo que pasa es que puedo listarlos todos en un tree view pero no puedo hacer que queden como nodos los Controles y como subnodos los componentes, ¿alguien puede ayudarme?.

xEsk 16-09-2007 02:53:10

Si no he entendido mal, tú quieres mostrar en un TreeView todos los controles que hay en un formulario (como en el Delphi (Structure)), y que estos estén anidados correspondientemente (Padre -> Hijo -> SubHijo -> Etc...):

Te he hecho este código, que creo que realiza lo que tu buscas:

Código Delphi [-]
procedure TForm1.AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
var
  n: Integer;
  lNode: TTreeNode;

begin
  if ParentControl is TWinControl then
    for n:=0 to TWinControl(ParentControl).ControlCount - 1 do
      begin
        lNode:=TreeView1.Items.AddChild(ParentNode, Format('%s: %s', [TWinControl(ParentControl).Controls[n].Name, TWinControl(ParentControl).Controls[n].ClassName]));
        AddSubControls(lNode, TWinControl(ParentControl).Controls[n]);
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  AddSubControls(TreeView1.Items.Add(nil, Format('%s: %s', [Self.Name, Self.ClassName])), Self);
end;

Lo he probado, añadiendo un montón de TPanels, TGroupBox, etc... y funciona bien.

Este es el resultado de un Formulario de prueba, para probar que funciona:
Código:

Form1: TForm1
        Panel1: TPanel
                Button1: TButton
                Edit1: TEdit
                ListBox1: TListBox
        GroupBox1: TGroupBox
                Panel2: TPanel
                        Button2: TButton
                Button3: TButton
        TreeView1: TTreeView
        Edit2: TEdit
        Panel3: TPanel
                Panel4: TPanel
                        Memo1: TMemo
                        GroupBox2: TGroupBox
                                Label2: TLabel
                        Button4: TButton
                Panel5: TPanel
                        Label1: TLabel
                        RadioGroup1: TRadioGroup
                        ListBox2: TListBox

Esto es lo que se genera dentro del "TreeView".

Saludos.

mightydragonlor 16-09-2007 04:02:45

Muchas Gracias xEsk, la verdad es que me es de gran ayuda.:D
y tambien tengo otra duda, como puedo hacer para que los componentes en run time parezcan como en tiempo de diseño (crear, arrastrar y cambiar tamaño).

xEsk 16-09-2007 05:21:02

Prueba buscando "Form Designer" en Google, Torry's, etc...

Mira aqui, a ver si encuentras algo util: "Form Designer" en Torry's

Saludos.

esocrates 16-09-2007 16:12:10

Estoy tratando de estudiar el código aportado por xEsk pero no entiendo dónde debo escribir la primera parte del mismo:
Código Delphi [-]
procedure TForm1.AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
var
  n: Integer;
  lNode: TTreeNode;

begin
  if ParentControl is TWinControl then
    for n:=0 to TWinControl(ParentControl).ControlCount - 1 do
      begin
        lNode:=TreeView1.Items.AddChild(ParentNode, Format('%s: %s', [TWinControl(ParentControl).Controls[n].Name, TWinControl(ParentControl).Controls[n].ClassName]));
        AddSubControls(lNode, TWinControl(ParentControl).Controls[n]);
      end;
end;
Recibo el siguiente mensaje de error
Undeclared identifier: 'AddSubControls'

Muchas gracias por la ayuda y disculpen mi ignorancia.
Un saludo y hasta pronto

xEsk 16-09-2007 16:43:51

Hola esocrates,

Añade:
Código Delphi [-]
procedure AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
arrriba en las declaraciones del TForm:

Ejemplo:
Código Delphi [-]
  TForm1 = class(TForm)
    procedure Button1Click(Sender: TObject);
  private
    procedure AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
  public
    { Public declarations }
  end;
Si lo pones en "Private", este procedure será sólo visible desde este "Form", si lo metes en "Public" entonces será visible para el resto de unidades (que conozcan a esta UNIT).

Cualquier otra duda, ya sabes.

Saludos.

esocrates 16-09-2007 17:00:32

Hola xEsk:
Gracias por responder.Lo que no sé es dónde se escribe este segmento de código.
Código Delphi [-]
procedure TForm1.AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
var
  n: Integer;
  lNode: TTreeNode;

begin
  if ParentControl is TWinControl then
    for n:=0 to TWinControl(ParentControl).ControlCount - 1 do
      begin
        lNode:=TreeView1.Items.AddChild(ParentNode, Format('%s: %s', [TWinControl(ParentControl).Controls[n].Name, TWinControl(ParentControl).Controls[n].ClassName]));
        AddSubControls(lNode, TWinControl(ParentControl).Controls[n]);
      end;
end;
Un saludo

dec 16-09-2007 17:17:23

Hola,

Ese código es la implementación del método "AddSubControls()" de la clase "TForm1". Eso es lo que puede verse. Así que ese código ha de ir en la "implementation" de la unidad en que se declare la clase a la que pertenece y el mismo método.

Código Delphi [-]
unit Unit1;

interface

// Esta es la interface de esta unidad, aquí vamos a declarar
// la clase TForm1, que cuenta con el método "AddSubControls()"

uses
  Forms;

type
  TForm1 = class(TForm)
  private
    procedure AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
  end;

implementation

// Y aquí está la implementación de la clase TForm1 declarada en la interface
// Aquí se implementa el método "AddSubControls()" de la clase TForm1

procedure TForm1.AddSubControls(ParentNode: TTreeNode; ParentControl: TControl);
var
  n: Integer;
  lNode: TTreeNode;

begin
  if ParentControl is TWinControl then
    for n:=0 to TWinControl(ParentControl).ControlCount - 1 do
      begin
        lNode:=TreeView1.Items.AddChild(ParentNode, 
         Format('%s: %s', [TWinControl(ParentControl).Controls[n].Name, 
          TWinControl(ParentControl).Controls[n].ClassName]));
        AddSubControls(lNode, TWinControl(ParentControl).Controls[n]);
      end;
end;

end.

esocrates 16-09-2007 17:53:22

¡¡Muchas gracias xEsk y dec !!
Con este código y las respectivas aclaraciones he aprendido un montón de cosas.
Un saludo y hasta pronto


La franja horaria es GMT +2. Ahora son las 19:41:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi