Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
¿en un TStringList se puede tener dos columnas? si es asi me vale igual.
Por cierto, he probado el codigo en un proyecto nuevo y funciona perfecto pero en el que lo tengo no funciona. El codigo pertenece a una clase y el TListView esta en el private de la clase y es creado en el constructor, añado los items desde otra funcion de la clase y lo destruyo en el destructor. ¿puede ser por algo de eso?
Responder Con Cita
  #2  
Antiguo 12-03-2014
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aguml Ver Mensaje
¿en un TStringList se puede tener dos columnas? si es asi me vale igual.
Un StringList no tiene dos columnas pero si las manejas de 2 en dos, las dos primeras pertenecen a la colunma 1 y 2 del primer elemento...

Puedes hacer un array de dos dimensiones o crear una estructura con dos string y hacer un array de ésta. Tambien puedes usar TList como array dinámico de tu estructura. En definitiva, tienes muchísimas soluciones a tu problema.

Cita:
Empezado por aguml Ver Mensaje
Por cierto, he probado el codigo en un proyecto nuevo y funciona perfecto pero en el que lo tengo no funciona. El codigo pertenece a una clase y el TListView esta en el private de la clase y es creado en el constructor, añado los items desde otra funcion de la clase y lo destruyo en el destructor. ¿puede ser por algo de eso?
Si lo vas a destruir tú mismo, el objeto no debe tener dueño, para lo que debes crearlo así:
Código:
listaBPs = new TListView((TComponent*)0);
Saludos.
Responder Con Cita
  #3  
Antiguo 12-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
ya vi el problema. El problema es que uso "listaBPs =new TListView..." dentro del constructor de mi clase y si luego hago un add() desde otra funcion miembro de la clase falla pero si hago el new y el parent en el mismo sitio que esta el add() funciona correctamente. La cuestion es que el listview tiene que ser creado una sola vez durante la ejecucion y tiene que poderse accederse a ella desde varias funciones miembro de la clase. Con respecto al uso de otras opciones creo que esta es la que mas se adecúa y solo tengo que gestionarla bien. Otra cosa, el constructor se ejecuta al pulsar un boton del form1.
Responder Con Cita
  #4  
Antiguo 12-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
bueno en realidad solo se accede desde 2 funciones y siempre pasará antes por la funcion de busqueda asi que se me ocurre que podria iniciar el puntero a null y con un condicional ver si es null para crearlo e iniciarlo o no.
Responder Con Cita
  #5  
Antiguo 12-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por aguml Ver Mensaje
¿en un TStringList se puede tener dos columnas?
Hola aguml.

Podes aprovechar la propiedad Objects como segunda columna:
Código:
...
TStrings *TS = new TStringList;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  for(int i=0;i<10;i++)
   TS->AddObject("Item:" + IntToStr(i),((TObject*)(i*10)));
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(int i=0;i<10;i++)
  ListBox1->Items->Add(TS->Strings[i]+ " - " +
    IntToStr((int)TS->Objects[i]));
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  TS->Clear();
  for(int i=0;i<TS->Count;i++)
    delete TS->Objects[i];
}
En el caso que quisieras almacenar otro tipo (AnsiString en el ejemplo):
Código:
...
class TClase {
public:
  AnsiString Cadena;
};

TClase *Clase;
TStrings *TS = new TStringList;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 for(int i=0;i<10;i++) {
  Clase = new TClase;
  Clase->Cadena = "Col2: "+IntToStr(i*10);
  TS->AddObject("Col1: "+IntToStr(i), ((TObject*)Clase));
 }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 for(int i=0;i<10;i++)
  ListBox1->Items->Add(TS->Strings[i]+ " - " +
    ((TClase*)(TS->Objects[i]))->Cadena);
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  TS->Clear();
  for(int i=0;i<TS->Count;i++)
    delete TS->Objects[i];
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 12-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
prefiero el listview porque ahora solo estoy probando con dos columnas pero seran 5 o 6.
Responder Con Cita
  #7  
Antiguo 12-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
la opcion que mas me gusta seria crear una estructura y un tlist que administre las estructuras. El tlist tendria que poder hacer Add, delete, clear, y poder leer cualquiera de los miembros de cada estructura. ¿Como seria eso? No tengo ni idea de usar tlist.
Responder Con Cita
  #8  
Antiguo 13-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.
Cita:
Empezado por aguml Ver Mensaje
prefiero el listview porque ahora solo estoy probando con dos columnas pero seran 5 o 6.
Es que aquí, en el mensaje #7:
Cita:
Empezado por aguml Ver Mensaje
¿en un TStringList se puede tener dos columnas? si es asi me vale igual.
mencionaste que un TStringList igualmente te servía...
Cita:
Empezado por aguml Ver Mensaje
la opcion que mas me gusta seria crear una estructura y un tlist que administre las estructuras. El tlist tendria que poder hacer Add, delete, clear, y poder leer cualquiera de los miembros de cada estructura. ¿Como seria eso? No tengo ni idea de usar tlist.
Te hice un ejemplo que usa un TList para almacenar estructuras que a su vez contienen un TStringList, espero te sirva:
Código:
...
TList *List;

typedef struct TNodo{
  int nro;
  String cad;
  TStrings *SL;
} *PNodo;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  List = new TList;
  for(int i=0; i<50 ;i++) {
     PNodo nd = new TNodo;
     nd->nro = i;
     nd->cad = "Nodo ";
     nd->SL = new TStringList;
     for (int j=0; j<10; j++)
      nd->SL->Add("SL"+IntToStr(i+j));
     List->Add((void*)nd);
  }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  PNodo nd = new TNodo;
  String str;

  Memo1->Clear();
  List->Pack();
  for(int i=0; i<List->Count; i++) {
    nd = ((TNodo*)List->Items[i]);
    Memo1->Lines->Add(nd->cad+IntToStr(nd->nro));
    Memo1->Lines->Add("------------------------");
    str="";
    for(int j=0; j<nd->SL->Count;j++)
      str += nd->SL->Strings[j]+ ", ";
    str.SetLength(str.Length()-2);
    Memo1->Lines->Add(str);
    Memo1->Lines->Add("");
  }
  delete nd;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  List->Clear();
  for(int i=0;i<List->Count;i++) {
    PNodo nd = new TNodo;
    nd = ((TNodo*)List->Items[i]);
    delete nd->SL;
    delete nd;
  }
}
Veras que recorro List para ir liberando manualmente los nodos, ya que una instancia de TList no es propietaria de los objetos que contiene. En el caso de SL no es necesario ya que no almacena objeto alguno.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 13-03-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
aguml Va por buen camino
es perfecto amigo. Solo tengo un par de preguntas. Si uso delete con la list, o sea lista->item[i]->delete, ¿Solo borro el puntero o borraria el objeto? Si borro un objeto de en medio ¿Se quedaria el hueco o se reorganiza? O sea, si tengo 3 objetos en la lista y borro el 2 ¿El 3 pasaria a ser el 2 en la lista o seguiria siendo el 3? Tambien he visto dos funciones muy interesantes que son find y sort. ¿Podria usarse el find de la lista para buscar un valor dentro de un miembro de las estructuras? Solo buscar por ejemplo en la variable entera de todas las estructuras de la lista. Y sort ¿Es para ordenar? ¿Como ordenaria? ¿Usando un elemento de la estructura? ¿Como seria eso? Gracias amigo!!
Responder Con Cita
  #10  
Antiguo 13-03-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Respecto a tu dudas con el método Delete (no el operador delete):
Cita:
Si uso delete con la list, o sea lista->item[i]->delete, ¿Solo borro el puntero o borraria el objeto?
Delete elimina el elemento de la lista pero no libera la memoria asociada.

Cita:
¿Se quedaria el hueco o se reorganiza?
No queda el hueco, mueve hacia arriba los demás elementos.


En cuanto al resto de las preguntas te ruego que las formules en otro hilo como indica el punto ( 8. ) de nuestra guía de estilo.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
usar varios form a la vez exequielmatias1 OOP 1 09-09-2013 04:11:36
Mensaje fuera de form rabata2001 Varios 1 22-11-2010 13:54:26
Saber si el cursor esta fuera del form LuisAlf:: Varios 10 22-04-2010 18:42:49
Hacer una pausa fuera del evento OnTimer y sin usar Sleep DarkByte Varios 9 28-06-2007 04:08:00
ToolBar fuera del form. afxe Gráficos 2 15-06-2006 18:48:59


La franja horaria es GMT +2. Ahora son las 12:55:12.


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