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

Quelltext
1:
High(EngObj);                    


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 :)