Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Liberar los componentes de un srollbox (https://www.clubdelphi.com/foros/showthread.php?t=32143)

nenufer 27-05-2006 10:59:20

Liberar los componentes de un srollbox
 
Buenas a tod@s!! Vereis tengo un treeview en el que tengo 4 items,son los nombres de 4 tablas que tengo en paradox.
Cuando le doy a la 1º tabla quiero cree Tchecks en tiempo de ejecucion para cada campo de la tabla, hasta ahi todo bien, tengo otro procedimiento que libera de memoria todos los checks de el srollbox para que cuando le de a otro item(nombre de otra tabla) libere de memoria el srollbox y pueda crear los nuevos Tchecks de esta tabla elegida, entonces cuando ejecuto y le doy a una tabla(la 2º que elija) me genera un errror : 'Acces violation at address 0041E23E in module PVideo.exe' . Hago un try except para controlar este error y quito de tools/debugger Options/language Exception/Stop on delphi Exception. y el error ya no da. Pero no me libera todos los componentes bien y al crear nuevos tampoco lo hace bien. Pongo el codigo a ver si alguien sabe que estoy haciendo mal.

Código Delphi [-]
  //CbbCampos.Items.Clear;
  //procedimiento que libera de memoria los componentes del srollbox
  LiberarChecks();
  if Node.Text = 'Socios' then
    begin
      MostrarTabla('Socios');//Nada que ver para lo que quiero
      CargarCampos(DM.TblSocios);//Carga los checks en el srollbox
    end
  else
    if Node.Text = 'Peliculas' then
      begin
        MostrarTabla('Peliculas');
        CargarCampos(DM.TblPelis);
      end
    else
      if Node.Text = 'Provincias' then
        begin
          MostrarTabla('Provincia');
          CargarCampos(DM.TblProvin);
        end
      else
        if Node.Text = 'Alquileres' then
        begin
          MostrarTabla('Alquileres');
          CargarCampos(DM.TblAlquileres);
        end;
end;
 
procedure TFrmConsultas.CrearCheckBox(p : integer; Campo : String );
begin
  ChckBxCampo := TCheckBox.Create(self);
  ChckBxCampo.Parent := SrBxCampos;//srollbox
  ChckBxCampo.Top := p; 
  //RdBtnCampo.Name := 'RdBtn'+Campo;
  ChckBxCampo.Width := 120;
  ChckBxCampo.Left := 15;
  ChckBxCampo.Caption :=Campo;
end;
 
procedure TFrmConsultas.LiberarChecks();
var
  i : integer;
  //check : TControl;
begin
  try
    try
      for i := 0 to SrBxCampos.ControlCount do
          SrBxCampos.Controls[i].Free;
    except
      //No quiero que haga nada.
    end;
  finally
  end;
end;

Gracias de antemano:(

Northern 27-05-2006 22:21:35

Aquí for i := 0 to SrBxCampos.ControlCount do al menos le falta un -1 debería ser SrBxCampos.ControlCount-1 ...

lpmlpm 27-05-2006 22:54:47

Cuando estas eliminando objetos, procura usar el for de manera invertida sino te arriesgas a tener esos errores de acceso a memoria... seguro que con esto se arregla tu procedimiento:

Código Delphi [-]
 
for i := Pred(SrBxCampos.ControlCount) downto 0 do
 SrBxCampos.Controls[i].Free;

nenufer 29-05-2006 08:18:48

Buenas!! Gracias por contestar, no tenia ni idea de que asi fuera mejor:D .
Pero al final e optado por poner un checklistbox que es mucho mas comodo.
Muchas Gracias.


La franja horaria es GMT +2. Ahora son las 07:18:37.

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