AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Array kopieren - Inkompatible Typen ?

Ein Thema von SilentStorm · begonnen am 16. Jul 2009 · letzter Beitrag vom 16. Jul 2009
Antwort Antwort
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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.330 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Array kopieren - Inkompatible Typen ?

  Alt 16. Jul 2009, 05:18
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Array kopieren - Inkompatible Typen ?

  Alt 16. Jul 2009, 05:35
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;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Array kopieren - Inkompatible Typen ?

  Alt 16. Jul 2009, 06:47
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Array kopieren - Inkompatible Typen ?

  Alt 16. Jul 2009, 06:51
Zitat:
Warum die Verwaltung eines Arrays neu programmieren, wennn es bereits Klassen für diese Aufgabe gibt.
Wobei eine Liste kein Array ist
Markus Kinzler
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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