Autor Beitrag
Adory
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP
Delphi 7
BeitragVerfasst: Di 19.01.10 03:50 
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..

ausblenden volle Höhe 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) = (-1or (0then  Form1.Caption:='array leer'    //Array leer?

  else begin
  for inc:=low(master_array) to high(master_array) do begin    //Gehe von anfang bis Ende durch das Array

  with TPanel(FindComponent(master_array[inc])) do   // Mit dem aktuellen Panel... 
  begin
  if tag = 0 then begin                    // prüfen ob abgearbeitet?...                      
  deleteArrayElement(master_Array, inc);  // ...dann aktuelles Element aus dem Array löschen
  end;

      if tag > 0  {etc. etc.}    // wenn nicht null dann ab-arbeiten...
      (...)


// 

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: 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:
ausblenden 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);  //Panel1 in die Liste eintragen
PanelList.add(Panal2);  //Panel2 in die Liste eintragen

for i := PanelList.Count-1 downto 0 do begin //alle Panels durchzählen (rückwärts zählen sonst error beim löschen)
  TmpPanel := (PanelList[i] as TPanel); //Panel aus der Liste holen
  
  //[...]

  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.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Adory Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Di 19.01.10 05:09 
kein problem :)

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Adory Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP
Delphi 7
BeitragVerfasst: Di 19.01.10 22:06 
Hat super geklappt!! Danke danke danke!! :}