Autor |
Beitrag |
cryl0v
Hält's aus hier
Beiträge: 3
|
Verfasst: So 21.02.10 20:36
Hallo Delphine  ,
ich habe per TShape.Create eine Form in mein Projekt erstellt und deren Eigenschaften definiert. Es ist sichtbar und funktioniert einwandfrei.
Da ich ein kleines Spiel programmiere und sich die Steine auf dem Feld ändern, sollen sie gelöscht werden. Wenn auf dem Feld eine 0 liegt und das TShape Objekt vorhanden sind wird gelöscht.
Wie frage ich nun ab ob ein Objekt existiert bspw. stein[i].(Abfrage auf Existenz). Denn um ein Objekt löschen zu können muss es existieren.
Das Löschen würde ich mit stein[i].Destroy lösen. Wäre das richtig um es auf der Form zum Verschwinden zu bringen?
mfg. cryl0v
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 21.02.10 21:02
Hallo und
cryl0v hat folgendes geschrieben : | Wie frage ich nun ab ob ein Objekt existiert bspw. stein[i].(Abfrage auf Existenz). Denn um ein Objekt löschen zu können muss es existieren. |
Du kannst das normalerweise mit Assigned(DeinObjekt) prüfen.
Aber wenn du das brauchst um den Status im Spiel zu prüfen, dann solltest du dein Konzept überdenken. Die Darstellung dient der Darstellung, die Informationen dazu solltest du lieber richtig speichern. Dann stellt sich die Frage auch gar nicht erst.
cryl0v hat folgendes geschrieben : | Das Löschen würde ich mit stein[i].Destroy lösen. Wäre das richtig um es auf der Form zum Verschwinden zu bringen? |
Nein, denn wie in der Delphi Hilfe auch deutlich steht, sollte man Destroy nie direkt aufrufen. Sondern besser Free. Denn das prüft vorher, ob das Objekt überhaupt existiert.
|
|
cryl0v 
Hält's aus hier
Beiträge: 3
|
Verfasst: So 21.02.10 21:12
Hallo jaenicke, die Daten sind in Arrays einzeln gespeichert. Die Werte wurde auf ein 2 dimensionales TShape Array übertragen. Das Spiel heißt die Türme von Hanoi. Wenn ich nun den ersten Stein nehme und ihn versetze, soll der erste Stein auch verschwinden.
Allerdings habe ich mit der Assigned Abfrage und dem Free ein Speicherverletzung
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 21.02.10 21:19
ich mach das immer so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if ShapeArray[0,0]<>nil then begin ShapeArray.Free; ShapeArray:=nil; end; |
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 21.02.10 21:23
Für die Türme von Hanoi würde ich allerdings nie auf die Idee kommen ein zweidimensionales Array zu nutzen. Da eignet sich ein Array mit drei TObjectLists doch viel besser.  Da kann man einfach immer das zu verschiebende Shape direkt korrespondierend zur visuellen Darstellung von einer Liste in die andere verschieben.
Dann braucht man da auch die Prüfung gar nicht mehr.
|
|
cryl0v 
Hält's aus hier
Beiträge: 3
|
Verfasst: So 21.02.10 21:29
Delphi ist leider nicht meine Hausprogrammiersprache und ich kenne mich wenig aus, deshalb versuch ich erstmal das zu lösen was ich kann. Ist nicht böse gemeint.
Es soll nun unten zusätzlich geprüft werden, ob bei einen neuem Arraywert bspw. der 0 noch immer die Scheibe liegt. Sollte dies nicht der Fall sein springt die Abfrage gar nicht erst an. Ich denke vom Aufbau wird euch nun klar, welche Denkweise ich habe.
Am Besten ich gebe euch die Show Methode
Aber leide funktioniert es noch immer nicht und ich kriege ständig eine Speicherzugriffsverletzung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| procedure TForm1.show(s:SpielfeldT); var i,j, top, tmp, dummy:KeyT; type stellen = array[1..3] of TShape; var anzeige: array[1..3] of stellen; begin top:=200; for i:=1 to 3 do begin tmp:=0; for j:=1 to 3 do begin if (s[i][j] <> 0) then begin case i of 1: begin dummy:=s[i][j]; anzeige[i][j]:=TShape.Create(Self); anzeige[i][j].Brush.Color:=scheiben[dummy].SFarbe; anzeige[i][j].Height:=scheiben[dummy].SHeight; anzeige[i][j].Width:=scheiben[dummy].SWidth; anzeige[i][j].Left:=scheiben[dummy].SLeft; anzeige[i][j].Top:=top+tmp; anzeige[i][j].Parent:=Self; tmp:=tmp-21; end; 2: begin dummy:=s[i][j]; anzeige[i][j]:=TShape.Create(Self); anzeige[i][j].Brush.Color:=scheiben[dummy].SFarbe; anzeige[i][j].Height:=scheiben[dummy].SHeight; anzeige[i][j].Width:=scheiben[dummy].SWidth; anzeige[i][j].Left:=scheiben[dummy].SLeft+148; anzeige[i][j].Top:=top+tmp; anzeige[i][j].Parent:=Self; tmp:=tmp-21; end; 3: begin dummy:=s[i][j]; anzeige[i][j]:=TShape.Create(Self); anzeige[i][j].Brush.Color:=scheiben[dummy].SFarbe; anzeige[i][j].Height:=scheiben[dummy].SHeight; anzeige[i][j].Width:=scheiben[dummy].SWidth; anzeige[i][j].Left:=scheiben[dummy].SLeft+308; anzeige[i][j].Top:=top+tmp; anzeige[i][j].Parent:=Self; tmp:=tmp-21; end; end; end;
if anzeige[i,j]<>nil then begin anzeige[i,j].Free; anzeige[i,j]:=nil;
end; end; end; end; |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
--- Moderiert von Narses: Beiträge zusammengefasst---
Zur Aktualisierung:
Wie kann ich nun die TShape Form löschen? Mit den Varianten habe ich es bereits versucht, aber es kommt immer eine Zugriffsverletzung.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.02.10 00:36
Moin und  im Forum!
cryl0v hat folgendes geschrieben : | Delphi ist leider nicht meine Hausprogrammiersprache und ich kenne mich wenig aus, deshalb versuch ich erstmal das zu lösen was ich kann.
[...]
Aber leide funktioniert es noch immer nicht und ich kriege ständig eine Speicherzugriffsverletzung |
jaenicke hat folgendes geschrieben : | Für die Türme von Hanoi würde ich allerdings nie auf die Idee kommen ein zweidimensionales Array zu nutzen. Da eignet sich ein Array mit drei TObjectLists doch viel besser. Da kann man einfach immer das zu verschiebende Shape direkt korrespondierend zur visuellen Darstellung von einer Liste in die andere verschieben.
Dann braucht man da auch die Prüfung gar nicht mehr. |
Du hast - nach eigener Aussage - keine Ahnung von Delphi, bekommst einen guten Tipp von einem erfahrenen Delphi-Entwickler und willst ihn nicht annehmen, nein, du verweist sogar darauf, dass du keine Ahnung hast und deshalb lieber deine eigene (wohlgemerkt: nicht funktionierende) Suppe kochen willst.  Sorry, aber dann kann man dir nicht helfen.
cryl0v hat folgendes geschrieben : | Ist nicht böse gemeint. |
Dito.  Aber dein Ansatz ist nunmal Wurst, da beisst die Maus keinen Faden ab. Mach das Konzept vernünftig, dann hast du erst gar nicht die Probleme, die du jetzt lösen musst.
Ist doch auch dem "natürlichen" Ansatz viel näher: du hast die entsprechende Anzahl von Shapes und verschiebst diese nur zwischen den Säulen  einmal die Shapes erzeugen (deren Eigenschaften mit Ausnahme der Position sich auch nicht mehr ändern) und dann nur noch die Zugehörigkeit anpassen, fertig.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|