|
Antwort |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#1
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:
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":
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;
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 |
Zitat |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#2
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. |
Zitat |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#3
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 |
Zitat |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#4
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.
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:
ich kann bei beiden Versionen garantieren, dass das ergebnis der if-Verzweigung wahr ist. Woran liegt das?
if fields[x,y].picindex.mark=false then
begin fields[x,y].pic.picture.assign(piclist[0,0]); end; 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 |
Zitat |
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#5
Bin mir nicht sicher (auch weil der Picture-Container mein geliebter Feind ist), aber
Delphi-Quellcode:
piclist enthält ja TBitmap, nicht TPicture.
// 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]); Was mir noch aufgefallen ist, aber nichts mit dem Problem zu tun hat:
Delphi-Quellcode:
dadurch würde die eine Funktion erheblich schrumpfen.
// 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); |
Zitat |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#6
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... |
Zitat |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#7
Das hier funktioniert noch nicht:
Deklaration und Prozdur:
Delphi-Quellcode:
Aufruf:
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;
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. |
Zitat |
Registriert seit: 12. Mai 2009 214 Beiträge Turbo Delphi für Win32 |
#8
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.
|
Zitat |
(Moderator)
Registriert seit: 23. Sep 2003 Ort: Bockwen 12.235 Beiträge Delphi 2006 Professional |
#9
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 |
Zitat |
Registriert seit: 24. Feb 2007 Ort: Baden 1.566 Beiträge Delphi 2007 Professional |
#10
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.
Zwei Möglichkeiten, die schnellste ist die var Deklaration procedure SetPicPos(var Field : Tfield; Top, Left : Integer); besser aber mit Pointer arbeiten
Delphi-Quellcode:
Hoffe es stimmt jetzt...
// 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); Kannst ja erst var probieren, dann sollte es gehen und später auf Pointer-Übergabe umbauen. |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |