Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi generische ObjectList: Löschen eines Elementes (https://www.delphipraxis.net/183657-generische-objectlist-loeschen-eines-elementes.html)

himitsu 26. Jan 2015 20:36

AW: generische ObjectList: Löschen eines Elementes
 
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;

Helmi 26. Jan 2015 20:41

AW: generische ObjectList: Löschen eines Elementes
 
Zitat:

Zitat von himitsu (Beitrag 1287869)
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;

Dejan Vu 26. Jan 2015 21:43

AW: generische ObjectList: Löschen eines Elementes
 
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.

Sir Rufo 26. Jan 2015 22:09

AW: generische ObjectList: Löschen eines Elementes
 
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 :stupid:

jaenicke 27. Jan 2015 06:53

AW: generische ObjectList: Löschen eines Elementes
 
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.

Dejan Vu 27. Jan 2015 06:58

AW: generische ObjectList: Löschen eines Elementes
 
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.

Der schöne Günther 27. Jan 2015 07:56

AW: generische ObjectList: Löschen eines Elementes
 
Zitat:

Zitat von Dejan Vu (Beitrag 1287875)
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?

Dejan Vu 27. Jan 2015 10:27

AW: generische ObjectList: Löschen eines Elementes
 
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.

Der schöne Günther 27. Jan 2015 10:38

AW: generische ObjectList: Löschen eines Elementes
 
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. 8-)

(Nicht das Entfernen aus der Collection)-
Bekommt das noch deinen Segen?

Stevie 27. Jan 2015 11:15

AW: generische ObjectList: Löschen eines Elementes
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1287911)
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. 8-)

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.
Seite 2 von 2     12   

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