 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Mie 10 May, 2006 10:07 pm Asunto: Pasar un list<AnsiString> a un TTreeView |
|
|
Quiero hacer una función que me devuelva un std::list<AnsiString> con la intención de pasar su contenido a un TTreeView.
Me surgen dos cuestiones:
1: Para que la función devuelva lo que quiero ¿debo definirla como la he escrito antes o tipo puntero?. Algo así como std::list<AnsiString>*.
2:¿Cómo puedo trasladar el contenido del list<AnsiString> al TTreeView?.
¿Hay algo parecido a: LoadFromFile?. Esto último lo he probado y funciona muy bien.
Gracias. |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Jue 11 May, 2006 4:43 pm Asunto: |
|
|
Hola,
Si deseas utilizar una lista de cadenas, tienes la clase StringList. Es muy facil de utilizar.
Pero no se si preguntas esto. Si quieres que te amplie la informacion dimelo.
Un saludo. |
|
| Volver arriba |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Jue 11 May, 2006 5:25 pm Asunto: No es exactamente eso |
|
|
Primero Gracias por ayudar.
Lo que quiero es rellenar un TreeView con una lista de AnsiString que genero durante la ejecucion del programa.
De momento tengo esa lista en una <list> de la STL.
Lo que pasa es que podría almacenarlas en la StringList que me sugieres.
Luego viene cuando intento cargar el TreeView con dicha lista.
Y aquí me pierdo.
No se como hacer que TreeView admita dicha lista, bien directamente o bien a través de un TMemoryStream y luego hacer:
TreeView->LoadFromStream(TMemoryStream)
En este último caso me pasa lo mismo.
No se como pasar la lista al TMemoryStream.
Si puedes decirme como hacerlo, no sabes como te lo agradecería.
Saludos |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Jue 11 May, 2006 8:02 pm Asunto: |
|
|
Sobre el StringList.
int Add (AnsiString) # Añade una cadena a la lista.
void Clear () # Vacía la lista
void Delete (int index) # Suprime la lista en index-esima posición.
void Exchange (int n1, int n2) # Intercambia dos cadenas de la lista
int IndexOf (AnsiString s) # Devuelve la posición de una cadena
void Insert (int index, AnsiString s) # Inserta la cadena s en index-esima posición. Las cadenas siguientes se desplazan un rango
void Move (int CurrIndex, int newIndex) # Desplaza una cadena en la lista.
void Sort() # Ordena una lista
bool Find (AnsiString s, int index) # Busca la cadena s en la lista, indicando su posición
int Count # Devuelve el numero de elementos de la lista
void SaveToFile (AnsiString fichero) # Guarda la lista en un fichero
void LoadFromFile(AnsiString fichero) # Carga la lista desde un fichero
Para utilizarla lo primero es crear la lista, por ejemplo:
TStringList *mi_lista = new TStringList;
Otra forma seria:
TStringList *mi_lista; // En el fichero de cabecera
mi_lista = new TStringList; // En el fichero .cpp
Podemos borrarla: mi_lista->Clear();
Añadir elementos: mi_lista->Add(“elemento1”);
Conocer cuantos elementos hay: cantidad = mi_lista->Count;
Ordenar la lista: mi_lista->Sort();
Para seleccionar un elemento de la lista:
AnsiString cadena;
cadena = mi_lista->Strings[0];
// Entre corchetes indicamos cual queremos. El primer elemento es el 0.
Podemos guardar la lista en un fichero: mi_lista->SaveToFile("datos.txt");
y cargarlos desde el fichero: mi_lista->LoadFromFile("datos.txt");
Por ultimo no debemos olvidarnos de eliminar la variable cuando no nos haga falta:
delete mi_lista;
Sobre TreeView
Para crea un elemento en fase de ejecución, en el primer nivel basta con:
| Código: |
TreeView1->Items->Add(NULL, "Prueba"); |
Y si queremos, además, colocar sus imágenes (suponemos que es el ítem 0):
| Código: |
TreeView1->Items->Item[0]->ImageIndex=0;
TreeView1->Items->Item[0]->SelectedIndex=0;
|
Si por el contrario, se desea que dependa de un “padre”. Por ejemplo, queremos crear en elemento (que llamaremos “hijo”) de esta lista que dependa jerárquicamente del valor antes creado (“prueba”):
| Código: |
TTreeNode *Nodo;
int n;
bool salir;
n= TreeView1->Items->Count-1;
salir=false;
while(salir==false)
{
if (TreeView1->Items->Item[n]->Text=="prueba") salir=true;
else n--;
}
Nodo= TreeView1->Items->AddChild(TreeView1->Items->Item[n],"Hijo");
Nodo->ImageIndex=-1;
Nodo->SelectedIndex=-1;
|
Lo que hemos hecho es recorrer el TreeView, hasta encontrar el elemento que queremos que actue como padre. Una vez encontrado, obtenemos su índice, que lo utilizaremos para la inserción. Además no le indicamos que no use ninguna imagen (valor a -1)
Para borrar todo el contenido, basta con aplicar el método Clear().
| Código: |
TreeView1->Items->Clear(); |
Para conocer cual es el padre de un ítem que previamente hemos seleccionado, basta con llamar a la propiedad Parent:
| Código: |
ShowMessage(TreeView1->Selected->Parent->Text); |
Estos ejemplos van separados para que veas como van.
Lo que creo que deberias hacer es, partiendo de que tienes los datos en el StringList, es recorrer la lista con un, por ejemplo, bucle for; y este string introducirlo en el treeview.
En el ejemplo te he puesto "hijo". lo debes sustituir por
mi_lista->Strings[a];
Siendo "a" la variable de control del bucle for.
No he probado este codigo, asi que es posible que tenga algun que otro error. Si es asi dimelo y lo vemos.
Bueno, a ver que sale. Si tienes dudas, pregunta.
Un saludo. |
|
| Volver arriba |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Jue 11 May, 2006 8:09 pm Asunto: |
|
|
!Caramba que eficiencia!
Ahora mismo lo pruebo.
Graciaaaaaaaaaaaaaaassssssssssssssssssssssss |
|
| Volver arriba |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Jue 11 May, 2006 10:39 pm Asunto: Mas de lo mismo |
|
|
He declarado el objeto TStringList, tal y como me indicas.
Al complilar me dice que debo incluir el componente correspondiente.
¿Serias tan amable de decirme donde esta?
No he sabido encontrarlo en la Tool Palete
(trabajo con Borland Developer Studio for Windows Version 10.0.2166.28377 Update 1)
Y otra cosa relacionada con el problema inicial.
¿Sabes como almacenar AnsiString en TMemoryStream?
He observado que un TTreeView puede cargar directamente un TMemoryStream, igual que si fuera un fichero .txt o .dat, existente en el disco duro.
Las lineas de un fichero (o stream) se pueden formatear facilmente mediante tabuladores, y cada una la interpreta el TTreeView como una rama del arbol.
Emplear esta posibilidad me facilitaria mucho la construccion del arbol
Saludos |
|
| Volver arriba |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Vie 12 May, 2006 9:06 am Asunto: |
|
|
Mejor te pongo un ejemplo, asi lo veras mas claro.
Añade un TViewList. Se encuentra en la pestaña de "win32" de la paleta de componentes", mas o menos sobre la mitad de ella.
En el fichero h: | Código: |
private: // User declarations
TStringList *mi_lista; |
Y en el cpp: | Código: |
TTreeNode *Nodo;
int n;
bool salir;
mi_lista = new TStringList;
mi_lista->Add("Perro");
mi_lista->Add("Gato");
mi_lista->Add("Pajaro");
TreeView1->Items->Clear();
TreeView1->Items->Add(NULL, "ANIMALES");
for(int a=0;a<mi_lista->Count;a++)
{
n= TreeView1->Items->Count-1;
salir=false;
while(salir==false)
{
if (TreeView1->Items->Item[n]->Text=="ANIMALES") salir=true;
else n--;
}
Nodo= TreeView1->Items->AddChild(TreeView1->Items->Item[n],
mi_lista->Strings[a]);
Nodo->ImageIndex=-1;
Nodo->SelectedIndex=-1;
}
TreeView1->Items->Item[0]->Expand(true);
|
Y en el evento OnClick del treeview, pones: | Código: |
int n;
// Muestra el padre
ShowMessage(TreeView1->Selected->Parent->Text);
// Muestra el hijo
n=TreeView1->Selected->AbsoluteIndex;
ShowMessage(TreeView1->Items->Item[n]->Text); |
Tal y como puedes ver, al principio de este codigo lo que hacemos es cargar el stringlist con una serie de valores.
En tu caso, pretendes cargarlos desde un stream. Tal y como viene en la ayuda. si se cuenta con el metodo LoadFromStream:
| Cita: |
TStrings::LoadFromStream Method
Fills the list with lines of text read from a stream.
Class
TStrings
Syntax
[C++] virtual void LoadFromStream (TStream * Stream);
Description
Call LoadFromStream to fill the list of the TStrings object from the stream specified by Stream. The text read from the stream is parsed into strings separated by carriage return or linefeed characters. Thus, LoadFromStream reads the value of the Text property.
If the stream is a file stream, LoadFromStream does the same thing as LoadFromFile, except the application must create and destroy the file stream. |
Este codigo esta probado y funciona. Adaptalo a la carga con el stream,
| Código: | mi_lista->LoadFromStream(stream);
Donde stream sera el nombre de tu stream |
Creo que ahora con todo esto, ya lo tienes.
Un saludo. |
|
| Volver arriba |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Vie 12 May, 2006 9:13 am Asunto: |
|
|
Nuevamente muchas gracias.
Sin gente como tu, los que estamos en mi situación desapareceriamos aborrecidos de quedarnos atascados.
Cuando termine de trabajar, esta tarde, lo pruebo.
Hasta entonces debo comerme las uñas y esperar. |
|
| Volver arriba |
|
 |
beta Lt JG

Registrado: 01 Abr 2006Mensajes: 74
|
Publicado: Sab 13 May, 2006 7:34 am Asunto: Variante de la pregunta |
|
|
Ensayando variantes a tus sugerencias, que funcionan muy bien, he encontrado otros problemas colaterales.
Para no hacer este hilo demasiado largo, los he planteado en las Consultas con bajo el título: TMemoryStream versus documento texto.
Salduos |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|