Sign in Join
Wiki copytemporary

TTreeView/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Añadir un nuevo elemento mediante código
22
33Se puede añadir un nuevo elemento mediante TTreeView.Items.AddChild o bien AddChildObject.
44
55## Crear un TreeView que carga elementos solamente cuando se expande
66
77Para añadir el símbolo de expansión a un nodo que no contiene subelementos escribimos la siguiente sentencia:
88
99``` pascal
1010MiNodo.HasChildren := True;
1111```
1212
1313Y establecemos un manejador de eventos para el evento OnExpanding. En este evento se debería retornar si se puede o no realizar la expansión y caso de que sea afirmativo se añadirían subelementos al nodo. Si la expansión no puede realizarse entonces desaparece automáticamente el símbolo de expansión incluso si previamente se ha establecido el valor de HasChildren a true.
1414
1515## Un pequeño ejemplo de uso de TTreeview
1616
1717Aquí tenéis un ejemplo rápido e informal - testeado en Lazarus 0.9.26 bajo Windows:
1818
1919Crear una nueva aplicación. En Form1 añadir un treeview vacío, un button1 con caption "Añadir hijo" y un button2 con caption "Borrar"
2020
2121Para los buttons' con su evento OnClick, asignar el siguiente código, compilar y ejecutar.
2222
2323Código:
2424
2525``` pascal
2626
2727procedure TForm1.Button1Click(Sender: TObject);
2828var
2929 i: integer;
3030 s: string;
3131begin
3232 // si no hay nodos, crear un nodo raíz con un padre establecido al valor Nil
3333 if TreeView1.Items.Count = 0 then
3434 begin
3535 Treeview1.Items.Add (nil,'Nodo Raíz');
3636 exit;
3737 end;
3838
3939 // Establer un texto simple para cada nuevo nodo: Nodo1 , Nodo2, etc
4040 i := treeview1.Items.Count; // Nos retorna la cuenta total de elementos.
4141 s := 'Nodo ' + inttostr(i); // Crea la cadena de texto 'Node ' más el número resultante de conversión de entero su
4242 // equivalente en texto.
4343 // Añade un nuevo nodo al nodo actualmente seleccionado.
4444 if TreeView1.Selected <> nil then // Si tenemos seleccionado un nodo entonces hacer lo siguiente.
4545 Treeview1.Items.AddChild(Treeview1.Selected ,s); // Añadir un elemento como hijo al actualmente seleccionado.
4646end;
4747
4848procedure TForm1.Button2Click(Sender: TObject);
4949
5050 // Un procedimiento para borrar nodos recursivamente.
5151 Procedure DeleteNode(Nodo:TTreeNode);
5252 begin
5353 while Nodo.HasChildren do DeleteNode(Nodo.GetLastChild); { mientras el nodo tenga hijos realizar borrado último nodo hijo }
5454 TreeView1.Items.Delete(Nodo) ; { borra nodo que ya no contiene nodos hijo }
5555 end;
5656
5757begin
5858 if TreeView1.Selected = nil then exit; // salir del borrado caso de que no tengamos seleccionado un nodo }
5959 // Si el nodo seleccionado tiene nodos hijo, primero preguntar por confirmación
6060 If treeview1.Selected.HasChildren then
6161 if messagedlg('¿Borrar nodo seleccionado y todos sus nodos hijo?',mtConfirmation,
6262 [mbYes,mbNo],0) <> mrYes then exit; // Muestra mensaje de confirmación de borrado (pulsadores Si/No), caso de que
6363 // la contestación sea diferente de Si, entonces sale del if sin borrar nodo.
6464 DeleteNode(TreeView1.Selected); // Borra el nodo actualmente seleccionado.
6565end;
6666```
6767
6868Cuando se ejecuta, el treeview está vacío,. Si se hace click en "Añadir hijo", se crea un nodo raíz. Después de esto se crea un nodo hijo en el nodo que tengamos seleccionado haciendo click en el pulsador "Añadir hijo".
6969
7070El pulsador Borrar lo que hace es borrar el nodo actualmente seleccionado. Si no tiene nodos hijo lo borrara inmediatamente, pero si los tiene preguntará primero para confirmar su borrado.
7171
7272## Liberando los datos del TreeNode
7373
7474Utilizar el evento OnDeletion de Treeview para liberar el objeto creado:
7575
7676``` pascal
7777
7878procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
7979begin
8080 TMyObject(Node.Data).Free; // Libera los recursos asignados al objeto (así dejamos memoria libre para otros objetos).
8181end;
8282```
8383
8484## Utilizando Drag y Drop (arrastrar y soltar) en un TreeView
8585
8686Si se quiere permitir la función de arrastrar y soltar en un treeview se necesita lo siguiente:
8787
88881. Establecer la propiedad "Drag Mode" de treeview al valor DmAutomatic.
89892. Crear un evento del tipo "OndragOver" (solapa de eventos en el inspector de objetos):
9090
9191``` pascal
9292procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
9393begin
9494 Accept := true;
9595end;
9696```
9797
9898Espero que esta información sea de ayuda. Adicionalmente podéis cargar el proyecto de ejemplo que acompaña a Lazarus (tv_add_remove.lpi) o bien ver el tutorial que se encuentra en <http://users.iafrica.com/d/da/dart/Delphi/TTreeView/TreeView.html>
9999
100100## Personalizando un TreeView
101101
102102Añado esta sección debido a una consulta en el foro sobre como cambiar el color del texto en un TreeView [1](http://forum.lazarus.freepascal.org/index.php/topic,30095.msg191058/topicseen.html#new).
103103
104104La respuesta del usuario **GetMem** es que se debe establecer el valor **tvoThemedDraw** a **False**, ya que por defecto vale **True**.
105105
106106En el Inspector de Objetos para TreeView dentro de las opciones disponibles lo encontramos en:
107107
108-<img src="treeviewoptions.png" title="treeviewoptions.png" width="450" />
108+![](/wiki-images/7/7e/Treeviewoptions.png)
109109
110110Aquí el resto de valores para las opciones que aparecen son los establecidos por defecto para un TreeView.
111111
112112De esta forma nos permite personalizar más el color de la fuente que de otra manera estando **tvoThemedDraw** establecido al valor **true** utiliza por defecto el color (y la fuente) que tenga el tema visual de escritorio en uso (la otra posibilidad es deshabilitar el tema).
113113
114114Esto se aplica a todos los nodos del TreeView, pero en caso de necesitar aplicar diferentes colores a los nodos el ejemplo que nos pone el usuario **molly** es:
115115
116116``` pascal
117117
118118 // En tiempo de creación del formulario establecemos tvoThemedDraw a false
119119 // y llenamos el TreeView con 10 elementos: item 1,item 2,....,item 10 (el índice comienza por 0 para item 1).
120120
121121 procedure TForm1.FormCreate(Sender: TObject);
122122
123123 var i:integer;
124124
125125 begin
126126
127127 TreeView1.Options := TreeView1.Options - [tvoThemedDraw];
128128
129129 For i := 1 to 10 do TreeView1.Items.Add(nil, 'item ' + IntToStr(i));
130130
131131 end;
132132```
133133
134134Y asignamos al evento **OnDrawItemEvent**:
135135
136136``` pascal
137137
138138 // En nuestro TreeView personalizado, chequeamos si su índice de nodo es par o impar.
139139 // y cambia el color de texto a rojo si es impar (odd) o a verde en caso contrario.
140140
141141 procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView;
142142
143143 Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
144144
145145 begin
146146
147147 with Sender as TCustomTreeView do
148148
149149 if odd(Node.Index)
150150
151151 then Canvas.Font.Color:= clRed
152152
153153 else Canvas.Font.Color:= clGreen;
154154
155155 end;
156156```
157157
158158Siendo el resultado:
159159
160-<img src="customtreeview.png" title="customtreeview.png" width="350" />
160+![](/wiki-images/c/c5/Customtreeview.png)
161161
162162---
163163*From the Free Pascal wiki, page "TTreeView/es", as it stood on 2020-03-02 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
164164Category: Components/es
165165Category: Tutorials/es

Back to history