AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit dynamischer Array und eaccessviolation

Ein Thema von fox67 · begonnen am 4. Apr 2012 · letzter Beitrag vom 7. Apr 2012
Antwort Antwort
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 11:20
width-33 hat den Sinn das der kreis nicht vom Fenster verschwindet(natürlich wäre clientwidth sinnvoller). Tja ich hab wohl vergessen das ich form1 bereits als Fenster deklariert habe. Diene Idee ist schlau mit den Vorzeichen darauf wärer ich kar nicht gekommmen vielen dank
  Mit Zitat antworten Zitat
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 13:57
So nach dem der erste Teil jetzt fertig ist hab ich mich an den zweiten gemacht und es hatt sich wieder ein fehler eigeschlichen. Beim zweiten teil des spieles geht es darum vor der Polizei zu entwischen.
Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class;
  TPolizei = class;
  TSpiel2 = class;

  TPolizei = class(Tobject)
    private
      { Private-Deklarationen }
      Fenster : TForm2;


     rpunkt : TPoint;

     Haupt : Tspiel2;
    public
      { Public-Deklarationen }


      procedure Bewegung();
  end;

  TSpiel2 = class
   private
    { Private-Deklarationen }
    rSpielfigur : TImage;

    rPause : Boolean;
    rDiamant : Timage;
    Polizei : TPolizei;
    rkollison1 : Tshape;
    sh : array of TImage;
    shpos : array of TPolizei;
    rZeit : Integer;

    anzahl : integer;
    Fenster : Tform2;

  public
    { Public-Deklarationen }
    procedure Polizeierstellen();

    procedure Erstellen();


    constructor Create;
    destructor Destroy; override;
  end;


  TForm2 = class(TForm)
    Engine: TTimer;
    kollision: TTimer;
    Special: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Onclose(Sender: TObject; var Action: TCloseAction);
    procedure OnkeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure EngineTimer(Sender: TObject);
    procedure kollisionTimer(Sender: TObject);
    procedure SpecialTimer(Sender: TObject);
  private
    { Private-Deklarationen }
    Spiel2 : Tspiel2;
    Laser : TPolizei;
    Aktiv : Boolean;
    Zeit : String;
    z1,z2 : integer;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
   T,T1 : integer;
  X : integer;
  F : integer;

implementation

{$R *.dfm}

procedure TPolizei.Bewegung;
begin
  if haupt.rSpielfigur.Top < rpunkt.Y then rpunkt.Y := rpunkt.Y -1;
  if haupt.rSpielfigur.Top > rpunkt.Y then rpunkt.Y := rpunkt.Y +1;
  if haupt.rSpielfigur.Left < rpunkt.X then rpunkt.X := rpunkt.X -1;
  if haupt.rSpielfigur.Left > rpunkt.X then rpunkt.X := rpunkt.X +1;
  
  
end;

constructor Tspiel2.Create;
begin
   Polizei := TPolizei.Create;
   rkollison1 := TShape.create(nil);

  rkollison1.Parent := fenster;

  rkollison1.Visible:= false;

  rSpielfigur := Timage.Create(nil);
  rSpielfigur.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\rechts.bmp');
  rSpielfigur.Top:= 0;
  rSpielfigur.Left:= 30;
  rSpielfigur.AutoSize := true;
  rSpielfigur.Picture.Bitmap.TransparentColor := clyellow;
  rSpielfigur.Picture.Bitmap.Transparent := true;
  rSpielfigur.Transparent:=true;
  rSpielfigur.Parent := fenster;
  rkollison1.Height := rSpielfigur.Height;
  rkollison1.Width := rSpielfigur.Width -13;

  T:= 1;
  F := 1;
  Polizeierstellen;
end;
procedure TForm2.EngineTimer(Sender: TObject);
var
index : word;
begin
If not Spiel2.rPause then form2.Caption := 'Aspirin'+' '+ Zeit ;
If Spiel2.rPause then form2.Caption := 'Aspirin'+' '+'Pause';
if Spiel2.rZeit > 0 then
begin
if t1 = 1 then
begin
//showmessage('Jetzt') ;
for index := 0 to Spiel2.anzahl-1 do
 begin

 Spiel2.shpos[index].Bewegung();

  Spiel2.sh[index].Top := Spiel2.shpos[index].rpunkt.Y;
  Spiel2.sh[index].Left := Spiel2.shpos[index].rpunkt.X;
// sh2[index].Bewegung;

  end;
end;
end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Zeit := '2:00';
form2.Width := 800;
form2.Height := 600;

Spiel2 := TSpiel2.Create;
Spiel2.rPause := true;

Form2.DoubleBuffered:=True;
end;

procedure TForm2.kollisionTimer(Sender: TObject);
var
index : word;
r : Trect;
begin
if t1 = 1 then
 begin
for index := 0 to Spiel2.anzahl-1 do
 begin
     if intersectrect(r, Spiel2.rkollison1.BoundsRect, Spiel2.sh[index].BoundsRect ) then
     begin
     showmessage('Sie wurden erwischt');
     application.Terminate;
     end;
  end;
 end;
end;


