AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zuweisung eines Bildes macht Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

Zuweisung eines Bildes macht Probleme

Offene Frage von "KahPee"
Ein Thema von KahPee · begonnen am 21. Mai 2009 · letzter Beitrag vom 22. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
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, 16: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
Benutzerbild von KahPee
KahPee

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

Re: Zuweisung eines Bildes macht Probleme

  Alt 21. Mai 2009, 18:23
Aufgrund der Nachfrage hier nochmal den kompletten Quellcode. Unit2 hat definitiv keinen Einfluss. Die Prozedur Gamestart wird vor allen anderen Prozeduren ausgeführt.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, jpeg, ExtCtrls, ComCtrls;

type Tfieldpic = class(TImage)
      private
      FFieldx : Integer;
      FFieldy : integer;
      public
      property Fieldx : integer read FFieldx write FFieldx;
      property Fieldy : integer read FFieldy write FFieldy;
end;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    men1: TMenuItem;
    Info1: TMenuItem;
    Label1: TLabel;
    Lbrown: TLabel;
    Lblue: TLabel;
    LTeamblue: TLabel;
    LTeamBrown: TLabel;
    Label3: TLabel;
    Label2: TLabel;
    Lbluepoints: TLabel;
    Lbrownpoints: TLabel;
    Lbluebaer: TLabel;
    Lbluefuchs: TLabel;
    Lbluejaeger: TLabel;
    Lblueholzfaeller: TLabel;
    Lblueente: TLabel;
    Lbluefasan: TLabel;
    Lbrownbaer: TLabel;
    Lbrownfuchs: TLabel;
    Lbrownjaeger: TLabel;
    Lbrownholzfaeller: TLabel;
    Lbrownfasan: TLabel;
    Lbrownente: TLabel;
    Lbrownbaum: TLabel;
    StatusBar1: TStatusBar;
    Image1: TImage;
    Lbluecountd: TLabel;
    Lbrowncountd: TLabel;
    Itest: TImage;
    procedure men1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }

     procedure Gamestart;
     procedure ShowStartWindow;
     procedure ShowCard(x,y: integer);
     procedure OnImageClick(Sender: TObject);

  end;

type Tcardtype = (jae, holzf, baer, fuchs, fasan, ente, nadel, laub, nocard);
     Tteam = (blue, brown);
     Tpic = (nopic, shown, hidden);

     Tamount = record
           jae,
           holzf,
           baer,
           fuchs,
           fasan,
           ente,
           nadel,
           laub,
           hidden: integer;
         end;

     Tlastpos = record
           x,
           y: integer;
          end;

     Tpicindex = record
           typ: integer;
           mark: boolean;
           end;

     Tpicpos = record
           top,
           left: integer;
          end;

  {  Tcoord = record
            x,
            y:integer;
          end;
               }

     Tfield = record
          // coord: Tcoord;
           typ : Tcardtype;
           team: Tteam;
           lastpos: Tlastpos;
           value: integer;
           picstatus: Tpic;
           pic: Tfieldpic;
           picindex: Tpicindex; {0=jaeleft
                                                1=jaeright
                                                2=jaeup
                                                3=jaedown
                                                4=holzf
                                                5=baer
                                                6=fuchs
                                                7=fasan
                                                8=ente
                                                9=rueck
                                                10=none
                                                11=nadel
                                                12=laub }

           picpos: Tpicpos;
          end;

     Tplayer = record
           name: string;
           team: Tteam;
           amount: Tamount;
           points: integer;
           turnsleft: integer;
          end;


var
  Form1: TForm1;
  plblue, plbrown: Tplayer;
  totala:Tamount;
  onturn: Tteam;
  clickone, clicktwo: Tfield;
  gameon: boolean;
  fields: array[1..7,1..7] of Tfield; //[1,1] ist oben links, erst x dann y
  piclist: array[0..12,0..1] of Tbitmap;
  Cjae, Cholzf, Cbaer, Cfuchs, Cfasan, Cente, Cnadel, Claub, Cnone: Tfield;




implementation

Uses Unit2;


{$R *.DFM}

procedure Tform1.Gamestart; //legt Zustand beim Starten eines Spiels fest
var i, x, y:integer;
begin
  Form1.Lblue.Caption:=plblue.name;
  Form1.Lbrown.Caption:=plbrown.name;
  with totala do //legt die anzahl der Karten jeder Sorte fest
  begin
           jae := 8;
           holzf:=2;
           baer:=2;
           fuchs:=6;
           fasan:=8;
           ente:=7;
           nadel:=7;
           laub:=8;
           hidden:=48;
  end;
  onturn:=blue; //Blau ist als Erstes am Zug
  //Bilder der Bildliste zusweisen
   for i:=0 to 9 do
     begin
     piclist[i,0]:=Tbitmap.create;

     end;
   for i:=11 to 12 do
     begin
     piclist[i,0]:=Tbitmap.create;
     end;
   for i:=0 to 8 do
     begin
     piclist[i,1]:=Tbitmap.create;
     end;

  piclist[0,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaeleft.bmp');
  piclist[1,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaeright.bmp');
  piclist[2,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaeup.bmp');
  piclist[3,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaedown.bmp');
  piclist[4,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\holzf.bmp');
  piclist[5,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\baer.bmp');
  piclist[6,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\fuchs.bmp');
  piclist[7,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\fasan.bmp');
  piclist[8,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\ente.bmp');
  piclist[9,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\rueck.bmp');
  piclist[11,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\nadel.bmp');
  piclist[12,0].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\laub.bmp');
  piclist[0,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaeleftm.bmp');
  piclist[1,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaerightm.bmp');
  piclist[2,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaeupm.bmp');
  piclist[3,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\jaedownm.bmp');
  piclist[4,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\holzfm.bmp');
  piclist[5,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\baerm.bmp');
  piclist[6,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\fuchsm.bmp');
  piclist[7,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\fasanm.bmp');
  piclist[8,1].Loadfromfile(ExtractFilePath(ParamStr(0)) + 'pictures\entem.bmp');



  //Position für die Bilder auf den Feldern zuweisen
    With fields[1,1] do //erste Spalte
     begin
      picpos.top:=21;
      picpos.left:=212;
    end;
    With fields[1,2] do
     begin
      picpos.top:=107;
      picpos.left:=212;
    end;
    With fields[1,3] do
     begin
      picpos.top:=193;
      picpos.left:=212;
    end;
    With fields[1,4] do
     begin
      picpos.top:=280;
      picpos.left:=212;
    end;
    With fields[1,5] do
     begin
      picpos.top:=367;
      picpos.left:=212;
    end;
    With fields[1,6] do
     begin
      picpos.top:=453;
      picpos.left:=212;
    end;
    With fields[1,7] do
     begin
      picpos.top:=539;
      picpos.left:=212;
    end;
    With fields[2,1] do //zweite Spalte
     begin
      picpos.top:=21;
      picpos.left:=299;
    end;
    With fields[2,2] do
     begin
      picpos.top:=107;
      picpos.left:=299;
    end;
    With fields[2,3] do
     begin
      picpos.top:=193;
      picpos.left:=299;
    end;
    With fields[2,4] do
     begin
      picpos.top:=280;
      picpos.left:=299;
    end;
    With fields[2,5] do
     begin
      picpos.top:=366;
      picpos.left:=299;
    end;
    With fields[2,6] do
     begin
      picpos.top:=453;
      picpos.left:=299;
    end;
    With fields[2,7] do
     begin
      picpos.top:=539;
      picpos.left:=299;
    end;
    With fields[3,1] do //dritte Spalte
     begin
      picpos.top:=20;
      picpos.left:=385;
    end;
    With fields[3,2] do
     begin
      picpos.top:=107;
      picpos.left:=385;
    end;
    With fields[3,3] do
     begin
      picpos.top:=193;
      picpos.left:=385;
    end;
    With fields[3,4] do
     begin
      picpos.top:=280;
      picpos.left:=385;
    end;
    With fields[3,5] do
     begin
      picpos.top:=366;
      picpos.left:=385;
    end;
    With fields[3,6] do
     begin
      picpos.top:=453;
      picpos.left:=385;
    end;
    With fields[3,7] do
     begin
      picpos.top:=539;
      picpos.left:=385;
    end;
    With fields[4,1] do //vierte Spalte
     begin
      picpos.top:=20;
      picpos.left:=471;
    end;
    With fields[4,2] do
     begin
      picpos.top:=106;
      picpos.left:=471;
    end;
    With fields[4,3] do
     begin
      picpos.top:=193;
      picpos.left:=471;
    end;
    With fields[4,4] do
     begin
      picpos.top:=280;
      picpos.left:=471;
    end;
    With fields[4,5] do
     begin
      picpos.top:=366;
      picpos.left:=471;
    end;
    With fields[4,6] do
     begin
      picpos.top:=452;
      picpos.left:=471;
    end;
    With fields[4,7] do
     begin
      picpos.top:=538;
      picpos.left:=471;
    end;
    With fields[5,1] do // fünfte Spalte
     begin
      picpos.top:=20;
      picpos.left:=556;
    end;
    With fields[5,2] do
     begin
      picpos.top:=106;
      picpos.left:=556;
    end;
    With fields[5,3] do
     begin
      picpos.top:=192;
      picpos.left:=556;
    end;
    With fields[5,4] do
     begin
      picpos.top:=279;
      picpos.left:=556;
    end;
    With fields[5,5] do
     begin
      picpos.top:=365;
      picpos.left:=556;
    end;
    With fields[5,6] do
     begin
      picpos.top:=452;
      picpos.left:=556;
    end;
    With fields[5,7] do
     begin
      picpos.top:=537;
      picpos.left:=556;
    end;
    With fields[6,1] do //sechste Spalte
     begin
      picpos.top:=19;
      picpos.left:=642;
    end;
    With fields[6,2] do
     begin
      picpos.top:=106;
      picpos.left:=642;
    end;
    With fields[6,3] do
     begin
      picpos.top:=192;
      picpos.left:=642;
    end;
    With fields[6,4] do
     begin
      picpos.top:=279;
      picpos.left:=642;
    end;
    With fields[6,5] do
     begin
      picpos.top:=365;
      picpos.left:=642;
    end;
    With fields[6,6] do
     begin
      picpos.top:=452;
      picpos.left:=642;
    end;
    With fields[6,7] do
     begin
      picpos.top:=538;
      picpos.left:=642;
    end;
    With fields[7,1] do //siebte Spalte
     begin
      picpos.top:=18;
      picpos.left:=728;
    end;
    With fields[7,2] do
     begin
      picpos.top:=105;
      picpos.left:=728;
    end;
    With fields[7,3] do
     begin
      picpos.top:=191;
      picpos.left:=728;
    end;
    With fields[7,4] do
     begin
      picpos.top:=278;
      picpos.left:=728;
    end;
    With fields[7,5] do
     begin
      picpos.top:=364;
      picpos.left:=728;
    end;
    With fields[7,6] do
     begin
      picpos.top:=451;
      picpos.left:=728;
    end;
    With fields[7,7] do
     begin
      picpos.top:=537;
      picpos.left:=728;
    end;

  //Alle Bilder zeigen Rückseite, außerdem Koordinaten zuweisen, sowie parent:=form1
   for x:=1 to 7 do
    begin
     for y:=1 to 7 do
      begin
       with fields[x,y] do
        begin
          pic:=Tfieldpic.create(Form1);
          pic.parent:=form1;
          pic.Left:=fields[x,y].picpos.left;
          pic.top:=fields[x,y].picpos.top;
          pic.picture.assign(piclist[9,0]);
          pic.onclick := OnImageClick;
          pic.fieldy:=y;
          pic.fieldx:=x;
          picstatus:=hidden;
          picindex.typ:=9;
          picindex.mark:=false;
        end;
      end;
    end;
  //Mittelfeld bleibt leer
  with fields[4,4] do
   begin
    pic.picture.assign(nil);
    picstatus:=nopic;
    picindex.typ:=10;
   end;

  with Cjae do
   begin
    typ:=jae;
    team:=brown;
    value:=5;

   end;
end;

procedure Tform1.ShowStartWindow; //Abfrage Fenster um Spielernamen und Spielerfarbe festzulegen
begin
  Form2.Showmodal;
 // Form2.Eplayer1.text :=''; //falls man leere EDIT-Fenster beim Starten haben will
 // Form2.Eplayer2.Text :='';
end;

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[1,1].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[1,1].pic.picture.assign(piclist[1,0]);
               fields[x,y].picindex.typ:=1;
               fields[x,y].picstatus:=shown;
             end
           else if rand2=3 then
             begin
              fields[1,1].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[1,1].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');
     end;


end;


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
     showmessage('erfolgreicherdurchlauf');
    end
   else if fields[x,y].picstatus=nopic then
   begin
    showmessage('keine Karte')
   end
   else if fields[x,y].picstatus=shown then
   begin
   showmessage('nicht versteckt');
   end;
end;

procedure TForm1.men1Click(Sender: TObject); //"Neues Spiel"
var securetyquestion: integer;
begin
  if gameon=true then begin
    securetyquestion:= MessageDlg('Neues Spiel?',mtError, mbOKCancel, 0); //sicherheisfrage nötig!
     if securetyquestion = mrOK then begin
         Form1.ShowStartWindow;
     end
     else if securetyquestion = mrCancel then begin
     end;
  end
  else if gameon=false then begin
   Form1.ShowStartWindow;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject); //beim Starten des Programms
begin
Lblue.Caption:='Spieler 1';
Lbrown.Caption:='Spieler2';
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); //beim Schließen des Programms
var i,x,y:integer;
begin
//Speicherplatz für die Bilder wieder freigeben
 for x:=1 to 7 do
  begin
   for y:=1 to 7 do
    begin
     fields[x,y].pic.free;
    end;
 end;
 for i:=0 to 11 do
     begin
     piclist[i,0].free;
     piclist[i,1].free;
  end;
end;


end.
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

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

Re: Zuweisung eines Bildes macht Probleme

  Alt 21. Mai 2009, 18:32
So ich habe gerade noch etwas intressantes bemerkt.
Ich habe zu testzwecken folgende Version in der Prozedur ShowCard verwendet:

fields[1,1].pic.picture.assign(piclist[0,0]); Also mit 1 schon eingesetzt als x und y koordinate. Das bei einem Klick auf jedes beliebige Feld erscheint so kein Fehler und es läuft alles so wie es im Code beschrieben ist (Beim Klick auf ein Feld ändert sich also das Bild von Feld (1,1)).

Wenn ich nun aber auf das Feld (1,1) klicke kommt es zu dem oben beschriebenen Fehler. Es kommt also immer dann zu einem Fehler wenn man auf das Bild klickt bei das auch das Bild geändert wird.

Ich hoffe, dass das weiter hilft.


mfg KahPee
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

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

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 10:50
Gestern folgendes bei mir:
Zitat:
So und wieder habe ich was festgestellt. Den Fehler habe ich nicht gefunden aber ich habe eine potentielle Lösung gefunden. Ich habe festgestellt, dass der Befehl, der in der Prozedur "ShowCard" NICHT funktioniert einwandfrei in der Prozedur "OnImageClick" funktioniert. Daher werde ich nun in der Prozedur "ShowCard" nur den Bildindex zuweisen und in der Prozedur "OnImageClick" werde ich einen Abfrage der Bildindex machen nachdem das entsprechende Bild zugewiesen wird.
Heute wollte ich das dann umsetzen aber wieder gibt es das Problem mit dem access violation- fehler:
Zitat:
In der Prozedur "OnImageCLick" habe ich nun nach dem Aufruf der Prozedur "ShowCard" (in der wird dem Bild ein neuer Bildindex zugewiesen) folgendes geschrieben um den Bildindex auch umzusetzten:

Delphi-Quellcode:
if (fields[x,y].picindex.mark=false) and ((fields[x,y].picindex.typ=0) or (fields[x,y].picindex.typ=1) or (fields[x,y].picindex.typ=2) or (fields[x,y].picindex.typ=3)) then
     begin
       fields[x,y].pic.picture.assign(piclist[0,0]);
     end;

Hiermit aber schon:
Delphi-Quellcode:
if fields[x,y].picindex.mark=false then
     begin
       fields[x,y].pic.picture.assign(piclist[0,0]);
     end;
ich kann bei beiden Versionen garantieren, dass das ergebnis der if-Verzweigung wahr ist. Woran liegt das?
das gleiche passuert wenn ich die Zeile
fields[x,y].pic.picture.assign(piclist[0,0]); in eine case anweisung packe.

Bin kurz vorm Verzweifeln, wahrscheinlich wäre die simple Variante mit 8 Bildern manuell auf jedem feld einfacher zu programmieren gewesen, aber das ganze muss dann irre lange Laden wenn das Programm startet..

mfg KahPee
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 11:14
Bin mir nicht sicher (auch weil der Picture-Container mein geliebter Feind ist), aber
Delphi-Quellcode:
// statt
fields[x,y].pic.picture.assign(piclist[0,0]);
// müsste es nicht so aussehen?
fields[x,y].pic.picture.bitmap.assign(piclist[0,0]);
piclist enthält ja TBitmap, nicht TPicture.

Was mir noch aufgefallen ist, aber nichts mit dem Problem zu tun hat:
Delphi-Quellcode:
// Wenn Du folgende kleine Procedure baust:
procedure SetPicPos(Field : Tfield; Top, Left : Integer);
begin
  Field.picpos.top := Top;
  Field.picpos.left:= Left;
end;

// kanst Du statt dem
with fields[1,1] do //erste Spalte
begin
  picpos.top:=21;
  picpos.left:=212;
end;

// Das schreiben
SetPicPos(fields[1,1], 21, 212);
dadurch würde die eine Funktion erheblich schrumpfen.
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

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

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 11:22
Vielen Dank für den Schrumpf-hinweis!!

Das mit dem .bitmap habe ich gerade mal schnell geändert. Vom Compiler kommt kein fehler allerdings ändert sich das Problem irgendwie auch nicht.. So was blödes...
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

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

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 11:42
Das hier funktioniert noch nicht:
Deklaration und Prozdur:
Delphi-Quellcode:
 procedure SetPicPos(Field : Tfield; Top, Left : Integer);


implementation

Uses Unit2;


{$R *.DFM}
procedure SetPicPos(field : Tfield; Top, Left : Integer);
begin
  Field.picpos.top := Top;
  Field.picpos.left:= Left;
end;
Aufruf:
Delphi-Quellcode:
SetPicPos(fields[1,1], 21, 212); //erste Spalte
SetPicPos(fields[1,2], 107, 212);
SetPicPos(fields[1,3], 193, 212);
SetPicPos(fields[1,4], 280, 212);
SetPicPos(fields[1,5], 367, 212);
SetPicPos(fields[1,6], 453, 212);
SetPicPos(fields[1,7], 539, 212);
//usw.

Abgesehen von der Frage noch die Frage wie sich das ganze andere mit den Bildern zuweisen lösen lässt. Eine Alternative Lösung würd eich utner Umständen auch in Betracht ziehen.
  Mit Zitat antworten Zitat
Benutzerbild von KahPee
KahPee

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

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 12:51
Noch kleiner Hinweis zu dem Problem mit der SetPicPos-Prozedur: Die Bilder werden alle auf 0,0 angeordnet und nicht in der Zugeordneten Prozedur woran das liegt weis ich leider nicht.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 13:09
Könntest du bitte das pushen innerhalb von 24 Stunden unterlassen?!
2.3.2.4 - In der Ruhe liegt die Kraft: Kein "Pushen" von Beiträgen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Zuweisung eines Bildes macht Probleme

  Alt 22. Mai 2009, 14:16
Zitat von KahPee:
Noch kleiner Hinweis zu dem Problem mit der SetPicPos-Prozedur: Die Bilder werden alle auf 0,0 angeordnet und nicht in der Zugeordneten Prozedur woran das liegt weis ich leider nicht.
Achja, sorry... hatte gedacht TField ist eine Klasse, aber ist ja ein Record (Kopie statt Zeiger).

Zwei Möglichkeiten, die schnellste ist die var Deklaration
procedure SetPicPos(var Field : Tfield; Top, Left : Integer); besser aber mit Pointer arbeiten
Delphi-Quellcode:
// Pointer Deklarieren
PField = ^TField;
Tfield = record
          // coord: Tcoord;
           typ : Tcardtype;
          [...]

// geänderte Procedure
procedure SetPicPos(Field : Pfield; Top, Left : Integer);
begin
  Field^.picpos.top := Top;
  Field^.picpos.left:= Left;
end;

// Aufruf dann so
SetPicPos(@fields[1,1], 21, 212);
Hoffe es stimmt jetzt...
Kannst ja erst var probieren, dann sollte es gehen und später auf Pointer-Übergabe umbauen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:43 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