Moin allerseits,
Ich habe das Problem das ich ein dynamisches Array aus TShape habe in welches ich zur Laufzeit TShape's erstelle...
Code:
var
aMeinArray : Array of TShape;
Image1: TShape;
procedure TForm1.Timer1Timer(Sender: TObject);
var
dIndex: Integer;
begin
SetLength(aMeinArray,Length(aMeinArray)+1);
dIndex := Length(aMeinArray)-1;
Image1 := TShape.Create(Self);
aMeinArray[dIndex] := Image1;
aMeinArray[dIndex].Parent := Self;
aMeinArray[dIndex].Shape := stCircle;
aMeinArray[dIndex].Brush.Color := clLime;
aMeinArray[dIndex].Height := 20;
aMeinArray[dIndex].Width := 20;
aMeinArray[dIndex].Left := random(Self.ClientWidth-23);
aMeinArray[dIndex].Top := Self.ClientHeight - 25;
aMeinArray[dIndex].Show;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var
x: Integer;
begin
for x := 0 to Length(aMeinArray) - 1 do
begin
if aMeinArray[x] = nil then
continue;
aMeinArray[x].Top := aMeinArray[x].Top - random(25);
if (aMeinArray[x].Top + aMeinArray[x].Height) < 0 then
begin
aMeinArray[x].Free;
aMeinArray[x] := nil;
end;
end;
end;
Da das Array nun ja immer größer wird, habe ich mir gedacht das ich das Array komplett neu mache um die ganzen leeren und unnützen Felder loszuwerden, damit die Schleife nicht unnötig oft durchlaufen muss...
Code:
procedure TForm1.Timer3Timer(Sender: TObject);
var
x: Integer;
aTmp: Array of TShape;
begin
if Length(aMeinArray) >= 200 then
begin
dCnt := 0;
Timer1.Enabled := False;
Timer2.Enabled := False;
for x := 0 to Length(aMeinArray) - 1 do
begin
if aMeinArray[x] = nil then
continue;
SetLength(aTmp,Length(aTmp)+1);
aTmp[Length(aTmp)-1] := aMeinArray[x];
end;
aMeinArray := nil;
// aMeinArray := Copy(aTmp); //Gibt nen Fehler (warum auch immer sind beides Array of TShape)
//Als Alternative dann:
for x := 0 to Length(aTmp) - 1 do
begin
// aMeinArray[x] := Copy(aTmp,x,1); // Inkompatible Typen dynamic Array und TShape - kann man eventuell ja noch verstehen...
aMeinArray[x] := @aTmp[x];
end;
aTmp := nil;
Timer1.Enabled := True;
Timer2.Enabled := True;
end;
mit der direkten Zuweisung funktioniert der Part zwar, das Problem ist das die TShapes die zu dem Zeitpunkt wo das Array neu aufgebaut werden sollte noch auf dem Formular befinden sich anschliessend nicht mehr bewegen (sollten sie aber) und dann sobald der erste Timer wieder ansteht gibt es ne AccessViolation.
Hat jemand ne Idee wie ich entweder
a) das Array so neu aufbauen kann das danach immer noch alles funktioniert
b) es so hinbekomme das ich komplett aufs Array neumachen verzichten kann.
oder gar ne grundsätzlich bessere Idee?
Verwendet wird Delphi2009.
Besten Dank schonmal