Autor Beitrag
FloFri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: Di 18.03.03 08:07 
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:

ausblenden 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?


Zuletzt bearbeitet von FloFri am Di 18.03.03 08:47, insgesamt 1-mal bearbeitet
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 18.03.03 08: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
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: Di 18.03.03 08: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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 18.03.03 08: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
ausblenden Quelltext
1:
2:
3:
if EnglObj[5]=nil then begin
   .....
   end;


Probiers mal so, sollte gehen.

Gruß und tschüss aufm Campus *g*
FloFri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97



BeitragVerfasst: Di 18.03.03 09:27 
Danke! Ich werds gleich ausprobieren!
HeLe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mi 26.03.03 13: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 :)