AGB  ·  Datenschutz  ·  Impressum  







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

Arrays

Ein Thema von Jacob · begonnen am 18. Apr 2020 · letzter Beitrag vom 19. Apr 2020
Antwort Antwort
Jacob

Registriert seit: 14. Apr 2020
Ort: Dresden
4 Beiträge
 
Delphi 10.3 Rio
 
#1

Arrays

  Alt 18. Apr 2020, 13:12
Delphi-Version: 10.3 Rio
Hi,
ich arbeite momentan mit einer ListBox. Zu dieser habe ich eine Funktion geschrieben, die es mir erlaubt (erlauben sollte), Elemente zu löschen.
Im Hintergrund habe ich einen Array, der zum ListenIndex die Daten festhält.
Wird nun in der ListBox ein Element gelöscht, soll dieses ebenfalls (um später Probleme beim Speichern zu vermeiden) aus dem Array gelöscht werden.
Dazu verwende ich einen zweiten Array, der die Werte mit Auslassung des zu löschenden Elements aufnimmt.

-MyItems ist der Array, in dem die Daten gespeichert werden
-_object ist die ListBox
-_index ist der Index des ausgewählten Elements in der ListBox
Code:
var
  _array: TArray2;
  I1,I2,a: Integer;
begin

  a := 0;
  _array := MyItems;

  for I1 := 0 to _object.Items.Count do
  begin

    if I1 <> _index then
    begin

      for I2 := 0 to 8 do
      begin

        _array[a, I2] := MyItems[I1, I2]; //Hier wird mir der Fehler angezeigt: Zugriffsverletzung bei Adresse ...

      end;

      a := a + 1;
    end;

  end;

  MyItems := _array;
  _object.Items.Delete(_index);

  Result := _object;
An beschriebener Stelle bricht das Programm ab. Der Compiler zeigt so weit keine Fehler.
Wenn ihr Ideen habt, immer her damit.

Vielen Dank,
Jacob.
Jacob
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: Arrays

  Alt 18. Apr 2020, 13:28
Da du ja so oder so schon eine ObjectListe zu haben scheinst, wäre hier VirtualStringTree echt einfacher.
Wenn das richtig aufgebaut ist, brauchst du dich um die Löschung quasi nicht kümmern.

Das mit dem Array, oder den zwei Arrays, wird vorne und hinten nix.

Du solltest den Titel ändern.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#3

AW: Arrays

  Alt 18. Apr 2020, 13:40

for I1 := 0 to _object.Items.Count do
begin
Hier stimmt schon das Iterieren nicht. Du startest mit 0 (was ja auch OK ist), läufst aber bis "Count". Hier muss es "Count -1" heißen.

Aber die Infos oben sollten beschreiben, was besser gemacht werden kann.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.138 Beiträge
 
Delphi 12 Athens
 
#4

AW: Arrays

  Alt 18. Apr 2020, 15:08
Warum überhaupt sorum?

Die ListBox und auch andere ListenKomponenten, sowie TStringList, haben nicht umsonst eine Data/Object-Eigenschaft an den Items, wo man seine Daten verlinken/reintun kann, anstatt zu versuchen mehrere Listen synchron zu halten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Arrays

  Alt 18. Apr 2020, 21:54
a)Ich habe eine Liste, die /bzw. _Teile der Listendatensätze in einer .... angezeigt werden.
b)Tritt in der ... eine Löschanforderung für einen Datensatz auf, wird dieser Datensatz in der Liste gelöscht.
gehe zu a)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Arrays

  Alt 18. Apr 2020, 23:26
Ich würde - wie schon beschrieben - die Objekte der Liste direkt in der Listbox referenzieren und beim Löschen das (dann ja bekannte) Objekt aus der Liste löschen. Sollten mehrere Items in einem Durchgang gelöscht werden, nicht vergessen von „hinten nach vorne“ zu iterieren, da durch das Delete die Elemente verschoben werden und dann die Indizes sowie „Count“ nicht mehr passen.
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.138 Beiträge
 
Delphi 12 Athens
 
#7

AW: Arrays

  Alt 19. Apr 2020, 00:02
da durch das Delete die Elemente verschoben werden und dann die Indizes sowie „Count“ nicht mehr passen.
Ja, dass Count so nicht mehr passt, ist ein "merkliches" Problem,
aber wenn du löschst, wann wird da auch der nächste Eintrag übersprungen.

Wenn man sorum arbeitet, dann nehmen man eine der anderen Schleifen (z.B. WHILE)
und darf beim Löschen den Index nicht hochzählen, also Delete ODER Index+1.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Arrays

  Alt 19. Apr 2020, 12:21
da durch das Delete die Elemente verschoben werden und dann die Indizes sowie „Count“ nicht mehr passen.
Ja, dass Count so nicht mehr passt, ist ein "merkliches" Problem,
aber wenn du löschst, wann wird da auch der nächste Eintrag übersprungen.

Wenn man sorum arbeitet, dann nehmen man eine der anderen Schleifen (z.B. WHILE)
und darf beim Löschen den Index nicht hochzählen, also Delete ODER Index+1.
Daher würde ich bei Löschaktionen in Listen immer von "Count-1" nach 0 durchiterieren. Zumindest habe ich das so "gelernt".
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.138 Beiträge
 
Delphi 12 Athens
 
#9

AW: Arrays

  Alt 19. Apr 2020, 12:53
Jo, weil es mehrere Voreile hat.
  • weniger zu überlegen, in der einfacheren Schleife
  • beim FOR sogar mit einen schöneren ENDE .... immer "konstant" 0 (oder 1), statt einer Variable
    • das FOR cached sogar das Ende, also kopiert sich den Wert zu Begin in eine Varialbe, anstatt immer wieder die Funktion Count/Length/High zu verwenden
    • drum knallt es dann auch so schön, was gut ist, damit man die übersprungenen Einträge sofort bemerkt
    • und falls nur ein Eintrag gelöscht wird, dann merkt man auch sofort das vergessene BREAK
  • und in dem Array / der Liste muß bei "mehreren" Löschungen weniger Speicher kopiert werden, da hinten das Ende immer kürzer wird.


OK, bei verketteten Listen ist Reihenfolge egal, da geht man einfach der Kette entlang, wobei des hier in der Doppelkette vermutlich noch einfacher geht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Apr 2020 um 14:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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:46 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