Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-11-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Question Crear y Borrar componentes en tiempo de ejecución

Hola amigos tengo en una forma un SpinEdit y segun el numero que vaya seleccionando el usuario voy creando una etiqueta, un cuadro de texto y un calendario (al momento solo he provado con crear las etiquetas). Cuando se aumenta el valor en el SpinEdit en tiempo de ejecución se crean las etiquetas restantes, es decir si spinedit es 0 y el usuario sellecciona 2 se crean dos etiquetas, y si despues el usuario selecciona 3 solo se crea una etiqueta mas, el problema lo tengo cuando el usuario disminuye el valor del SpinEdit por ejemplo de 3 a 2 no logro eliminar la etiqueta sobrante, les anexo el código a ver si me pueden ayudar.

Código Delphi [-]
procedure TFrmBACCobros1.SpinEdit1Change(Sender: TObject);
Var
  Etiqueta: TLabel;
begin
  inherited;
  if TotalEtiquetas < SpinEdit1.Value
    Then For i:= TotalEtiquetas to SpinEdit1.Value -1 do
      Begin
        Etiqueta:= TLabel.Create(ScrollBox1);
        Etiqueta.Top:= AltoEtiqueta;
        Etiqueta.Left:= 16;
        Etiqueta.Width:= 65;
        Etiqueta.Height:= 21;
        Etiqueta.Name:= 'pago'+IntToStr(i);
        Etiqueta.Parent:= ScrollBox1;
        Etiqueta.Tag:= i;
        Etiqueta.Caption:= 'Pago '+ IntToStr(i+1);
        AltoEtiqueta:= AltoEtiqueta+ 20;
      End
    Else //Aqui esta mi problema ya probe con RemoveComponent 
          TLabel(FindComponent('pago'+InttoStr(SpinEdit1.Value+1))).DestroyComponents;
  TotalEtiquetas:= SpinEdit1.Value;
end;

Segun yo buscando en el foro solo encuantro como crear componentes no como borrarlos

__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #2  
Antiguo 23-11-2005
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
La verdad no he probado muy bien este codigo pero me supongo que puedes jugar con lo siguiente:

Código Delphi [-]
var
  x :Integer;
begin
  for x := 0 to ScrollBox1.ControlCount -1 do
  begin
    if ScrollBox1.Controls[x] is TLabel then
      TLabel(ScrollBox1.Controls[x]).Free;
  end;
end;

Espero te sirva
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 23-11-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A mí a bote pronto se me ocurre que uses variables "TObjectList", de tal forma que puedas ir guardando una referencia a cada objeto que creas, y puedas destruir estos según te sea menester. El código de más abajo está escrito en un momento, no me he parado mucho en el mismo, pero, como puede verse en el ejemplo que adjunto, aparentemente, al menos, consigue más o menos lo que te propones: ciñéndome en el ejemplo a unas cuantas "TLabel". Eres libre de mejorarlo y modificarlo como mejor te parezca. Si algún error de bulto hay, por favor, nadie se prive en comunicarlo. Gracias.

Código Delphi [-]
unit UfrmEjemplo;
 
interface
 
uses
  Forms, Classes, Controls,
  StdCtrls, SysUtils, Spin,
  Contnrs; // TObjectList
 
type
  TfrmPrincipal = class(TForm)
    SpinEdit: TSpinEdit;
    procedure FormCreate(Sender: TObject);
    procedure SpinEditChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    listaEtiquetas: TObjectList;
  end;
 
var
  frmPrincipal: TfrmPrincipal;
 
implementation
 
{$R *.dfm}
 
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
  listaEtiquetas := TObjectList.Create;
end;
 
procedure TfrmPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  listaEtiquetas.Free;
end;
 
procedure TfrmPrincipal.SpinEditChange(Sender: TObject);
var
  i: integer;
  nLabel: TLabel;
begin
  if (SpinEdit.Value > listaEtiquetas.Count) then
  begin
    nLabel := TLabel.Create(Self);
    nLabel.Top := 10;
    nLabel.Left := 10;
    nLabel.Parent := Self;
    nLabel.Caption := 'Etiqueta: ' + IntToStr(listaEtiquetas.Count+1);
    if listaEtiquetas.Count >= 1 then
      nLabel.Top := TLabel(listaEtiquetas.Items[listaEtiquetas.Count-1]).Top + 20;
    listaEtiquetas.Add(nLabel);
  end
  else
    for i := listaEtiquetas.Count-1 downto SpinEdit.Value do
    begin
      if (i >= 1) then
        listaEtiquetas.Delete(i)
      else if (i = 0) then
        listaEtiquetas.Delete(0);
    end;
end;
 
end.
Archivos Adjuntos
Tipo de Archivo: zip ejemplo.zip (2,0 KB, 136 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-11-2005 a las 21:23:18. Razón: Corrección del código fuente (nomás la indentación).
Responder Con Cita
  #4  
Antiguo 24-11-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Gracias a los dos por su ayuda les comento que la solución de jhonny si borraba pero solo los cuadros de dialogo y las datetimepicker, con la solución de dec fue lo que yo intentaba hacer solo le aumente el codigo para tambier crear los cuadros de dialogo y las datetimepicker.


Nuevamente Gracias
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #5  
Antiguo 24-11-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Por cierto le aumente en la parte de creación del componente le aumente el comando:
Código Delphi [-]
nlabel.name:= 'pago'+IntToStr(i);

debido a que como la forma ya tiene otras etiquetas y no siempre tienen un nombre progresivo (label1, label2, etc.) daba error en el nombre del componente y con esto cambio fue mas que suficiente
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #6  
Antiguo 24-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si vas a necesitar siempre el Tedit, el label y el calendario:

Create un Tframe con esos 3 componentes dentro. Despues solo tendrás que crear un nuevo TFrame y tendrás casi todo hecho.

PD: Para liberar un componente en tiempo de ejecución, usa FreeAndNil(nombreComponente).

Al crear los labels con el parámetro "Self" estas diciendo que los libere el formulario; si los destruyes tú, cuando el form intente destruirlos te dará un AccessViolation, ya que .Free no deja la variable apuntando a nil
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 25-11-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Gracias Lepe, ya tengo el formulario funcionando con la ayuda de Dec, pero tendre en cuana la tuya para futuros cambios
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
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


La franja horaria es GMT +2. Ahora son las 07:54:47.


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