AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi generische ObjectList: Löschen eines Elementes
Thema durchsuchen
Ansicht
Themen-Optionen

generische ObjectList: Löschen eines Elementes

Ein Thema von Helmi · begonnen am 26. Jan 2015 · letzter Beitrag vom 27. Jan 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

AW: generische ObjectList: Löschen eines Elementes

  Alt 26. Jan 2015, 20:36
Zitat:
Delphi-Quellcode:
procedure Masken_ausblenden(akt_MaskID: String);
  var
    i : Integer;
    MaskeFeld: TMaskeFeld;
  begin
    for MaskeFeld in ObjectList_sichtbare_Masken do
      If MaskeFeld.NameID <> akt_MaskID then
        begin
          MaskeFeld.Visible := false;

          i := ObjectList_sichtbare_Masken.IndexOf(MaskeFeld);
          ObjectList_sichtbare_Masken.Delete(i);
        end;
  end;
Delphi-Quellcode:
procedure Masken_ausblenden(akt_MaskID: String);
  var
    MaskeFeld: TMaskeFeld;
  begin
    for MaskeFeld in ObjectList_sichtbare_Masken.Reverse do
      If MaskeFeld.NameID <> akt_MaskID then
        begin
          MaskeFeld.Visible := False;
          ObjectList_sichtbare_Masken.Remove(MaskeFeld);
        end;
  end;
Aber auch bei generischen Listen kann man für sowas immernoch eine For-Do-Schleife benutzen.

Oder vielleicht auch so?
Delphi-Quellcode:
procedure Masken_ausblenden(akt_MaskID: String);
  var
    MaskeFeld, MaskeFeld2: TMaskeFeld;
  begin
    MaskeFeld := ObjectList_sichtbare_Masken.Find(MaskID); // sowas ist das Erste, was man sich baut - womöglich mit passendem Comperator
    for MaskeFeld2 in ObjectList_sichtbare_Masken do
      MaskeFeld2.Visible := MaskeFeld2 = MaskeFeld;
    ObjectList_sichtbare_Masken.Clear;
    ObjectList_sichtbare_Masken.Add(MaskeFeld);
  end;
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 Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#12

AW: generische ObjectList: Löschen eines Elementes

  Alt 26. Jan 2015, 20:41
Oder vielleicht auch so?
Delphi-Quellcode:
procedure Masken_ausblenden(akt_MaskID: String);
  var
    MaskeFeld, MaskeFeld2: TMaskeFeld;
  begin
    MaskeFeld := ObjectList_sichtbare_Masken.Find(MaskID); // sowas ist das Erste, was man sich baut - womöglich mit passendem Comperator
    for MaskeFeld2 in ObjectList_sichtbare_Masken do
      MaskeFeld2.Visible := MaskeFeld2 = MaskeFeld;
    ObjectList_sichtbare_Masken.Clear;
    ObjectList_sichtbare_Masken.Add(MaskeFeld);
  end;
Ist gut gemeint (und ein toller Vorschlag) - nur das Visiblen passiert ggf. wo anders
daher ist es nicht so einfach

ich bin jetzt einfach wieder auf die alte for-Schleife umgestiegen, aber halt in Verbindung mit Generics

Delphi-Quellcode:
  procedure Masken_ausblenden(akt_MaskID: String);
  var
    i : Integer;
    MaskeFeld: TMaskeFeld;

  begin
    for i := Pred(ObjectList_sichtbare_Masken.Count) downto 0 do
      begin
        MaskeFeld := ObjectList_sichtbare_Masken.Items[i];

        If MaskeFeld.NameID <> akt_MaskID then
          begin
            MaskeFeld.Visible := false;

            ObjectList_sichtbare_Masken.Delete(i);
          end;
      end;
  end;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#13

AW: generische ObjectList: Löschen eines Elementes

  Alt 26. Jan 2015, 21:43
Ich finde Iteratoren ja auch ganz elegant, aber wenn ich etwas mit der Liste anstellen muss (oder den Index brauche), dann nehe ich auch die gute alte for-Schleife. Einfach, klar, direkt und kein überflüssiger Firlefanz.

Mich wundert es, das Delphi erlaubt, während der Verwendung eines Iterators die Liste manipulieren zu dürfen. Das ist sehr unsauber.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: generische ObjectList: Löschen eines Elementes

  Alt 26. Jan 2015, 22:09
Und? Wenn der das nicht erlauben würde dann einfach so
Delphi-Quellcode:
for LItem in MyList.ToArray do
  MYList.Remove( LItem );


Nicht, das jemand meint das wäre jetzt schneller als über den Index, aber es geht halt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.347 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: generische ObjectList: Löschen eines Elementes

  Alt 27. Jan 2015, 06:53
Mit ToArray mache ich das auch meistens, ja. Der Geschwindigkeitsunterschied ist in den meisten Fällen vernachlässigbar und so ist es einfach schöner lesbar.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#16

AW: generische ObjectList: Löschen eines Elementes

  Alt 27. Jan 2015, 06:58
Hmm.. Wenn "MyList" noch keinen Zugriff über einen Index hätte (wie bei einem Dataset z.B.), würde ich das auch so machen, aber so... Ist das irgendwie ein ziemlich überflüssiger Schritt.

Aber klar: Wieso einfach, wenns auch umständlich geht.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

AW: generische ObjectList: Löschen eines Elementes

  Alt 27. Jan 2015, 07:56
Mich wundert es, das Delphi erlaubt, während der Verwendung eines Iterators die Liste manipulieren zu dürfen. Das ist sehr unsauber.
Ich verstehe nicht- Tut es doch auch nicht? Nur weil einem keine Schutzverletzungen um die Ohren fliegen heißt das doch nicht, dass es erlaubt ist nur weil es grade mal funktioniert hat?
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#18

AW: generische ObjectList: Löschen eines Elementes

  Alt 27. Jan 2015, 10:27
Ein FailFast wäre schon was feines im 'Remove', wenn ein Iterator gerade aktiv ist. Scheint aber keine Sau zu stören. Insofern ist Delphi hier näher an C dran, als an C#. Blöd.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#19

AW: generische ObjectList: Löschen eines Elementes

  Alt 27. Jan 2015, 10:38
Die Borland Standard-Collections kann man sich sowieso abgewöhnen- Die Collections aus Spring4D wrappen (ich glaube allesamt) zwar die Standard-Collections, aber haben auch daran gedacht: Wenn der Iterator eins weiter wandert und sich die Collection geändert hat fliegt man raus.

(Nicht das Entfernen aus der Collection)-
Bekommt das noch deinen Segen?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#20

AW: generische ObjectList: Löschen eines Elementes

  Alt 27. Jan 2015, 11:15
Die Collections aus Spring4D wrappen (ich glaube allesamt) zwar die Standard-Collections, aber haben auch daran gedacht: Wenn der Iterator eins weiter wandert und sich die Collection geändert hat fliegt man raus.
Nachdem jeder im Team mindestens einmal solchen Code geschrieben hat, der dann still und leise falsche Daten zurück ließ, hab ich das seinerzeit eingebaut damit mans direkt mitbekommt

Was mir in Verbindung mit der Frage noch einfiel ist, dass ich mal in IList<T> ein RemoveAll einbauen sollte.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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