Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Borrar lo que esta dentro de un scrollbox (https://www.clubdelphi.com/foros/showthread.php?t=25784)

sierraja 04-10-2005 03:59:55

Borrar lo que esta dentro de un scrollbox
 
De qué manera se podría borrar los TLabel, Button, CheckBox que se encuentran dentro de un scrollbox en tiempo de ejecución?

Neftali [Germán.Estévez] 04-10-2005 09:33:33

Puedes recorrer todos los componentes del formulario utilizando los métodos componentCount y Componentes[i].
Una vez que hagas el recorrido, se trata de preguntar cuales están dentro del scrollbox para borrarlos; Para ello puedes utilizar la propiedad Parent. Algo así:

Código Delphi [-]
 var
   i:Integer;
   ctrl:TControl;
 begin
 
   // recorrer la lista de componentes (al revés)
   for i := (Self.ComponentCount - 1) downto 0 do begin
     // Es un TControl ?
     if (Self.Components[i] is tControl) then begin
       ctrl := TControl(Self.Components[i]);
       // Está en el Scrolll?
       if (ctrl.Parent = ScrollBox1) then begin
         MessageDlg('Se va a borrar: ' + ctrl.Name, mtWarning, [mbOK], 0);
         FreeAndNil(ctrl);
       end;
     end;
   end;

yusnerqui 04-10-2005 15:01:09

Otra salución
 
Hola, por qué no usar las propiedades controls y controlcount del propio TScrollBox, de esta forma solo recorremos los elementos que nos interesa (controles del ScrollBox1) y simplemente los destruimos.

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
   i : integer;
begin
  for i := ScrollBox1.ControlCount -1  downto 0 do
      ScrollBox1.Controls[i].Free;
end;

Bueno pues ahora tienes dos vías:)

Saludos Yusnerqui

Neftali [Germán.Estévez] 04-10-2005 17:53:12

Cita:

Empezado por yusnerqui
...por qué no usar las propiedades controls y controlcount del propio TScrollBox?

Efectívamente, porqué no usarlas... (se me pasó...)

Cita:

Empezado por yusnerqui
...Bueno pues ahora tienes dos vías...

A usar preferiblemente la de yusnerqui, ya que es más clara y eficiente.

sierraja 05-10-2005 14:19:10

ok Probaré apenas llegue a casa. Muchas gracias.....

sierraja 05-10-2005 14:20:40

Una pregunta: ¿Por qué se hace el recorrido al revés?. Gracias....

Neftali [Germán.Estévez] 05-10-2005 14:30:43

Cita:

Empezado por sierraja
¿Por qué se hace el recorrido al revés?

Como los vas borrando, si empiezas por el principio te dará error (antes o después).
Por ejempo, si la lista tiene 20 elementos, al eliminar el 0, el que antes era el 1 pasa al 0 y al intentar eliminar el 1, realmente has borrado el dos.

Espero haberme explicado.:p

roman 05-10-2005 17:02:08

Cita:

Empezado por Neftali
Como los vas borrando, si empiezas por el principio te dará error (antes o después).

¡Ahh! Entonces podemos ahorrarnos una variable:

Código Delphi [-]
while ScrollBox1.ControlCount > 0 do
  ScrollBox1.Controls[0].Free;

// Saludos

vtdeleon 05-10-2005 17:33:15

Saludos
Cita:

Empezado por roman
¡Ahh! Entonces podemos ahorrarnos una variable:

Código Delphi [-]
while ScrollBox1.ControlCount > 0 do
  ScrollBox1.Controls[0].Free;

Wow :eek: Muy acertada y eficiente tu técnica

dec 05-10-2005 17:51:43

Hola,

Cita:

Empezado por vtdeleon
Wow :eek: Muy acertada y eficiente tu técnica

¡Eso no es nada! Dale a roman cinco minutos más y hasta el bucle se hará innecesario... :) :D :cool:

roman 05-10-2005 19:36:29

Cita:

Empezado por dec
y hasta el bucle se hará innecesario... :) :D :cool:

Eso es fácil:

Application.Terminate;

:D

// Saludos

delphi.com.ar 05-10-2005 19:52:23

Cita:

Empezado por vtdeleon
SaludosWow :eek: Muy acertada y eficiente tu técnica

Voy a buscar un poquito de pelea contradiciendo esto :D, en lo que refiere a optimización de código, es mucho mas eficiente la opción del for, ya que consulta solo una vez la propiedad ControlCount, en cambio el while ejecutará el código de la propiedad para cada iteración.
Sería muy fino evaluar según el tamaño de la lista que código nos conviene.

PD: Siempre suponiendo que la ejecución es lineal, que solo "nosotros" eliminamos estos componentes.

Saludos!

roman 05-10-2005 19:57:06

En un ciclo for también hay una comparación en cada vuelta. Aunque no escrita explícitamente en el código, sí en el código ensamblado.

:p

// Saludos

roman 05-10-2005 19:59:55

Ya entendí a lo que te refieres. Sí tienes razón. :)

// Saludos

delphi.com.ar 05-10-2005 20:05:09

Cita:

Empezado por roman
En un ciclo for también hay una comparación en cada vuelta. Aunque no escrita explícitamente en el código, sí en el código ensamblado.

Noo.. pero sabes a lo que me refiero!... la comparación siempre esta, pero en el caso de la propiedad se ejecuta el código propio de la propiedad (en este caso TWinControl.GetControlCount). Sin lugar a dudas va a ser mucho mas "económico" un entero mas en memoria, a no ser que solo tengas un ítem en la lista :D.

dec 06-10-2005 00:40:30

Hola,

Nunca te acostarás... etc. :D

sierraja 06-10-2005 02:27:07

Mi exposición:
 
A todos mi agradecimiento, muchisimas gracias, me gusta sentirme parte de este maravilloso equipo, cada vez siempre, pero siempre se aprende más. De nuevo muchas gracias.:D

sierraja 07-10-2005 05:39:07

Ahora la pregunta es:
 
Tengo varios TImage, TLabel, TdxButton y TdxCheckBox dentro del ScrollBox1, ahora ¿ Cómo hago para chequear la propiedad Checked del TdxCheckBox y ejecutar otro proceso?. Gracias.:confused:

roman 07-10-2005 08:33:40

Cita:

Empezado por sierraja
¿ Cómo hago para chequear la propiedad Checked del TdxCheckBox y ejecutar otro proceso?

¿Qué tiene que ver esto con el tema del hilo?

// Saludos

sierraja 07-10-2005 15:41:21

EL tema inicial era como eliminar los componentes que se encuentran dentro del scrollbox, pero tengo la necesidad de que dentro del scrolbox tengo varios componentes y uno de ellos son checkbox del tipo tdxcheckbox y quiero verificar si la propiedad checked está true y depende de ello ejecutar un proceso xxxx, por eso la pregunta ¿ cómo se accede a las propiedades de los componentes dentro del scrollbox creados en tiempo de ejecución?


La franja horaria es GMT +2. Ahora son las 17:39:08.

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