![]() |
Probleme mit Free und AccessViolence
habe mal versucht images von oben nach unten durchs bild laufen zu lassen.
hat auch funktioniert bis ich gemerkt hab das alles immer langsamer wird. da ist mir die idee gekommen, dass ich mein erzeugten images "unter" dem formblatt weiterlaufen. habe dann das mit free versucht und nachdem die ersten parr images aus dem bild waren, kam ein AccessViolence problem. hier mal der code:
Delphi-Quellcode:
wenn ich die zeile mit den sternchen weglass funktioniert das progrämmchen recht gut bis auf das flackern und dass meine runden steine einen eckigen kasten haben.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; Timer1: TTimer; Timer2: TTimer; procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1 : TForm1; image : array of TImage; // j : Integer = 0; i : Integer = 0; k : Integer = 0; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin randomize; if (k=0) or ((k mod 50) = 0) then begin SetLength(image,i+1); image[i] := TImage.Create(Form1); image[i].Left := Random((Width-image[i].Width)); image[i].Picture.LoadFromFile('stein.bmp'); image[i].Parent := Form1; image[i].Top := -image[i].Height; Inc(i); end else begin Inc(k); end; if i = 100 then timer1.Enabled := false; end; procedure TForm1.Timer2Timer(Sender: TObject); var j : integer; begin for j:= 0 to (i-1) do begin image[j].Top := image[j].Top + 1; **if image[j].Top >= Height then image[j].Free; end; end; end. |
Re: Probleme mit Free und AccessViolence
Moin Knut,
wenn Du die Zeile ausführst, und das Image freigibst, dann wird der Versuch eine Eigenschaft des Images anzusprechen immer fehlschlagen, da das Image nicht mehr existiert. Randomize sollte übrigens immer nur einmal ausgeführt werden, also pack's am besten in's OnCreate des Formulares. Das Geschwindigkeitsproblem wird vermutlich von dieser Zeile verursacht:
Delphi-Quellcode:
Jedesmal, wenn Du die Grösse des Arrays änderst wird neuer Speicher reserviert, und das bisherige Array umkopiert.
SetLength(image,i+1);
Am besten das Array möglichst ausreichend gross dimensionieren, und nur im Notfall vergrössern. Dann aber nicht um 1. Schau Dir mal, entsprechende Windowsversion oder Tool vorausgesetzt, an, wie der Speicherverbrauch des Programmes ist. Der müsste ständig steigen. |
Re: Probleme mit Free und AccessViolence
alles klar hast natürlich recht mim speicher! werd jetzt die images immer wieder von unten nach oben holen ;)
aber gibts eigentlich ne besser methode als mit nem array?? neuer thread richtig?? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz