Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Borrar Botones (https://www.clubdelphi.com/foros/showthread.php?t=69073)

LiAnTe- 23-07-2010 21:42:10

Borrar Botones
 
Hol Gente,

tengo una duda que no se como solventarla...

he creado TSpeedButton en un panel en modo ejecucion.

La pregunta es la siguiente como puedo eliminar los botones que he creado??

Estoy buscando y mirando y no lo consigo si alguna alma caritativa me ayudara se lo agradeceria.

Saludos.

marcoszorrilla 23-07-2010 21:48:19

Un ejemplo:

Código Delphi [-]
FreeAndNil(button1);

Un Saludo.

LiAnTe- 23-07-2010 22:39:38

Cita:

Empezado por marcoszorrilla (Mensaje 371405)
Un ejemplo:


Código Delphi [-]FreeAndNil(button1);



Un Saludo.

Hola compañero eso no me vale...

if BDades.TGrupo.Eof = False Then
Begin
vProductoGrupoNombre := BDades.TGrupo.FieldByName('DESCRIPCION').AsString;
vProductoGrupoCodigo := BDades.TGrupo.FieldByName('GRUPO').AsString;
vBotonProductos := TSpeedButton.create(self);
vBotonProductos.Parent := vPestanyaProductos;
vBotonProductos.Tag := StrToInt(vProductoGrupoCodigo);
vBotonProductos.Caption := vProductoGrupoNombre;
vBotonProductos.Layout := blGlyphTop;
vBotonProductos.Transparent := True;
try

Como puedes ver los voy creando en un panel en tiempo de ejecucion igual hay 20 botones...

el tema seria dejar en blanco el panel pero no se como hacerlo y mira que le estoy dando vueltas y vueltas... esta claro que mi nivel en delphi no es muy alto....

Saludos.

ecfisa 24-07-2010 07:17:49

Hola Liante.
Para borrar los componentes podés usar utilizar la propiedad Components del form:
Código:

procedure BorrarSpeedBtns;
var
  i: Integer;
begin
  for i:= ComponentCount -1 downto 0 do
    if Components[i].ClassType = TSpeedButton then
      Components[i].Free;
end;

No, no hice el conteo al revés por que me guste complicar la cosa.
Si hiciera, for i:= 0 to ComponentCount - 1 do, obtendría un error de índice; puesto que
la posición del elemento que acabo de borrar sería ocupada inmediatamente por la del
componente que lo sucede.
Esto hace que cuando el componente "1" sea borrado y vaya a borrar el "2" este esté en
el lugar que antes ocupaba el "1", borrando entonces el "3" , y así sucesivamente. Provocando
inevitablemente una incongruencia entre el índice del ciclo y el número de los componentes.

Espero haber ayudado.

Saludos.

LiAnTe- 24-07-2010 09:40:13

Cita:

Empezado por ecfisa (Mensaje 371448)
Hola Liante.
Para borrar los componentes podés usar utilizar la propiedad Components del form:
Código:

procedure BorrarSpeedBtns;
var
  i: Integer;
begin
  for i:= ComponentCount -1 downto 0 do
    if Components[i].ClassType = TSpeedButton then
      Components[i].Free;
end;

No, no hice el conteo al revés por que me guste complicar la cosa.
Si hiciera, for i:= 0 to ComponentCount - 1 do, obtendría un error de índice; puesto que
la posición del elemento que acabo de borrar sería ocupada inmediatamente por la del
componente que lo sucede.
Esto hace que cuando el componente "1" sea borrado y vaya a borrar el "2" este esté en
el lugar que antes ocupaba el "1", borrando entonces el "3" , y así sucesivamente. Provocando
inevitablemente una incongruencia entre el índice del ciclo y el número de los componentes.

Espero haber ayudado.

Saludos.

Genial esa es la idea, eso me va perfecto pero el ultimo problema que tengo ahora es que me borra todo el formulario y me tiene que borrar los botones que hay solo dentro de un PANEL...

estoy mirando de hacerlo metiendo delante el nombre del panel y pasa de mi...

donde me estoy equivocando??

gracias compañeros por el aporte que estais haciendo.

DarkMan 24-07-2010 18:23:34

Si el panel es constante y no se crea y se destruye, sabiendo su nombre desde el principio puedes eliminar todos los botones de ese tipo que contenga.

Modificando un poco la función quedaría algo así:

Código Delphi [-]
procedure BorrarSpeedBtns(Panel: TPanel);
var
  i: Integer;
begin

   for i:= ComponentCount -1 downto 0 do
     if Components[i].ClassType = TSpeedButton then
       If Components[i].Parent = Panel then Components[i].Free;

end;

ecfisa 24-07-2010 19:26:15

Hola de nuevo.

La idea de DarkMan está bíen orientada.
Pero [i]Components nos da un TComponent y no tiene la propiedad Parent,
o sea que tendríamos que ir a un descendiente que la tenga. Este es TWinControl.

Entonces la línea:
Código:

  If Components[i].Parent = Panel then
debería ser:
Código:

  if TSpeedButton(Components[i]).Parent = Panel1  then
Parametrizando para cualquier contenedor sería:
Código:

procedure TForm1.BorrarBtns(ACtrl: TWinControl);
var
  i: Integer;
begin
  for i:= ComponentCount -1 downto 0 do
    if (Components[i].ClassType = TSpeedButton)and
      (TSpeedButton(Components[i]).Parent = ACtrl) then
      Components[i].Free;
end;

Llamadas:
Código:

  BorrarBtns(Panel1);
  BorrarBtns(GroupBox1);
  ...

Saludos.

LiAnTe- 30-07-2010 09:47:03

Soys unos Crack's muchas gracias a todos.


La franja horaria es GMT +2. Ahora son las 02:04:35.

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