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 

Borrar elementos de un formulario

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Borrar elementos de un formulario Responder citando

Por necesidades del programa en un formulario creo y elimino, en tiempo de ejecución y según me hace falta, una serie de TLabel. Las creo así:
Código:
Label              = new TLabel(this);
Label->Alignment   = taLeftJustify;
Label->AutoSize    = false;
Label->Caption     = "Forma de pago";
Label->Font->Style = TFontStyles() << fsBold;
Label->Height      = 20;
Label->Left        = 94;
Label->Name        = "LabelL1";
Label->Parent      = Panel9;
Label->Top         = Label6->Top + 6;
Label->Transparent = true;
Label->Width       = 90;

Y para borrarlas uso este bucle que llamo cuando me hace falta:
Código:
TComponent *Source;
for (nItem = 0; nItem < ComponentCount; nItem ++)
{
     Source = Components[nItem];
     if (Source->Name.SubString(1, 6) == "LabelL")
          delete Source;
     Application->ProcessMessages();
}

El problema que me estoy encontrado es que borra un elemento sí y uno no; he comprobado que si creo cuatro etiquetas (LabelL1, LabelL2, etc.) me borra las que tienen índice impar y conserva las pares por lo que cuando vuelvo a pasar por la definición de las mismas me da error porque ya existe un elemento con ese nombre. He probado con y sin el ProcessMessages y da lo mismo.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Prueba del siguiente modo:
Código:
    for (int nItem = ComponentCount - 1; nItem >= 0; nItem--)
    {
        TComponent* Source = Components[nItem];
        if (Source->Name.SubString(1, 6) == "LabelL")
            delete Source;
    }
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Perfecto Leo! Muchísimas gracias; me estaba volviendo loco. Me resulta curioso que poniendo el contador "marcha atrás" funcione bien y hacia delante no.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Re: Borrar elementos de un formulario Responder citando

Creo que lo que te pasa, es que cada vez que borras un componente estas variando la condición en ComponentCount, ya que hay uno menos que al comenzar el bucle. No estas guardando el número de elementos en una variable, y lo calculas cada vez.
¿puede ser?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Dirección AIM
Mensaje    Asunto: Re: Borrar elementos de un formulario Responder citando

frios escribió:
Creo que lo que te pasa, es que cada vez que borras un componente estas variando la condición en ComponentCount, ya que hay uno menos que al comenzar el bucle. No estas guardando el número de elementos en una variable, y lo calculas cada vez.
¿puede ser?

Es una posibilidad en la qeu no había pensado, pero entonces me mantendría los últimos creados (LabelL3 y LabelL4, por ejemplo) y no salteados como lo hace. De todas maneras deben ir por ahí los tiros.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Re: Borrar elementos de un formulario Responder citando

Angel escribió:
pero entonces me mantendría los últimos creados (LabelL3 y LabelL4, por ejemplo) y no salteados como lo hace. De todas maneras deben ir por ahí los tiros.


Esto es lo que ocurre con el bucle hacia adelante (espero que se entienda):
Código:
[*0=L1, 1=L2, 2=L3, 3=L4, 4=L5, 5=L6] .. ComponentCount=6 nItem=0
Se ha borrado L1

[0=L2, *1=L3, 2=L4, 3=L5, 4=L6] ........ ComponentCount=5 nItem=1
Se ha borrado L3

[0=L2, 1=L4, *2=L5, 3=L6] .............. ComponentCount=4 nItem=2
Se ha borrado L5

ComponentCount=3 nItem=3 (el bucle no sigue porque nItem ya no es menor que ComponentCount)


Y con el bucle empezando por el final:
Código:
[0=L1, 1=L2, 2=L3, 3=L4, 4=L5, *5=L6] .. ComponentCount=6 nItem=ComponentCount-1=5
Se ha borrado L6

[0=L1, 1=L2, 2=L3, 3=L4, *4=L5] ........ ComponentCount=5 nItem-1=4
Se ha borrado L5

[0=L1, 1=L2, 2=L3, *3=L4] .............. ComponentCount=4 nItem-1=3
Se ha borrado L4

[0=L1, 1=L2, *2=L3] .................... ComponentCount=3 nItem-1=2
Se ha borrado L3

[0=L1, *1=L2] .......................... ComponentCount=2 nItem-1=1
Se ha borrado L2

[*0=L1] ................................ ComponentCount=1 nItem-1=0
Se ha borrado L1

nItem-1=-1 (el bucle no sigue porque nItem ya no es igual o mayor que 0)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perfectament explicado, como no podía ser de otra manera.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.