![]() |
Array verkleinern
Hi,
ich habe eine Klasse entwickelt. Außerdem habe ich einen Array of TMeineKlasse. Diesen Array fülle ich, je nach User angaben, mit der Klasse. Jetzt wollte ich eine Löschroutine bauen um einzelne Elemente wieder zu entfernen. Meine Idee war, einfach alle nachfolgenden Elemente eins nach vorne zu kopieren
Delphi-Quellcode:
Das scheint auch zu funkionieren. Doch bleibt das letzte Element erhalten, also muss ich es noch entfernen. Erstmal meinarray[length(meinarray)].free; und dann wollte ich mit Setlength(meinarray, length(meinarray) -1) den Array kürzen. Doch funktioniert das nicht. Brauche ich da eine andere Routine oder habe ich einen Fehler in meinen Code?
procedure Delete(index: Integer);
begin for i := index to length(meinarray) do begin meinarray[i] := meinarray[i + 1]; end; end; bye, Andy |
Re: Array verkleinern
Ein
Delphi-Quellcode:
nach der for-Sch,leife muss funktionieren.
SetLength(meinarray,Length(meinarray)-1);
|
Re: Array verkleinern
Handelt es sich hier um einen statischen oder dynamischen Array? setLength() funktioniert nur bei zweiteren
|
Re: Array verkleinern
dann müsste setLength aber eine AV bringen oder? und nicht einfach nicht funktionieren, wie oben beschrieben...
|
Re: Array verkleinern
Es ist ein dynamischer Array. Eine AV kommt nicht. Wenn ich in einer weiteren Routine, die nach Delete ausgeführt wird, bla := length(meinarray); showmessage(inttostr(bla)); aufrufe, steht da immer noch die Länge wie zuvor drin.
Warum beginnt der Index eines Arrays eigentlich mit 1 und nicht wie bei bspw. einer StringList mit 0? |
Re: Array verkleinern
Hi,
Also von Delphi selbst wird es ca. so gemacht:
Delphi-Quellcode:
Ich habs jetzt ausm Kopf gemacht... Ich hoffe das stimmt so...
procedure Delete(Index: Integer);
begin FreeAndNil(Array[Index]); System.Move(Array[Index+1],Array[Index],ArrayCount*SizeOf(ArrayDatenTyp)); dec(ArrayCount); SetLength(Array,ArrayCount); end; Gruß Neutral General |
Re: Array verkleinern
Ihr mit euren Arrays :mrgreen:
TObjectList nutzen und einfach die Methode Delete(index) aufrufen machts erheblich schneller. |
Re: Array verkleinern
Zitat:
|
Re: Array verkleinern
Zitat:
TObjectList kann ich nicht nutzen, weil meine Klasse von TComponent abstammt. Die ObjectList will aber TObject. Beim versuch meine Klasse umzuschreiben ging auf einmal gar nichts mehr... Warum auch immer... |
Re: Array verkleinern
Und TObject ist die Mutter aller Klassen auch TComponent
|
Re: Array verkleinern
Hi,
Dein Argument gegen die TObjectList ist nicht besonders gut ;) Du kannst casten und man kann sich ne Klasse von TObjectList ableiten die auf deine Klasse "spezialisiert" ist ;) Gruß Neutral General |
Re: Array verkleinern
Habs jetzt hinbekommen. :-)
Heute anscheinend bei meinen letzten versuch nur vergessen ein bla := Tobjectlist.create; im create meiner klasse aufzurufen :wall: Und jetzt frisst er auf einmal auch meine Klasse bei objlst.add(); Danke an alle |
Re: Array verkleinern
Zitat:
Delphi-Quellcode:
Aber eine Klasse zu vewenden wäre bestimmt günstiger:
var
DynArray: array of Integer; procedure TForm1.Button1Click(Sender: TObject); begin SetLength(DynArray, Length(DynArray) + 1); DynArray[High(DynArray)] := round(random * 100); end; procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(IntToStr(DynArray[High(DynArray)])); end; ![]() |
Re: Array verkleinern
Also deine Funktion wäre so wohl funktionsfähig:
Delphi-Quellcode:
oder
procedure Delete(index: Integer);
begin meinarray[i].Free; for i := index to High(meinarray) - 1 do meinarray[i] := meinarray[i + 1]; SetLength(meinarray, High(meinarray)); end;
Delphi-Quellcode:
procedure Delete(index: Integer);
begin meinarray[i].Free; for i := index + 1 to High(meinarray) do meinarray[i - 1] := meinarray[i]; SetLength(meinarray, High(meinarray)); end; Zitat:
Zitat:
allerdings muß auch das zu löschende Element weg und zwar komplett. :warn: Zitat:
Wenn du das machst, dann würde ja der letzte Eintrag im Array freigegeben (auch der kopierte ... sind ja schließlich das selbe Objekt :zwinker: ) PS: da du nur den Objektzeiger auf das i-te Element überschrieben hast, bleibt dennoch die Objektinstanz erhalten = Speicherleck. :stupid:
Delphi-Quellcode:
was genau funktionierte denn nicht? (kann es mir zwar denken, aber die Fehlerbeschreibung von dir ist nicht aussagekräftig.)
Doch funktioniert das nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 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