Avatar billede maabjerg Nybegynder
08. december 2007 - 16:43 Der er 7 kommentarer

Har problemer med at fjerne objekter og ryde hukommelsen?

Hej Eksperter

Jeg er i gang med et spil, men jeg er stødt ind i et problem. Jeg skulle helst gerne rydde op i hukommelsen og slette nogle objekter, men jeg ved ikke helt hvordan man gør og hvordan det hænger sammen. indtil videre har jeg fundet ud af det er noget med en pointer man skal have på et objekt. Men er der nogen der kan forklare mig helt præcist hvordan det hænger sammen? :)

På forhånd tak!

Med venlig hilsen
Steffen Maabjerg
Avatar billede maabjerg Nybegynder
08. december 2007 - 16:51 #1
Jeg har følgende objekter:

Gaver : array of TImage;

og det indeholder så en masse objekter af TImage;

Men hvordan kan jeg slette dem, så de ikke er der længere?
Avatar billede martinlind Nybegynder
08. december 2007 - 20:15 #2
Opretter :

for I := Low(Gaver) to Hi(Gaver) do Gaver[I] TImage.Create(NIL);

Sletter/Fjerner

for I := Low(Gaver) to Hi(Gaver) do Gaver[I].Free;
Avatar billede martinlind Nybegynder
08. december 2007 - 20:17 #3
Et Object i Delphi er lig en pointer. Man opretter/alloker hukommelse med funktionen Create(); og fjerner/sletter med funktionen Free; det er to funktioner som ligger på TObject klassen.
Avatar billede hrc Mester
08. december 2007 - 21:52 #4
Jeg gentager mig selv. Brug en TObjectList til at indeholde objekterne. Når du frigiver objektlisten frigiver du også det der er i listen - og så er den bedre end en ARRAY OF konstruktion. Det irriterer mig at den vælges når der er en anden der er meget bedre.

Hvis du kreerer en TImage med en owner, eksempelvis TImage.Create(self), er det self's ansvar at rydde op (TImage hægter sig på en liste over objekter som self skal frigive). Det er derfor du kun behøver frigive en form og ikke alle de komponenter der er på den.

Bemærk, at self er (pointeren til) den objektinstans hvori objektet oprettes.
Avatar billede maabjerg Nybegynder
09. december 2007 - 15:44 #5
Okay :)

Forstår ikke helt hvordan jeg skal lave det endnu, altså lige nu har jeg en timer, som en gang i sekundet udfører følgende kode:

SetLength(objGaver, Length(objGaver)+1);
  objGaver[GaverCount] := TImage.Create(self);
  objGaver[GaverCount].Parent := Form2;
  objGaver[GaverCount].AutoSize := true;
  objGaver[GaverCount].Left := RandomRange(10, 520);
  objGaver[GaverCount].Top := 220;
  objGaver[GaverCount].Picture.LoadFromFile('gfx/' + FarveGave(RandomRange(0,5)));
  inc(GaverCount);

GaverCount er så bare en integer der bliver countet hele tiden, for at finde den rette plads i arrayet.

Men jeg ved så ikke hvordan jeg skal få dem slettet igen, jeg har prøvet følgende, når man har fanget de gaver i spillet, som man skal kører jeg følgende kode:

while i < Length(objGaver) do
begin
      objGaver[i].Free;
end;
SetLength(objGaver, 0);

Men det virker ikke rigtigt. Hva kan jeg gøre?
Avatar billede hrc Mester
09. december 2007 - 20:39 #6
Det eneste sted hvor sådan en array of <et eller andet> er på sin plads er ved COM-objekter og som "gummi"-parameter i procedure-kald. Alle andre steder er det på sin plads at bruge TObjectList (Det er også lettere).

I øvrigt burde du ikke skrive objGaver[GaverCount] så mange gange. Tænk på at programmet laver opslag i listen hver gang. Det er ineffektivt.

Den rigtige måde er denne:
var
  Image: TImage;
  NewLgd: integer;
begin
  Image := TImage.Create(nil); // Ikke self når du frigiver listen selv
  Image.Parent := self; // Form2 er garanteret self, ikke?
  Image.AutoSize := true;
  Image.Left := RandomRange(10, 520);
  Image.Top := 220;
  Image.Picture.LoadFromFile(gfx/' + FarveGave(RandomRange(0,5)));

  NewLgd := Length(objGaver) + 1;
  SetLength(objGaver,NewLgd);
  objGaver[NewLgd] := Image;
end;

Hvis du angiver self i constructoren på TImage fortæller du self (a.k.a. Form2) at den skal sørge for at frigive.
Avatar billede martinlind Nybegynder
10. december 2007 - 09:58 #7
------ Forkert ------------------
while i < Length(objGaver) do
begin
      objGaver[i].Free;
   
end;
SetLength(objGaver, 0);

------------------
Du skal kører i en løkke som jeg skrev. denne koder Free'er bare det samme obj. nemli [i], fordi I ikke bliver talt ned, og dit array bliver ikke autonatisk en mindre fordi du free'er.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester