Einzelnen Beitrag anzeigen

Benutzerbild von KahPee
KahPee

Registriert seit: 12. Mai 2009
214 Beiträge
 
Turbo Delphi für Win32
 
#1

Zuweisung eines Bildes macht Probleme

  Alt 21. Mai 2009, 17:10
Dieser Thread hat lange Quelltexte allerdings ist nur der erste Beitrag zum Verständnis wichtig (weiter unten ist der Absatz der das eigentliche Problem beschreibt hervorgehoben). der dritte und vierte Beitrag liefern wichtige Hinweise während der zweite nur als referenz den Quelltext zeigt.

Hallo,
ich programmiere im Moment an einem kleinen Spiel. Dabei werden beim Klicken auf eines der felder eines 7*7 2DBrettes Karten umgedreht. Beim Starten des Spiel funktioniert das zuweisen von Bildern noch super zu den einzelnen Feldern, allerdings gibt es nun Probleme. Die fehlermeldung erscheint nicht beim Compilieren sondern zur Laufzeit. Ich habe folgendes Onclickereingis erzeugt:

Delphi-Quellcode:
procedure TForm1.OnImageClick(Sender: TObject); //Beim Klicken auf ein Feld
var x,y: integer;
begin
   x:=Tfieldpic(Sender).Fieldx; //Feldkoordinaten von obenlinks aus gesehen zuweisen, sodass
   y:=Tfieldpic(Sender).Fieldy; // die Koordinaten verwendet werden können durch den Array eines
                                           // Feldes das richtige Feld ansprechen zu können
   if fields[x,y].picstatus=hidden then //Falls Karte noch nicht aufgedeckt
    begin
     ShowCard(x,y); //führe die Prozedur: Aufdecken der Karte aus , x und y werden übergeben damit das feld angesprochen werden kann auf das geklickt wurde
    end
   else
   begin
   showmessage('nicht versteckt');
   end;
end;
Diese Prozedur wirf noch keine Probleme auf, vielmehr ist es die in der Prozedur aufgerufene Prozedur "ShowCard". Die Zuweisung der Variablen x und y funktioniert problemfrei dies hatte ich nach dem schreiben auch mittels Dialogfeldern gecheckt, die beim Klicken auf ein Feld die Koordinaten anzeigen. Nun zu dem Problem mit der Prozedur "ShowCard":
Delphi-Quellcode:
procedure Tform1.ShowCard(x,y: integer); //Prozedur zum Umdrehen einer Karte , x und y um wieder das richtige Feld ansprechen zu können
var rand,rand2: integer;
begin

 rand:=random(48)+1; //1..8jae 9..10holzf 11..12baer 13..18fuchs 19..26fasan 27..33ente 34..40nadel 41..48laub
                      {die Zahlen 1-8 sollen das Umdrehen eines Jägers zur Folge haben, die Zahlen 9-10 das eines holzfällers, usw}
   //jae tritt ein
     if (rand=1) or (rand=2) or (rand=3) or (rand=4) or (rand=5) or (rand=6) or (rand=7) or (rand=8) then //falls rand 1-8 soll versucht werden einen Jaeger umzudrehen
        begin
         if totala.jae>0 then //falls noch Jäger im Spiel sind (es dürfen maximal 8 Jäger im Spiel sein)
          begin
           rand2:=random(4)+1; //zweite Zufallsvariable, da Jäger in vier richtungen aufgedeckt werden können
                                        //1=schussrichtung links, 2=Schussrichtung rechts, 3=schussrichtung oben, 4=schussrichtung unten
           fields[x,y]:=Cjae; // dem Feld werden die standardmäßigen Jäger eigenschaften zugewiesen
           totala.jae:=totala.jae-1;
                //1jaeleft 2jaeright 3jaeup 4jaedown
           if rand2=1 then //Jaeger mit schuss nach links wird erzeugt
             begin
               fields[x,y].pic.picture.assign(piclist[0,0]); //Bild mit dem nach linksgerichteten Jäger wird zugewiesen
               fields[x,y].picindex.typ:=0; //die dazugehörige Bildindexnummer wird zugewiesen
               fields[x,y].picstatus:=shown;
             end
           else if rand2=2 then //Jaeger mit schuss nach rechts wird erzeugt (rest wie oben)
             begin
               fields[x,y].pic.picture.assign(piclist[1,0]); //piclist ist ein Bilderindex
               fields[x,y].picindex.typ:=1;
               fields[x,y].picstatus:=shown;
             end
           else if rand2=3 then
             begin
              fields[x,y].pic.picture.assign(piclist[2,0]);
              fields[x,y].picindex.typ:=2;
              fields[x,y].picstatus:=shown;
             end
           else if rand2=4 then
             begin
              fields[x,y].pic.picture.assign(piclist[3,0]);
              fields[x,y].picindex.typ:=3;
              fields[x,y].picstatus:=shown;
             end;
         end
         else if totala.jae=0 then //falls schon alle Jäger aufgedeckt waren Prozedur nochmal ausführen (später führt dies zum aufdecken der anderen Karten)
          begin
           showmessage('alle 8 jäger aufgedeckt');
           ShowCard(x,y);
          end;
        end
  //iwasanderes tritt ein
     else
     begin
       showmessage('kein Jäger aufgedeckt');
     end;


end;

Die Prozedur ist noch nicht fertig die Teile zum aufdecken der anderen Karten kommt später hinzu. Nun habe ich folgenden Fehler: Wenn nach dem Klicken auf ein Feld die Zufallsvariable nicht einen Wert von 1-8 erhält so kommt ganz richtig die Meldung" Kein Jäger aufgedeckt". Wenn allerdings das Ereignis das rand=1-8 eintritt so bekomme ich einen "Access Violation" fehler.
Nun das Kuriose:
Das ganze erzeugt überhaupt keinen fehler sobal ich
fields[x,y].pic.picture.assign(piclist[0,0]); durch fields[1,1].pic.picture.assign(piclist[0,0]); Daher dachte ich, dass es an dem Übergeben der Koordinatenvariablen x und y liegen müsste aber auch das ist nicht der Fall denn diese Zeile:
fields[x,y].picstatus:=shown; funktioniert einwandfrei (getestet durch showmessage)

Nun die Frage: Was mache ich falsch, sodass es nicht möglich ist dem feld auf das ich KLICKE (das ist ja nicht in jedem Fall das mit den koordinaten x=1 und y=1) ein Bild aus der Liste zuzuweisen?

Über Hilfe würde ich mich sehr freuen. Schon mal vielen Dank im Vorraus

mfg KahPee
  Mit Zitat antworten Zitat