Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-12-2010
Celta Celta is offline
Miembro
 
Registrado: jul 2010
Ubicación: Salta, Argentina
Posts: 65
Poder: 14
Celta Va por buen camino
liberar memoria

hola a todos del foro, hace mucho que no me conectaba =D(ahora que terminaron mis clases vuelvo =D) estaba revisando mi juego que estaba asiendo y el problema con el que me encontre es que al querer liberar un objeto(la nave enemiga) producto de la colision no lo libera y me aparece un error "acces violation at address"
mi codigo con el que lo libero es el siguiente

Código Delphi [-]
  for i := 0 to (lista.Count - 1) do begin
   imgmisil := TImage(lista[i]);

  imgmisil.Top:=imgmisil.top-7;
                end;
     begin
    for i := 0 to (listaene.Count -1) do begin
       ene := TImage(listaene[i]);
    begin

  a1 := (imgmisil.Left + imgmisil.Width);
  a2 := (ene.Left + ene.Width);
  c1 := (imgmisil.Top + imgmisil.Height);
  c2 := (ene.Top + ene.Height);

  if (((imgmisil.Left < ene.Left) and (a1 > ene.Left)) and
      ((imgmisil.Top < ene.Top) and (c1 > ene.Top))) or

     (((ene.Left < imgmisil.Left) and (a2 > imgmisil.Left)) and
      ((ene.Top < imgmisil.Top) and (c2 > imgmisil.Top))) or

     (((imgmisil.Left < ene.Left) and (a1 > ene.Left)) and
      ((ene.Top < imgmisil.Top) and (c2 > imgmisil.Top))) or

     (((ene.Left < imgmisil.Left) and (a2 > imgmisil.Left)) and
      ((imgmisil.Top < ene.Top) and (c1 > ene.Top))) then begin


                ENE.FREE;

me parece que en la parte que falla es aqui
for i := 0 to (lista.Count - 1) do begin


saludos

Última edición por Casimiro Notevi fecha: 08-12-2010 a las 23:39:43. Razón: Poner etiquetas [delphi] [/delphi]
Responder Con Cita
  #2  
Antiguo 09-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Celta.

Estuve mirando tu código y lo identé para mayor legibilidad, aunque veo que Casimiro ya lo ha echo... ( gracias.)

Al liberar los objetos TImagen, tenés usar el ciclo en forma descendente, ya que cuando un objeto es
liberado la posición es ocupada por el sucesor y cuando la variable de control llegue al valor Count - 1
seguro que hay menos objetos que ese valor.

Te puse el código con algunas correcciones, el cual probé con otras imágenes en una prueba sencilla.
No verifiqué la validez de las evaluaciones del condicional if, pero si son correctas, este código no debería darte error:
Código Delphi [-]
  for i := ListaEne.Count -1 downto 0 do
  begin
    // suponiendo que 'ene' es de tipo TImage
    // y que las comprobaciones sean correctas...
    Ene := ListaEne.Items[i];
    a1 := (imgmisil.Left + imgmisil.Width);
    a2 := (ene.Left + ene.Width);
    c1 := (imgmisil.Top + imgmisil.Height);
    c2 := (ene.Top + ene.Height);
    if (((imgmisil.Left < ene.Left) and (a1 > ene.Left)) and
       ((imgmisil.Top < ene.Top) and (c1 > ene.Top))) or
       ((ene.Left < imgmisil.Left) and (a2 > imgmisil.Left)) and
       ((ene.Top < imgmisil.Top) and (c2 > imgmisil.Top))) or
       (((imgmisil.Left < ene.Left) and (a1 > ene.Left)) and
       ((ene.Top < imgmisil.Top) and (c2 > imgmisil.Top))) or
       (((ene.Left < imgmisil.Left) and (a2 > imgmisil.Left)) and
       ((imgmisil.Top < ene.Top) and (c1 > ene.Top))) then
    begin
      TImage(ListaEne.Items[i]).Free;
      ListaEne.Delete(i);
    end;
  end;

