Einzelnen Beitrag anzeigen

SilentStorm

Registriert seit: 28. Apr 2008
4 Beiträge
 
Delphi 7 Enterprise
 
#1

Array kopieren - Inkompatible Typen ?

  Alt 16. Jul 2009, 03:40
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
  Mit Zitat antworten Zitat