procedure TForm2.Onclose(Sender: TObject; var Action: TCloseAction);
begin
Spiel2.Free;

end;

procedure TForm2.OnkeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if not Spiel2.rPause then
begin
  case key of
  vk_down: begin
             if Spiel2.rSpielfigur.Top< 520 then
              begin
             Spiel2.rSpielfigur.Top := Spiel2.rSpielfigur.Top + 4;
             Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
             Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;
              end;
           end;
  vk_up: begin
         if not Spiel2.rSpielfigur.Top<0 then
         begin
         Spiel2.rSpielfigur.Top := Spiel2.rSpielfigur.Top -4;
         Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
         Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;
         end;
         end;
  vk_left: begin
           if not Spiel2.rSpielfigur.Left<0 then
           begin
           Spiel2.rSpielfigur.Left:= Spiel2.rSpielfigur.Left -4;
           Spiel2.rSpielfigur.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\links.bmp');
           Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
           Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;
           end;
           end;
  vk_right: begin
           if Spiel2.rSpielfigur.Left < 730 then
           begin
            Spiel2.rSpielfigur.Left:= Spiel2.rSpielfigur.Left +4;
            Spiel2.rSpielfigur.Picture.Bitmap.LoadFromFile(ExtractFilePath(Application.ExeName) + '\Bilder\rechts.bmp');
            Spiel2.rkollison1.Top := Spiel2.rSpielfigur.Top;
            Spiel2.rkollison1.Left := Spiel2.rSpielfigur.Left +8;

           end;
            end;


  end;
end;
if key = vk_space then
begin
case T of
0: begin
   Spiel2.rPause :=true;
   T:=1;
   end;
1: begin
   Spiel2.rPause := false;
   T:=0;
   end;

 end;
end;
end;

procedure TForm2.SpecialTimer(Sender: TObject);
var

sl: TStrings;
r : integer;

begin
spiel2.rZeit:= spiel2.rZeit +1;

   sl := TStringlist.Create;
   sl.Delimiter := ':';
   sl.DelimitedText := Zeit;
   z1 := strtoint(sl[0]);
   z2 := strtoint(sl[1]);
   if z2 = 0 then
   begin
   z1 := z1 -1;
   z2 := 59;
   end;
   z2:= z2-1;
   Zeit := inttostr(z1)+ ':' + inttostr(z2);
   sl.Free;
   r := r+1;
   if r=15 then
   begin
   Spiel2.Polizeierstellen;
   r:=0;
   end;

if spiel2.rZeit = 7200 then Special.Enabled:= false;

end;

destructor Tspiel2.Destroy;
begin
  rSpielfigur.Free;

Polizei.Free;
setlength(sh, 0);
setlength(shpos, 0);
end;

procedure Tspiel2.Erstellen;
begin
   shpos[anzahl]:= TPolizei.Create;
   shpos[anzahl].Bewegung;
   shpos[anzahl].rpunkt.X := 400;
   shpos[anzahl].rpunkt.Y := 600;
   sh[anzahl] := TImage.Create(nil);
   sh[anzahl].Parent:= form2;
   sh[anzahl].Top := 600;
  sh[anzahl].Left := 400;
  sh[anzahl].Picture.Bitmap.LoadFromFile(extractfilepath(application.ExeName) + '\Bilder\Polizei_rechts.bmp');
  sh[anzahl].AutoSize:=true;
  sh[anzahl].Picture.Bitmap.TransparentColor:= clwhite;
  sh[anzahl].Picture.Bitmap.Transparent :=true;
  sh[anzahl].Transparent:=true;
  t1 := 1;

end;

procedure TSpiel2.Polizeierstellen;
begin
 t1 := 0;
  x :=length(shpos);
 //showmessage(inttostr(x)+ ' ' + inttostr(length(shpos))+ ' '+ inttostr(anzahl)+ ' ' + inttostr(length(sh)));
 setlength(sh,x+1);
 setlength(shpos, x+1);


 erstellen;
 if length(shpos)>0 then anzahl := length(shpos);

end;

end.

Geändert von mkinzler ( 6. Apr 2012 um 13:59 Uhr) Grund: Code-Tag durch Delphi-Tag ersetzt
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 14:00
Was funktioniert nicht richtig? Oder wo kommt ein Fehler?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 14:03
Wieso muss jede Klasse jede andere kennen? Und weshalb greifst Du in Methoden der Klasse TForm2 schon wieder auf die benannte Instanz Form2 zu?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 14:10
es hagelt wieder eaccesviolation leider
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.875 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 14:11
es hagelt wieder eaccesviolation leider
Und wo?
Markus Kinzler
  Mit Zitat antworten Zitat
fox67

Registriert seit: 6. Okt 2010
Ort: 72661 Grafenberg
181 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 17:13
Würde ich selber gerne wissen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.376 Beiträge
 
Delphi 12 Athens
 
#8

AW: Problem mit dynamischer Array und eaccessviolation

  Alt 6. Apr 2012, 17:18
Deubugger und Projektoptionen (Bereichsprüfung).

Es währe ganz praktisch, wenn du das mal beherzigen und verwenden würdest.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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