AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array-Element löschen

Ein Thema von Taladan · begonnen am 12. Jun 2005 · letzter Beitrag vom 14. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#1

Array-Element löschen

  Alt 12. Jun 2005, 22:11
Hallo, ich will in einen dynamsiches Array, in dem ich Records habe, eines raus nehmen und die anderen Nachrücken lasse. Doch irgendwie erhalte ich immer Zugriffsverletzungen oder erhalte nicht das richtige Ergebnis.

Delphi-Quellcode:
procedure TFeldliste.DeleteField(Index: Integer);
var i,l : integer;
begin
  L := length(FListe);
    for i := index to L-1 do begin
      FListe[i].ID := FListe[i+1].id;
      FListe[i].Name := FListe[i+1].Name;
      FListe[i].typ := FListe[i+1].typ;
    end;
  setlength(Fliste, length(fliste)-1);

end;
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Array-Element löschen

  Alt 12. Jun 2005, 22:13
Du musst L-2 statt L-1 schreiben, da Array[Length(Array)-1+1] genau um 1 zu groß ist
Benjamin
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#3

Re: Array-Element löschen

  Alt 12. Jun 2005, 22:18
Wenn du aus deinem Record eine Klasse machst und statt dem Array einen TObjectList (oder eine eigene Ableitung) von TObjectList nimmst dürfte es weniger bis keine Probleme mehr geben. Auf jeden Fall weniger Code.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Array-Element löschen

  Alt 12. Jun 2005, 22:20
Moin Taladan,

ich weiss ja nicht, wie gross die Liste werden kann, aber ich hatte es vor kurzen auch so gemacht (Kombination dynamisches Array und Record), und auch ganze Bereiche so gelöscht / eingefügt wie Du.
Der Umbau auf TObjectList statt des dynamischen Arrays und einer simplen Klasse (ohne Methoden ) statt des Records hat mir eine Geschwindigkeitssteigerung um den Faktor 30 gebracht (ca. 30 Sekunden statt vorher ca. 1000).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Array-Element löschen

  Alt 12. Jun 2005, 22:27
Zitat von Christian Seehase:
Der Umbau auf TObjectList statt des dynamischen Arrays und einer simplen Klasse (ohne Methoden ) statt des Records hat mir eine Geschwindigkeitssteigerung um den Faktor 30 gebracht (ca. 30 Sekunden statt vorher ca. 1000).
Das Problem an einem Array ist einfach, dass er keine Klasse ist.
Deshalb kann man ihn nicht, wie es TList macht, sprungweise wachsen lassen.
Man könnte es, aber es wäre irgendwo ein hässlicher Krampf immer erst eine olle funktion aufzurufen, die das macht.
TList selbst ist ja auch nur ein Array, nur halt in einer verwendbaren Kapselung...
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Array-Element löschen

  Alt 12. Jun 2005, 22:30
TObjectList <---- Die Antwort auf viele, sehr viele Wutentbrannte Stunden!!!

Warum hab ich die net schon vorher gekannt. Gabs die schon in delphi4std ? Ich glaub net... da kamen ja grad die dynamischen Arrays hinzu...

Toll, alles wieder um schreiben. Aber wenigstens danach weniger getippe...

Dumme Frage dazu.

Zitat OH:
Zitat:
Rufen Sie Extract auf, um ein Objekt aus der Liste zu entfernen ohne das Objekt selbst dadurch freizugeben. Nachdem das Objekt entfernt ist, werden alle folgenden Objekte in der Indexposition nach oben verschoben und Count wird herabgesetzt.
Was bedeutet das mti dem Object frei geben? Wird das dann nicht gelöscht? Wenn es aber nicht mehr in der Liste drin ist, wo ist das Object dann? Werd aus der OH nicht so ganz schlau (Ich vermisse die guten alten Beispiele die es in der OH von D4 noch gab
Marco
Wer Rechtschreibfehler findet, der darf sie behalten

Carpe Diem - Nutze den Tag (und zwar den ganzen!)
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: Array-Element löschen

  Alt 12. Jun 2005, 22:33
Zitat von Taladan:
wenistens danach weniger getippe...
Hier habe ich eine kleine Beispielliste getippt: http://www.delphipraxis.net/internal...=381090#381090
Du könntest einfach TToken durch deine FeldDings-Klasse ersetzen und schon sparst du dir viel rumgecaste.

edit: Da fehlte wohl ein "weni" im Zitat.
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#8

Re: Array-Element löschen

  Alt 13. Jun 2005, 08:15
Und falls man doch nicht auf Arrays verzichten kann hilft meine DeleteArray-Funktion:

http://www.delphipraxis.net/internal...ht=deletearray
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#9

Re: Array-Element löschen

  Alt 13. Jun 2005, 08:45
Zitat von Robert_G:
TList selbst ist ja auch nur ein Array, nur halt in einer verwendbaren Kapselung...
Wirklich? Ich dachte immer n List funktioniert über Pointer: Jedes Item hat n Pointer auf das vorherige und das nächste Item. N dynamisches Array is aber nix anderes als n statisches mit n bisschen Compiler-Magic. Beim Vergrößern wird einfach n neues - statisches - Array erstellt und die Daten reinkopiert. Bei ner List wird n neues Item erstellt und der Pointer des letzten Otems von nil auf die Adresse des neuen Items gesetzt. Oder hab ich das was verpeilt?

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#10

Re: Array-Element löschen

  Alt 13. Jun 2005, 08:49
Du kannst auch das ganze item hochrollen:
Delphi-Quellcode:
procedure TFeldliste.DeleteField(Index: Integer);
var i,l : integer;
begin
  L := length(FListe);
    for i := index to L-2 do
    begin
      FListe[i] := FListe[i+1];
    end;
  setlength(Fliste, length(fliste)-1);

end;
Das ist kürzer und schneller. Nicht schneller als diese ObjectList, aber dafür kannst du dir das umschreiben sparen. Naja und bei kleinen Listen (<1000 Elemente) wirst du dabei auch keinen Performancenachteil haben, wenn du diese procedure nicht ganz oft hintereiander ausführst.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  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 05:55 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