Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ein mir unverständliches Problem ist aufegtaucht. (https://www.delphipraxis.net/69124-ein-mir-unverstaendliches-problem-ist-aufegtaucht.html)

bastischo 10. Mai 2006 15:02


Ein mir unverständliches Problem ist aufegtaucht.
 
Ich weiß, dass der titel doof ist, aber ich aknnes nciht besser beschreiben.
Habe ein programm, in dem sich ein Ball über Die Form bewegen soll, indem er sihc immer wieder neu löscht und zeichnet.
Beim kompilieren hab cih noch keine Fehler, aber an den markierten stellen gibt es dann immer access violations.
Delphi-Quellcode:
unit UHA;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TBall = class
    x,y,r,vx,vy:integer;
    color:TColor;
    procedure init(aX,aY,aVX,aVY,aR:Integer;acolor:TColor);
    procedure move;
    end;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    PaintBox1: TPaintBox;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Basketball:TBall;
implementation

{$R *.dfm}


procedure Tball.move;
begin
    Form1.PaintBox1.Canvas.Brush.Color:=clwhite;
    Form1.PaintBox1.Canvas.Pen.color:=clwhite;
    Form1.PaintBox1.Canvas.Ellipse(x-r,y-r,x+r,y+r);  //<-- und hier.danach isses immer wieder hier bis ich neu starte
    x:=x+vx;
    y:=y+vy;
    Form1.PaintBox1.Canvas.brush.Color:=color;
    Form1.PaintBox1.Canvas.pen.color:=color;
    Form1.PaintBox1.Canvas.ellipse(x-r,y-r,x+r,y+r);
end;

procedure TBall.init(aX,aY,aVX,aVY,aR:Integer;acolor:TColor);
  begin
  Create;
  x:=aX;
  y:=aY;
  vx:=aVX;
  vy:=aVY;
  r:=aR;
  color:=acolor;
  end;



procedure TForm1.Timer1Timer(Sender: TObject);// Intervall=5
begin
Basketball.move;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Basketball.init(50,50,3,-4,10,RGB(255,255,0));
end;   //<---HIER zuerst

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Basketball.Free;
end;


end.
Ich komm nun seit ein paar Stunden einfach nicht darauf, was falsch ist. :gruebel:
Bitte helft einem armen kleinen Jungen

Ultimator 10. Mai 2006 15:06

Re: Ein mir unverständliches Problem ist aufegtaucht.
 
Du createst deine TBall-Instanz nicht ;)

mirage228 10. Mai 2006 15:08

Re: Ein mir unverständliches Problem ist aufegtaucht.
 
Hi,

Du musst eine Klasse mit einem Delphi-Referenz durchsuchenconstructor erzeugen, nicht mit einer Prozedur (Edit: und in dieser musst Du auch nicht "Create" aufrufen :!: )

Delphi-Quellcode:
type
  TBall = class(TObject)
  // der Rest...
  constructor Create(aX,aY,aVX,aVY,aR:Integer;acolor:TColor);
end;

// ..
procedure TForm1.FormCreate(Sender: TObject);
begin
  Basketball := TBall.Create(50,50,3,-4,10,RGB(255,255,0));
end;
Auch würde ich Dir empefehlen, die "BasketBall" Variable in den public Abschnittes des Forms zu velagern.
Außerdem solltest Du bedenken, dass es nicht besonders gut ist, wenn Du aus der TBall Klasse heraus auf die globale Form-Variable zugreifst. Es wäre besser, wenn Du dem TBall im Konstruktor noch einen TCanvas übergeben kannst, auf dem der Ball sich dann zeichnet.

mfG
imrage228

Matze 10. Mai 2006 15:10

Re: Ein mir unverständliches Problem ist aufegtaucht.
 
Moin

Des weiteren ist es auch Unsinn das Timer-Intervall auf 5 zu setzen. Win9x schafft maximal 50ms, Win2000/XP 10ms.

fkerber 10. Mai 2006 15:19

Re: Ein mir unverständliches Problem ist aufegtaucht.
 
Hi!

Wähle doch bitte einen sinnvollen Titel für deinen Thread. Dann kann er bspw. über die Suche besser gefunden werden.


Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz