Hallo Leute,
gleich vorab.. bitte nicht lachen :}
folgendes Problem.. ich versuche gerade ein kleines Spiel zu programmieren. Die Spielfläche besteht aus 40x40 oder mehr TPanels (ich weiß, ziemlich primitiv

. Diese muss ich im Laufe des Spiels alle paar Milli-Sekunden einmal auf ihren aktuellen Tag abfragen. Klappt mit einem Timer auch alles super.. Bei aber gesamt 1600 Flächen geht das Spiel natürlich total in die Knie.. Das Spiel läuft zwar, aber leider stellenweise seeehr langsam.
Da natürlich nicht ständig auf jedem Panel etwas passiert, hatte ich mir gedacht sämtliche Panel-Namen auf denen tatsächlich etwas passieren soll, in ein dynamisches Array zu schreiben und dieses also alle paar Sekunden abzuarbeiten. Soweit so gut. Funktioniert auch bestens. Mein Problem ist nur.. Sobald ein Panel abgearbeitet ist (in meinem Fall erhält es das Tag=0) möchte ich es natürlich aus dem Array löschen. Aber bei dem Versuch stürzt das Programm nun jedesmal ab (EAccessViolation)..
nun... ich denke aus den folgenden Codezeilen könnt ihr entnehmen das ich was Programmierarbeit angeht nicht grad der Hellste bin

.. Ich schätze ich mache einen total offensichtlichen Fehler oder gehe die Sache ohnehin total dämlich an.. Aber vielleicht hat ja dennoch jemand Lust mir zu helfen? Würde mich über eine Antwort sehr freuen..
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:
| type TComponentnameArray = array of TComponentname; (...) var master_array: TComponentnameArray; (...)
procedure Tform1.Timer(Sender: TObject;); var inc:integer;
begin if high(master_array) = (-1) or (0) then Form1.Caption:='array leer' else begin for inc:=low(master_array) to high(master_array) do begin with TPanel(FindComponent(master_array[inc])) do begin if tag = 0 then begin deleteArrayElement(master_Array, inc); end;
if tag > 0 (...)
procedure DeleteArrayElement(var X: TArray; const Index: Integer) ; begin if Index > High(X) then Exit; if Index < Low(X) then Exit; if Index = High(X) then begin SetLength(X, Length(X) - 1) ; Exit; end; Finalize(X[Index]) ; System.Move(X[Index +1], X[Index],(Length(X) - Index -1) * SizeOf(string) + 1) ; SetLength(X, Length(X) - 1) ; end; |