Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Elemente aus dynamischem Array entfernen
Adory - Di 19.01.10 03:50
Titel: Elemente aus dynamischem Array entfernen
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..
Delphi-Quelltext
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; |
Bergmann89 - Di 19.01.10 04:22
Hey,
für solche Sachen gibts Listen, in deinem fall wäre die TList da wohl am besten geeignet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| var PanelList: TList;
PanelList:= TList.Create; PanelList.add(Panel1); PanelList.add(Panal2); for i := PanelList.Count-1 downto 0 do begin TmpPanel := (PanelList[i] as TPanel); if TmpPanel.Tag = 0 then PanelList.delete(i);
end;
PanelList.Free; |
So kannst du dir das ganze kopieren und verschieben ersparen, das macht jetzt alles die Liste für dich...
MfG Bergmann.
Adory - Di 19.01.10 04:35
Wow.. Das dürfte mein Problem tatsächlich lösen :)
Vielen Dank für die schnelle Antwort - und das um die Uhrzeit!!
Bergmann89 - Di 19.01.10 05:09
kein problem :)
Adory - Di 19.01.10 22:06
Hat super geklappt!! Danke danke danke!! :}
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!