Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array kopieren - Inkompatible Typen ? (https://www.delphipraxis.net/137208-array-kopieren-inkompatible-typen.html)

SilentStorm 16. Jul 2009 03:40


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:
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 :)

jaenicke 16. Jul 2009 05:18

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.

Namenloser 16. Jul 2009 05:35

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;

Blup 16. Jul 2009 06:47

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.

mkinzler 16. Jul 2009 06:51

Re: Array kopieren - Inkompatible Typen ?
 
Zitat:

Warum die Verwaltung eines Arrays neu programmieren, wennn es bereits Klassen für diese Aufgabe gibt.
Wobei eine Liste kein Array ist


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz