Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2010
riddick riddick is offline
Registrado
 
Registrado: sep 2010
Posts: 4
Poder: 0
riddick Va por buen camino
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

Última edición por Casimiro Notevi fecha: 18-09-2010 a las 12:01:37.
Responder Con Cita
  #2  
Antiguo 18-09-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #3  
Antiguo 18-09-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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;
Responder Con Cita
  #4  
Antiguo 18-09-2010
riddick riddick is offline
Registrado
 
Registrado: sep 2010
Posts: 4
Poder: 0
riddick Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
violacion de direccion de memoria anubis Varios 3 09-05-2007 00:48:38
Violacion De Acceso elguille Varios 2 17-10-2005 16:32:56
Violacion de memoria cuando termina un procedure gatosoft OOP 2 07-04-2005 02:26:41
Violacion en FreeReport brandolin Impresión 0 27-08-2004 18:29:55
violacion en picklist !!! Lepe Varios 0 13-09-2003 18:22:12


La franja horaria es GMT +2. Ahora son las 14:42:39.


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
Copyright 1996-2007 Club Delphi