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 01-02-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
Acción inesperada de ListBox->ItemIndex

Hola a tods! tengo una dudilla...

tengo un Form1 en el cuál tengo un botón, mediante el evento OnClick llamo a:

Código:
Form2->ShowModal();
que me muestra un segundo formulario Form2 que contiene un ListBox1, en el Unit2.cpp tengo:

Código:
void __fastcall TForm2::FormCreate(TObject *Sender)
{
 MiClass * mio = new MiClass ();
 mio -> GetAlgo();
 delete mio
}
Con esto, se supone que cuando clickeo al boton del Form1 y me muestra Form2 directamente llama al método GetAlgo de la clase MiClass que está contenido en un Unit3

y en el Unit3.cpp:

Código:
...
for (        )
{
 cadena = .....
Form2->ListBox1->Items->Add(cadena);
}
/*
int num=Form2->ListBox1->ItemIndex;

if (num==1)
{
 ShowMessage("algo");
}
if (num == 2)
{
}
...
*/
El código tal cual (sin ejecutar el código comentado), se ejecuta como espero:
1. ejecuto el .exe
2. muestra el Form1
3. click al botón
4. muestra el Form2 con el ListBox1 rellenado de los items que le indico:
Form2->ListBox1->Items->Add(cadena);

Pero cuando lo ejecuto todo (incluyendo lo comentado), se ejecuta:
1. ejecuto el .exe
2. muestra ShowMessage("algo");
3. muestra Form1.....

como es posible?? Algo estoy pasando por alto, pero no se qué es.

Lo que quiero hacer es que al clickear el botón de Form1 me muestra un Form2 con los items ya mostrados en el ListBox y que, al seleccionar alguno de ellos, me muestre la información que yo quiera en el Form1.

gracias, espero haberme explicado bien.
Responder Con Cita
  #2  
Antiguo 01-02-2008
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
No termino de entender exactamente, pero voy a tratar de responder.

Si en Unit3 tu código mostrado no está implementado como funciones miembro de la clase MiClas (que creo entender que es Form2) entonces puede ejecutarse fuera de MiClas. Yo implementaría en el constructor de MiClas la carga del ListBox. De esta forma ese código se ejecuta en el momento de crear esa clase.
Responder Con Cita
  #3  
Antiguo 04-02-2008
Ziara Ziara is offline
Miembro
 
Registrado: dic 2007
Posts: 43
Poder: 0
Ziara Va por buen camino
Hola,

únicamente en el Unit2.cpp tengo

Código:
 void __fastcall TForm2::FormCreate(TObject *Sender)
{
 MiClass * mio = new MiClass ();
 mio -> GetAlgo();
 delete mio
}
ya que cuando se muestra el Form2 quiero que llame directamente a la función GetAlgo(); de la clase MiClass.

Cita:
Si en Unit3 tu código mostrado no está implementado como funciones miembro de la clase MiClas
Si que lo está sería asi no?

Código:
 void MiClass::GetAlgo()
{

...
   for (        ) 
   {
    cadena = .....
    Form2->ListBox1->Items->Add(cadena);
   }
   /*
   int num=Form2->ListBox1->ItemIndex;

   if (num==1)
   {
    ShowMessage("algo");
   }
   if (num == 2)
   {
   }
...
}
Cita:
Yo implementaría en el constructor de MiClas la carga del ListBox. De esta forma ese código se ejecuta en el momento de crear esa clase.
En el Unit3.cpp el ListBox está dentro de un for, ya que voy a mostrar varias iteraciones (las del for) si colocara la carga del ListBox en Form2 sólo me mostraría la última iteración.

No sé todavía qué pasa, si alguien me puede decir algo...
Responder Con Cita
  #4  
Antiguo 04-02-2008
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
No entiendo la utilidad de tu codigo, supongo que es un experimento.
Creo que tu problema esta en cargar el ListBox (bucle de Add) en el evento OnCreate del Form2 (puesto que aquí llamas a getAlgo que tiene el bucle de carga del ListBox). OnCreate se genera al crearse una ventana, aunque todavía no la veas.

Experimenta lo siguiente aunque para ello MiClass debe ser un formulario:
No utilices Form2.
En el evento de OnClick de Form1 coloca el codigo:
Código:
MiClass * mio = new MiClass ();
mio->ShowModal();
mio->GetAlgo();
delete mio;
Y en GetAlgo() coloca el código que tenías.

De esta forma te aseguras que "mio" esta creado y visualizado de forma modal y luego GetAlgo se encarga de la tarea que le encomendaste. Esto funcionará como tu quieres.

Si Form2 te resulta necesario, entonces, tu código no debería mostrar el mensage desde GetAlgo, sino desde el evento OnChange del ListBox.

Yo utilizo un truco cuando no me queda mas remedio que colocar código que puede ejecutarse antes de visualizar una ventana y es colocar un Timer y en el evento OnTimer coloco ese código "sensible". OnTimer se produce cuando el Form que lo contiene ya es visible. Pero trato de no hacer nunca esto porque me parece "chapucero".

Espero servirte de ayuda.
Saludos.

Última edición por escafandra fecha: 04-02-2008 a las 20:06:20.
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
DBLookupComboBox.itemindex? look OOP 12 24-01-2011 17:46:42
Detectar cambio de ItemIndex en ComboBox ixMike OOP 5 19-10-2006 20:39:03
RadioGroup1.ItemIndex FGarcia Varios 6 21-06-2006 20:45:03
TListView: Obtener el ItemIndex de un Caption DarkByte OOP 3 09-10-2005 12:45:49
TComboBox ItemIndex anterior a la ejecución de Change zemog76 OOP 6 04-02-2005 16:57:37


La franja horaria es GMT +2. Ahora son las 09:51:16.


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