Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Spiel für Informatik Unterricht!! (https://www.delphipraxis.net/60570-spiel-fuer-informatik-unterricht.html)

eMGee 9. Jan 2006 18:24

Re: Spiel für Informatik Unterricht!!
 
delphi 7 personal

ichbins 9. Jan 2006 18:31

Re: Spiel für Informatik Unterricht!!
 
Liste der Anhänge anzeigen (Anzahl: 1)
dann müsste doch normalerweise bei jedem Fehler Delphi mit einer solchen Meldung kommen (siehe Anhang) Die Beispielmeldung is Delphi2005 aber von 7 auf 2005 hat sich da nicht viel geändert. da klickst du auf ANHALTEN, dann markiert er die Fehlercodezeile (soweit er kann). Wenn die Fehlermeldung nicht kommt, dann klickst du mal 'n bisschen im Delphi-Menü rum bis du auf Debugger-Optionen kommst (glaub unter TOOLS). Da markierst du die Checkbox BEI EXCEPTIONS STOPPEN.

eMGee 9. Jan 2006 18:39

Re: Spiel für Informatik Unterricht!!
 
Also es liegt eindeutig an dieser Stelle:

Delphi-Quellcode:
aktuellerRaum:= aktuellerRaum.Norden;
also an aktuellerRaum, habe jetzt mal probiert alles nacheinander aus der prozedur rauszuholen und sobald nichts mehr mit aktuelleRaum drin ist läufts.... also hier nochmal der ganze quelltext habe absolut keine Ahnung was mit aktuellerRaum nicht stimmt.... :evil:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Image1: TImage;
    Memo1: TMemo;


    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TRaum=class
    Beschreibung:String;
    Bild:String;
    Norden,Osten,Sueden,Westen:TRaum;
    procedure setAusgaenge(norden,osten,sueden,westen:TRaum);
end;


var
  Form1: TForm1;
  Room: array [1..16] of TRaum;
  aktuellerRaum:TRaum;

implementation

{$R *.dfm}

procedure TRaum.setAusgaenge(norden,osten,sueden,westen:TRaum);
begin
  self.Norden:= norden;
  self.Osten:= osten;
  self.Sueden:= sueden;
  self.Westen:= westen;
end;

procedure TForm1.FormCreate(Sender:TObject);
var i: integer;
begin

  //---Räume erzeugen---
  for i:=1 to 16 do
  begin
    Room[i]:=TRaum.Create;
    Room[i].Beschreibung:='blabla';
    Room[i].Bild:='Bilder\raum'+IntToStr(i)+'.jpg';
  end;

    aktuellerRaum:=TRaum.Create;


  //---Ausgänge setzen---
  room[1].setAusgaenge(nil,room[2],room[5],nil);
  room[2].setAusgaenge(nil,room[3],room[6],room[1]);
  room[3].setAusgaenge(nil,room[4],room[7],room[2]);
  room[4].setAusgaenge(nil,nil,room[8],room[3]);
  room[5].setAusgaenge(room[1],room[6],room[9],nil);
  room[6].setAusgaenge(room[2],room[7],room[10],room[5]);
  room[7].setAusgaenge(room[3],room[8],room[11],room[6]);
  room[8].setAusgaenge(room[4],nil,room[12],room[7]);
  room[9].setAusgaenge(room[5],room[10],room[13],nil);
  room[10].setAusgaenge(room[6],room[11],room[14],room[9]);
  room[11].setAusgaenge(room[7],room[12],room[15],room[10]);
  room[12].setAusgaenge(room[8],nil,room[16],room[11]);
  room[13].setAusgaenge(room[9],room[14],nil,nil);
  room[14].setAusgaenge(room[10],room[15],nil,room[13]);
  room[15].setAusgaenge(room[11],room[16],nil,room[14]);
  room[16].setAusgaenge(room[12],nil,nil,room[15]);

  aktuellerRaum:=room[1];

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (aktuellerRaum.Norden <> nil) then
  begin
    aktuellerRaum:= aktuellerRaum.Norden;
    Image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+aktuellerRaum.Bild);
    Memo1.Lines.Add(aktuellerRaum.Beschreibung);
  end;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
  if (aktuellerRaum.Sueden <> nil) then
  begin
    aktuellerRaum:= aktuellerRaum.Sueden;
    Image1.Picture.LoadFromFile(aktuellerRaum.Bild);
    Memo1.Lines.Add(aktuellerRaum.Beschreibung);
  end;
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
  if (aktuellerRaum.Westen <> nil) then
  begin
    aktuellerRaum:= aktuellerRaum.Westen;
    Image1.Picture.LoadFromFile(aktuellerRaum.Bild);
    Memo1.Lines.Add(aktuellerRaum.Beschreibung);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  aktuellerRaum:= aktuellerRaum.Westen;
