Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Doppelte Zeilen aus einem TMemo löschen (https://www.delphipraxis.net/107845-doppelte-zeilen-aus-einem-tmemo-loeschen.html)

Maxisoft2 3. Feb 2008 11:37


Doppelte Zeilen aus einem TMemo löschen
 
Hallo liebe Delphiler,

Kaum ist der erste Teil meiner Frage gelöst, taucht ein weiterer auf -
Ich möchte in meinem Memo, dass pro Zeile mit einer ID gefüllt ist,
die doppelten / dreifachen / zehnfachen gleichen Zeilen entfernen -

z.B.:
id=be1aaeaa40859fa5
id=f88d479ad888c8a0
id=f88d479ad888c8a0
id=b0498dcaf0b70f04
id=b0498dcaf0b70f04
id=a143e956ca7ad9ac
id=a143e956ca7ad9ac
id=be1aaeaa40859fa5
id=235b0e8cd726ff5f
id=a35f1c800d72558f
id=e36734d9530e6bc0
id=e36734d9530e6bc0
id=d2a331de7c42825f
id=d2a331de7c42825f
id=5076c8e1d3141bde

Was - so glaube ich - irgendwie mit einer Schleife möglich sein sollte,
ich bin allerdings komplett planlos, mit welchen Kommandos ich das bewerkstelligen
kann. Habe leider auch keine Beispiele bei Google gefunden, aber es sollte
ja schon eine Delphi-interne Möglichkheit geben, doppelte Strings zu vergleichen und
dann solange zu löschen, bis nurnoch einer da ist!?

Würde mich riesig über Hilfe freuen,
- M.S.

Blackheart 3. Feb 2008 11:48

Re: Doppelte Zeilen aus einem TMemo löschen
 
Delete, IndexOf

Klaus01 3. Feb 2008 13:32

Re: Doppelte Zeilen aus einem TMemo löschen
 
Hallo,

so könnte es auch ohne Schleifen gehen:

Delphi-Quellcode:
var
  sl: TStringList;

sl := TStringlist.create;
sl.sorted := true;
sl.duplicates := dupIgnore;
sl.assign(Memo1.lines);
Memo1.lines.assign(sl);
sl.free;
Grüße
Klaus

marabu 3. Feb 2008 14:11

Re: Doppelte Zeilen aus einem TMemo löschen
 
Hallo,

hier noch ein In-Place-Ansatz:

Delphi-Quellcode:
procedure KillDuplicates(s: TStrings);
var
  iLow, iHigh: integer;
begin
  for iLow := 0 to s.Count - 2 do
    for iHigh := Pred(s.Count) downto Succ(iLow) do
      if s[iLow] = s[iHigh] then
        s.Delete(iHigh);
end;
Und wenn der Parameter immer "id" heißt, dann würde ich in AddToList() den Url-Präfix noch etwas erweitern:

Delphi-Quellcode:
const
  PFX = 'http://www.webseite.de/profile.php?id=';
Es werden dann nur die Codes eingetragen.

Freundliche Grüße

Maxisoft2 3. Feb 2008 17:33

Re: Doppelte Zeilen aus einem TMemo löschen
 
Hallo,

Vielen Dank für die zahlreichen Antworten,
sie haben mir alle weitergeholfen!

Marabu, mein Lebensretter!
Mit deinem Vorschlag läuft das Ganze am aller, aller schnellsten und Besten.
(Sind teilweise 900 Einträge, mit deinem Beispiel läuft das Ganze durch wie Butter!)
Du bist echt genial!

- Max

marabu 3. Feb 2008 17:45

Re: Doppelte Zeilen aus einem TMemo löschen
 
Max, du übertreibst schamlos.

Es geht noch schneller, falls du vergessen haben solltest, während der Ausführung von KillDuplicates() die Aktualisierung der Memo.Lines abzuschalten:

Delphi-Quellcode:
begin
  Memo.Lines.BeginUpdate;
  KillDuplicates(Memo.Lines);
  Memo.Lines.EndUpdate;
end;
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 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