Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ScrollBox violacion de memoria (https://www.clubdelphi.com/foros/showthread.php?t=69918)

riddick 18-09-2010 07:46:23

ScrollBox violacion de memoria
 
hola soy nuevo en el foro, tambien programando en delphi y me gustaria que alguien puediera ayudarme.
Estoy realizando una aplicacion donde necesito crear mucho botones en un scrollbox, el problema es que cuando creo demasiados botones marca error de memoria y quisiera ver si alguien sabe como arreglaro o tenga una solucion mi codigo es el siguiente

Código Delphi [-]
procedure TframeVentas.CrearBotonesProductos(var categoria:Integer);
Var
PosY:Integer;
PosX:Integer;
n:Integer;
i :Integer;
begin

         BorrarBtns(ScrollBoxProductos);
      if categoria=1 then
        begin
            lblProductos.Caption:=lblProductos.Caption+' DE ROPA';
        end
      else
        begin
            lblProductos.Caption:=lblProductos.Caption+' DE JOYERIA';
        end;
          CONEXIONES.conexion.IBQuery1.SQL.Clear;
          CONEXIONES.conexion.IBQuery1.SQL.Add('select idproductos,nombre_producto from productos where categorias_idcategorias='+inttostr(categoria)+' order by nombre_producto');
          CONEXIONES.conexion.IBQuery1.open;
          SetLength(BtProductos, CONEXIONES.conexion.IBQuery1.RecordCount) ;
          PosY:=0;
          PosX:=0;
          n:=1;
          while not CONEXIONES.conexion.IBQuery1.Eof do
          begin
              BtProductos[n]:=TButton.Create(self);
              with self.BtProductos[n] do
              begin
                  Caption:=CONEXIONES.conexion.IBQuery1.FieldByName('nombre_producto').AsString;
                  Parent:=ScrollBoxProductos;
                  Height:=61;
                  Top:=PosY;
                  Left:=PosX;
                  PosY:=PosY+Height+10;
                  Width:=77;
                  WordWrap:=true;
                  OnClick:=ClickBotonProductos;
                  Name:='btProducto'+IntToStr(n);
                  tag:=CONEXIONES.conexion.IBQuery1.FieldByName('idproductos').AsInteger;
                  Font.Name:='DefaultFontDialog1.Font.Name Times New Roman' ;
                  if n mod 4=0then
                  begin
                     PosX:=PosX+Width+10;
                     PosY:=0;
                  end;
              end;
                CONEXIONES.conexion.IBQuery1.Next;
                n:=n+1;
          end;
end;
procedure TframeVentas.BorrarBtns(ACtrl: TWinControl);
var
  i: Integer;
begin
  for i:= ComponentCount -1 downto 0 do
    if (Components[i].ClassType = TButton)and
      (TButton(Components[i]).Parent = ACtrl) then
       Components[i].Free;
end;

todo esto lo ejecuto desde un boton y antes de crearlo elimino el contenido del scrollbox para crera los nuevos botones espero alguien me ayude gracias

Casimiro Noteví 18-09-2010 12:01:12

Hola riddick, bienvenido a clubdelphi, te aconsejo leas nuestra guía de estilo, gracias.
También te gustaría presentar el código fuente formateado con las etiquetas oportunas, lo tienes aquí. Gracias.
Voy a editar tu código y poner la etiqueta delphi, así se entenderá mejor.

Casimiro Noteví 18-09-2010 12:07:22

Bien, a simple vista ya veo un problema:

Código:

CONEXIONES.conexion.IBQuery1.open;
SetLength(BtProductos, CONEXIONES.conexion.IBQuery1.RecordCount);

Supongo que BtProductos en un array de longitud variable y estás asignándole la longitud de los registros que ha devuelto la consulta,
pues bien, en sql no es así, si quieres realmente saber la cantidad de registros debes ir al último del mismo o hacer un select count()
Tal y como está tu código, deberías de hacer algo así:

Código:

CONEXIONES.conexion.IBQuery1.open;
CONEXIONES.conexion.IBQuery1.Last;
SetLength(BtProductos, CONEXIONES.conexion.IBQuery1.RecordCount) ;
CONEXIONES.conexion.IBQuery1.First;


riddick 18-09-2010 20:09:34

ScrollBox violacion de memoria
 
Hola Casimiro Notevi, gracias ya se resolvio el problema tal y como me explicas, el error era que no estaba asignado el valor correcto gracias por prestar atencio a mi problema. saludos


La franja horaria es GMT +2. Ahora son las 12:32:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi