Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ersten n Elemente aus einem dynamischen Array ausschneiden (https://www.delphipraxis.net/55576-ersten-n-elemente-aus-einem-dynamischen-array-ausschneiden.html)

Sveno2 23. Okt 2005 15:19


ersten n Elemente aus einem dynamischen Array ausschneiden
 
Wie geht das?

Gruss Sven:)

Khabarakh 23. Okt 2005 15:27

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Indem du jedes einzelne Element um n Indizes vorschiebst und dann dann SetLength mit Length(...) - n aufrufst. Wenn du dir das ersparen willst, solltest du dir die Klasse Delphi-Referenz durchsuchenTList (bzw. für Instanzen Delphi-Referenz durchsuchenTObjectList und für Strings Delphi-Referenz durchsuchenTStringList) anschauen.

Martin K 23. Okt 2005 15:31

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Also mit einer TStringList:
Delphi-Quellcode:
var Liste: TStringList;
geht das ganz einfach so:
Delphi-Quellcode:
For i:=1 to n do
begin
  If Liste.Count=0 then
    Exit;
  Liste.Delete(0);
end;

Da bei einem Array die Anzahl der Zeilen vordefiniert ist,
kannst du nicht nachträglich im Quellcode die Anzahl der Zeilen verändern.

z.B.:
Delphi-Quellcode:
var Liste: Array[1..20] of Strings;
Dann hast du 20 Zeilen, da kannste keine einfach so rausnehmen.

Höchstens so:
Delphi-Quellcode:
For i:=1 to n do
begin
  Liste[i]:='';
  If i=20 then
    Exit;
end;
Aber dann hast du immer noch 20 Zeilen, bloß die ersten n Zeilen sind halt einfach leer.

Khabarakh 23. Okt 2005 15:38

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Zitat:

Zitat von Martin K
Also mit einer TStringList geht das ganz einfach:

Delphi-Quellcode:
var
  StringList: TStringList;

...

For i:=0 to n do
  StringList.Delete(n);

Jupp, es geht wirklich einfach. Aber nicht so :wink: . Da sofort nach dem Löschen die Indizes der verbliebenen Items angepasst werden, würdest du mit deinem Code den 0., 2., 4., 6. usw. String löschen.
[add] Außerdem muss die Schleife natürlich bis n - 1 laufen. [/add]
Delphi-Quellcode:
for i := 0 to n - 1 do
  Strings.Delete(0);
oder
Delphi-Quellcode:
for i := n - 1 downto 0 do
  Strings.Delete(i);

Martin K 23. Okt 2005 15:41

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
So, hab meinen Beitrag oben geändert.
Jetzt müsste es so funzen.

marabu 23. Okt 2005 16:14

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Hi.

Zitat:

Zitat von Martin K
Da bei einem Array die Anzahl der Zeilen vordefiniert ist,
kannst du nicht nachträglich im Quellcode die Anzahl der Zeilen verändern.

Bei dynamischen Arrays - siehe Titel - geht das:

Delphi-Quellcode:
type
  TBaseType = integer;
  TIntegerArray = array of TBaseType;

procedure DeleteElements(var da: TIntegerArray; start, count: cardinal);
var
  i: integer;
begin
  if count > (length(da) - start)
    then count := Length(da) - start
    else Move(da[start + count], da[start], SizeOf(TBaseType) * (Length(da) - start - count));
  SetLength(da, Length(da) - count);
end;
Grüße vom marabu

jbg 23. Okt 2005 16:41

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Schon von Copy() und Slice() gehört? Markieren und F1 drücken. Borland hat für dyn. Arrays schon vorgesorgt.

marabu 23. Okt 2005 16:52

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Hallo Andreas,

vielen Dank für diese Information. Da ich in noch keinem Projekt dynamische Arrays eingesetzt habe, ist mir das völlig entgangen.

Freundliche Grüße vom marabu

Der_Unwissende 23. Okt 2005 16:53

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
Ansonsten auch unbedingt setLength zum ändern der Größe vermeiden. Wurde bestimmt schon in einigen Threads behandelt, kann zu tierischen Speicherlecks führen. Am besten dafür vorgesehene Funktionen (die ja schon von jpg gepostet wurden) verwenden. Bei häufigem setLength ist der Speicher schnell sinnlos weg.

Gruß Der Unwissende

Flocke 23. Okt 2005 16:54

Re: ersten n Elemente aus einem dynamischen Array ausschneid
 
@marabu: Move darf man aber nur bei Elementtypen verwenden, die keine Initialisierung oder Finalisierung benötigen, also insbesondere keine Strings sind oder beinhalten.

Ansonsten sollte man den Bereich, den man überschreiben will, vorher mit Finalize finalisieren und den hinten überstehenden Quellbereich mit FillChar leeren - oder in einer Schleife von Hand die Einträge kopieren.

@Der_Unwissende: SetLength hat mit den Speicherlecks eigentlich nichts zu tun...

@jbg: slice kenn' ich nicht :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Seite 1 von 2  1 2      

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