end;

end.

ichbins 9. Jan 2006 18:44

Re: Spiel für Informatik Unterricht!!
 
Aktuellerraum wurde nicht erzeugt. Das musst du in der formcreate noch einfügen:
Delphi-Quellcode:
aktuellerraum:=traum.create;
raum[i].norden/westen/süden/osten musst du auch erstellen.

Airblader 9. Jan 2006 18:45

Re: Spiel für Informatik Unterricht!!
 
@ichbins

aktuellerraum wird aber room[1] zugewiesen, und das ist instanziert...

air

eMGee 9. Jan 2006 18:46

Re: Spiel für Informatik Unterricht!!
 
doch das ist drin.. guck mal unter //Räume erzeugen

Airblader 9. Jan 2006 18:48

Re: Spiel für Informatik Unterricht!!
 
Zitat:

Zitat von eMGee
doch das ist drin.. guck mal unter //Räume erzeugen

Versuche es mal eben wegzulassen.
Da du aktuellerRaum ja room[1] zuweist, die instanziert ist, brauchst du aktuellerRaum keine eigene Instanz verpassen.

air

ichbins 9. Jan 2006 18:49

Re: Spiel für Informatik Unterricht!!
 
ich glaube das ganze wäre weeeeeeeiiiiiiit einfacher wenn du statt den Klassen records verwenden würdest und die setausgänge-Prozedur so gestaltest:

Delphi-Quellcode:
procedure setausgaenge(raum,nordausgang,südausgang,ostausgang,westausgang:traum);
begin
  raum.nord:=nordausgang;
  raum.
  ...
end;
oder poste mal deinen Code.

der-olli 15. Jan 2006 19:21

Re: Spiel für Informatik Unterricht!!
 
Hi eMGee,

also das mit dem
Delphi-Quellcode:
aktuellerRaum:=TRaum.Create;
würde ich ganz schnell wieder vergessen, da du aktuellerRaum ja danach eh wieder überschreibst und dadurch nur ein Speicherleck entsteht, da du das vorher erzeugte Objekt aktuellerRaum nie wieder freigibst (was ja schon gesagt wurde). (genauso müsstest du auch im OnDestroy-Event die ganzen Räume mit room[i].Destroy (i=1..16) wieder freigeben)

Zu deiner AccessViolation schlage ich dir mal vor, einfach auf dein Formular zu gehen, und in den Objekt-Inspektor bei dem Ereignis OnCreate FormCreate einzutragen. So wie das aussieht, werden nämlich deine ganzen Räume (und damit ja auch aktuellerRaum) nie einem Wert zugewiesen (bzw. haben rein zufällige Werte), da ja das OnCreate gar nicht erst aufgerufen wird. (Setze dich in diesem Zusammenhang am besten gleich mal mit Haltepunkten / Debugger auseinander -> Delphi-Hilfe oder deinen Informatik-Lehrer fragen :) ) Damit will Delphi dann z.B. im Button1Click-Event auf
Delphi-Quellcode:
aktuellerRaum.Norden
zugreifen, was aber natürlich nicht geht, da der Speicher-Bereich, auf den aktuellerRaum zeigt, gar nicht existiert.

Hoffe damit sind die Fragen geklärt.

Grüße

Olli

CPP-Programmer 17. Jan 2006 13:18

Re: Spiel für Informatik Unterricht!!
 
Wäre net wenn du hier euer Programmiertes spiel reinstellen könntest + Source.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
Seite 4 von 4   « Erste     234   

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