Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Pasar un list<AnsiString> a un TTreeView

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Pasar un list<AnsiString> a un TTreeView Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: No es exactamente eso Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

!Caramba que eficiencia!

Ahora mismo lo pruebo.

Graciaaaaaaaaaaaaaaassssssssssssssssssssssss
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Mas de lo mismo Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Variante de la pregunta Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.