Ya que simplificando el ejemplo, sería:
Código Delphi [-]
   for i:= ListaEne.Count-1 downto 0 do
   begin
     Ene:= ListaEne.Items[i];
     if Ene.Name = 'Imagen1' then
     begin
       TImage(ListaEne.Items[i]).Free;
       ListaEne.Delete(i);
     end;
   end;

Un saludo.

Última edición por ecfisa fecha: 09-12-2010 a las 01:50:00.
Responder Con Cita
  #3  
Antiguo 09-12-2010
Avatar de kurono
[kurono] kurono is offline
Miembro Premium
 
Registrado: jul 2007
Ubicación: Republica Dominicana
Posts: 1.126
Poder: 18
kurono Va por buen camino
amigo celta ese juego que estas haciendo sera comercial o lo liberara cuando lo termine me gustaria ver el codigo completo del juego
Responder Con Cita
  #4  
Antiguo 11-12-2010
Celta Celta is offline
Miembro
 
Registrado: jul 2010
Ubicación: Salta, Argentina
Posts: 65
Poder: 14
Celta Va por buen camino
si me da error

no se por que me da error la parte de Ene := ListaEne.Items[i];
Responder Con Cita
  #5  
Antiguo 11-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Celta.

La verdad que yo tampoco por que no me dá ningún error de ese modo.
Te pongo la prueba sencilla que hice, por ahí te sirve para sacar alguna idea.

Código Delphi [-]
type
  TForm1 = class(TForm)
    btCargar: TButton;
    btMostrar: TButton;
    btLiberar: TButton;
    procedure btCargarClick(Sender: TObject);
    procedure btMostrarClick(Sender: TObject);
    procedure btLiberarClick(Sender: TObject);
  private
    FLst: TList;
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

uses Jpeg;

procedure TForm1.btCargarClick(Sender: TObject);
var
  Img: TImage;
  i: Integer;
begin
  FLst:= TList.Create;
  for i:= 1 to 5 do
  begin
    Img:= TImage.Create(Self);
    Img.Name:= 'Img'+IntToStr(i);
    Img.Left := 120*i;
    Img.Stretch:= True;
    Img.Picture.LoadFromFile('C:\FOTO.JPG'); // la imagen que quieras
    FLst.Add(Img);
  end;
end;

procedure TForm1.btMostrarClick(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to FLst.Count -1 do
    TImage(FLst.Items[i]).Parent:= Self;
end;

procedure TForm1.btLiberarClick(Sender: TObject);
var
  i: Integer;
  Ene: TImage;
begin
  for i:= FLst.Count - 1 downto 0 do
  begin
    Ene:= TImage(FLst.Items[i]);
    if (Ene.Name = 'Img1') or (Ene.Name = 'Img3') then
    begin
      TImage(FLst.Items[i]).Free;
      FLst.Delete(i);
    end;
  end;
end;

Funciona igual si eliminas todos los items de la lista, el if lo puse para simular un condicional como en tu código.

Espero te ayude.

Saludos.
Responder Con Cita
  #6  
Antiguo 12-12-2010
Celta Celta is offline
Miembro
 
Registrado: jul 2010
Ubicación: Salta, Argentina
Posts: 65
Poder: 14
Celta Va por buen camino
Ahora Si Me Funciona =d

Grasias Ahora Si Me Funciona
Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Liberar memoria usb jarr-o Varios 2 13-08-2008 19:01:07
Liberar memoria vicvil Varios 13 30-10-2006 18:14:38
Liberar memoria Sick boy Varios 6 02-07-2005 11:11:29
Liberar Memoria JoseQ Varios 6 16-07-2004 19:49:21
Liberar Memoria susje Varios 3 01-08-2003 00:18:18


La franja horaria es GMT +2. Ahora son las 14:23:44.


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