![]() |
Array kopieren - Inkompatible Typen ?
Moin allerseits,
Ich habe das Problem das ich ein dynamisches Array aus TShape habe in welches ich zur Laufzeit TShape's erstelle...
Code:
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...
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;
Code:
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.
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; 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 :) |
Re: Array kopieren - Inkompatible Typen ?
Was soll das @ an der Stelle? Variablen auf Klasseninstanzen usw. sind bereits Pointer.
Und dann würde ich das Array erst auf die Länge des ursprünglichen setzen und nach dem Kopieren auf die richtige Länge. So ist das ziemlich langsam. |
Re: Array kopieren - Inkompatible Typen ?
So würde ich es machen (ungetestet):
Delphi-Quellcode:
procedure PackArray(var ShapeArray: array of TShape);
var i, j: integer; begin j := low(ShapeArray); for i := low(ShapeArray) to high(ShapeArray) do begin if Assigned(ShapeArray[i]) then begin ShapeArray[j] := ShapeArray[i]; inc(j); end; end; SetLength(ShapeArray,j-low(ShapeArray)); end; |
Re: Array kopieren - Inkompatible Typen ?
Ich würde gleich mit TList oder TObjectList arbeiten.
Warum die Verwaltung eines Arrays neu programmieren, wennn es bereits Klassen für diese Aufgabe gibt. |
Re: Array kopieren - Inkompatible Typen ?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz