Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear y Borrar componentes en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=27543)

jzginez 23-11-2005 20:40:24

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

:confused:

jhonny 23-11-2005 20:46:44

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 ;)

dec 23-11-2005 21:19:03

1 Archivos Adjunto(s)
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.

jzginez 24-11-2005 00:47:51

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

jzginez 24-11-2005 15:52:46

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

Lepe 24-11-2005 17:48:58

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

jzginez 25-11-2005 16:04:55

Gracias Lepe, ya tengo el formulario funcionando con la ayuda de Dec, pero tendre en cuana la tuya para futuros cambios


La franja horaria es GMT +2. Ahora son las 20:57:50.

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