Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Leere Array-Einträge überspringen
FloFri - Di 18.03.03 09:07
Titel: Leere Array-Einträge überspringen
Hi!
Ich habe hier eine Funktion mit einem Array einer eigenen klasse. Ich benutze das für die Objekte in meiner Engine. Jetzt habe ich aber das Problem, dass es sein kann, dass Lücken im Array sind (Objekt gelöscht mit .free). Habe das etwas unkomfortabel mit einer exeption gelöst:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TEngine.draw; var i: integer; begin
// Bildschrirm löschen clearscr;
// Alle verfügbaren Objekte zeichnen for i := 0 to maxobj do begin try bmpmain.Canvas.Draw(EngObj[i].ox, EngObj[i].oy, EngObj[i].osprite); except end; end; virtscreen.Canvas.Draw(0, 0, bmpmain);
end; |
Ach so, in Maxobj steht der höchste index, den ein Objekt bis zu dem Zeitpunkt hat.
Geht das auch komfortabeler oder sogar schneller zu lösen anstatt mit der exeption?
UGrohne - Di 18.03.03 09:14
Machs doch einfach so: Irgendwo löscht Du ja ein Objekt in dem Array. Warum verschiebst Du dann die darauffolgenden nicht um eins vor, dann ist das Objekt nämlich nicht mehr vorhanden. Hier der Code
Quelltext
1: 2: 3: 4:
| for i:=loeschindex to Length(EngObj)-2 do begin EngObj[i]:=EngObj[i+1] end; SetLength(EngObj,EngObj(array)-1); |
Außerdem bekommst Du mit
die höchste ID des Arrays.
Dann brauchst Du keine Exceptions mehr zu verwenden, denn das ist eine ziemlich unsaubere Programmierweise, Exceptions im Programmablauf zu erzeugen,um ihn zu kontrollieren.
Gruß
P.S: Verleih Deinem Thread mal ein bisschen mehr Aussagekraft, denn bei "Geth das auch komfortabler" kann sich glaub ich kaum einer was drunter vorstellen.
FloFri - Di 18.03.03 09:48
Dann ändern sich aber auch die Index-Werte, oder? Die müssen nähmlich gleich bleiben, sonst kann ich nicht mehr die richtigen Objekte ansteuern.
UGrohne - Di 18.03.03 09:52
Ja, die ändern sich natürlich.....
OK, wenn Du das nicht willst, dann mach es am besten so(ich hoffe, das funktioniert so, hab ich mir nur so kurz vor der Vorlesung ausgedacht):
Du destroyst ein Objekt mit FreeAndNil(), bzw machst EnglObj[5]:=nil, wenn Du eins zerstörst. Dann kannst Du eine Abfrage machen, wie
Quelltext
1: 2: 3:
| if EnglObj[5]=nil then begin ..... end; |
Probiers mal so, sollte gehen.
Gruß und tschüss aufm Campus *g*
FloFri - Di 18.03.03 10:27
Danke! Ich werds gleich ausprobieren!
HeLe - Mi 26.03.03 14:58
Stilistisch besser und einfacher wär's wohl, wenn du eine tobjectlist verwendest, die hat eine Methode namens pack die genau das macht was du willst :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!