AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language ersten n Elemente aus einem dynamischen Array ausschneiden
Thema durchsuchen
Ansicht
Themen-Optionen

ersten n Elemente aus einem dynamischen Array ausschneiden

Ein Thema von Sveno2 · begonnen am 23. Okt 2005 · letzter Beitrag vom 23. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
Sveno2

Registriert seit: 21. Okt 2005
9 Beiträge
 
#1

ersten n Elemente aus einem dynamischen Array ausschneiden

  Alt 23. Okt 2005, 16:19
Wie geht das?

Gruss Sven
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 16:27
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 16:31
Also mit einer TStringList: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.: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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#4

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 16:38
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 . 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);
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 16:41
So, hab meinen Beitrag oben geändert.
Jetzt müsste es so funzen.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 17:14
Hi.

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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 17:41
Schon von Copy() und Slice() gehört? Markieren und F1 drücken. Borland hat für dyn. Arrays schon vorgesorgt.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 17:52
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
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#9

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 17:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: ersten n Elemente aus einem dynamischen Array ausschneid

  Alt 23. Okt 2005, 17:54
@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
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:12 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