Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit Free und AccessViolence (https://www.delphipraxis.net/7331-probleme-mit-free-und-accessviolence.html)

Knut 9. Aug 2003 16:08


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:
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.
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.

Christian Seehase 9. Aug 2003 16:18

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:
SetLength(image,i+1);
Jedesmal, wenn Du die Grösse des Arrays änderst wird neuer Speicher reserviert, und das bisherige Array umkopiert.
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.

Knut 9. Aug 2003 16:33

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