![]() |
Strings in ListView vergleichen
Abend alle zusammen,
ich habe gerade eine Denkblockade. :wall: Ich möchte aus einem ListView die Strings einer Spalte vergleichen und den Spaltenindex der Position wo ein sich von dem vorherigen Sting unterscheidender neuer String anfängt in eine StringList adden. Das klappt auch schon ganz gut bis zum ersten "Unterschied" aber ich weiss wie gesagt gerade nicht weiter wie ich ab dem ersten "Unterschied" dann weiter vergleiche und in die StringList adde. Hier mal Auszug wo ich gerade bin.
Delphi-Quellcode:
Vieleicht findet sich ja noch zu so später Stunde jemand der mir schnell weiter helfen kann. :)
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; sl: TStringList; begin sl:= TStringList.Create; for i := 0 to ListView1.Items.Count - 1 do if not (ListView1.Items[i].SubItems[2] = ListView1.Items[i+1].SubItems[2]) then break; sl.Add(IntToStr(i+1)); end; HG Onkelrossie |
Re: Strings in ListView vergleichen
Guten Morgen,
vielleicht musst du noch eine Kleinigkeit anpassen, aber vom Prinzip her sollte es so funktionieren:
Delphi-Quellcode:
Grüße vom marabu
procedure ExtractGroups(li: TListItems; index: Word; s: TStrings);
var i: Integer; sGroup, sTest: String; begin s.Clear; sGroup := ''; for i := 0 to Pred(li.Count) do begin sTest := IfThen(index = 0, li[i].Caption, li[i].SubItems[Pred(index)]); if (i = 0) or (sTest <> sGroup) then begin sGroup := sTest; s.Values[sGroup] := IntToStr(i); end; end; end; procedure TDemoForm.GroupsButtonClick(Sender: TObject); begin ExtractGroups(ListView.Items, ValueListEditor.Strings); end; |
Re: Strings in ListView vergleichen
Hallo onkelrossie,
Ich frage mich, wieso du ein break nutzt? Damit fliegst du komplett aus der for-schleife raus. Du willst aber doch weiterhin vergleichen. Warum machst du es nicht so:
Delphi-Quellcode:
1
procedure TForm1.Button1Click(Sender: TObject); var i:integer; sl: TStringList; begin sl:= TStringList.Create; for i := 0 to ListView1.Items.Count - 1 do begin if not (ListView1.Items[i].SubItems[2] = ListView1.Items[i+1].SubItems[2]) then sl.Add(IntToStr(i+1)); end; end; |
Re: Strings in ListView vergleichen
Hallo marabu!
Zitat:
Gruß Hawkeye |
Re: Strings in ListView vergleichen
Hallo Hawkeye,
du machst deinem nick alle Ehre - natürlich hast du Recht. Es sind sogar noch weitere Fehler vorhanden, da ich die Prozedur recht kurzentschlossen beim Posten noch verallgemeinert habe: der Hinweis auf die Unit StrUtils (wegen IfThen) fehlt und im Aufrufbeispiel habe ich den Parameter index gar nicht bedient. Hier der korrigierte Code:
Delphi-Quellcode:
Aber immernoch geht es nur ums Prinzip - Prüfungen fehlen und eine implizite Voraussetzung sind sortierte Spaltenwerte.
procedure ExtractGroups(li: TListItems; index: Word; s: TStrings);
var i: Integer; sGroup, sTest: String; begin s.Clear; sGroup := ''; for i := 0 to Pred(li.Count) do begin if index = 0 then sTest := li[i].Caption else sTest := li[i].SubItems[Pred(index)]; if (i = 0) or (sTest <> sGroup) then begin sGroup := sTest; s.Values[sGroup] := IntToStr(i); end; end; end; procedure TDemoForm.ButtonClick(Sender: TObject); begin ExtractGroups(ListView.Items, 3, ValueListEditor.Strings); end; Freundliche Grüße vom marabu |
Re: Strings in ListView vergleichen
Hallo,
danke erstmal für deine Vorschläge, Marabu! Ich werde sie gleich einmal testen und dann Antwort geben. Zitat:
HG Onkelrossie |
Re: Strings in ListView vergleichen
Delphi-Quellcode:
und
for i := 0 to ListView1.Items.Count - 1 do
Delphi-Quellcode:
passen nicht zusammen, denn im letzten durchlauf greifst du so auf
if not (ListView1.Items[i].SubItems[2] = ListView1.Items[i+1].SubItems[2]) then //Exception
Delphi-Quellcode:
zu, was zu der Exception führt...mach die schleife bis -2 dann sollte es gehen
ListView1.Items[ListView1.Items.Count].SubItems[2]
Gruß Frank |
Re: Strings in ListView vergleichen
Hi,
So vergleichst du aber nur den vorherigen String mit dem nächsten und nicht jeden String mit jedem in der Liste. @Frank Steht doch schon im vorherigen Post. |
Re: Strings in ListView vergleichen
Morgen,
@C.Schock, genau das wollte ich auch nur. @_frank_, das habe ich doch schon geschrieben. @Marabu, dein Code funktionierte bei mir nach ein paar änderungen auch wunderbar. Danke nochmal an alle die geholfen haben. HG Onkelrossie |
Re: Strings in ListView vergleichen
Abend zusammen,
ich stehe schon wieder vor einem Problem. :gruebel: ich habe nun wie oben beschrieben ein ListView in dem ich eine Spalte auf Unterschiede durchlaufe bzw. den Index wo ein neuer Wert anfängt in eine StringList speichere. Jetzt wollte ich die Spalte paralell daneben auf Gleichheit prüfen. z.B.
Delphi-Quellcode:
SubItem2 durchlaufe ich ja schon wie beschrieben mit diesem Code womit ich den Index bekomme wo eine neue Gruppe anfängt:
SubItem1 | SubItem2 //Die Spalte "SubItem2" Definiert die Gruppe
---------|--------- gleich | a } gleich | a } Gruppe1(SubItem1 = vollständig) gleich | a } | gleich | b } ungleich | b } Gruppe2(SubItem1 <> vollständig) ungleich | b }
Delphi-Quellcode:
Jetzt wollte ich, das auf Basis dieses Codes SubItem1 durchlaufen wird und den Index des letzten Items der jeweiligen Gruppe zurrück gibt, deren Items den Wert "gleich" haben. Solange in einer Gruppe noch ein wert namens "Ungleich" ist soll garnix passieren. Bis jetzt habe ich es wieder so weit hin bekommen das es mit der ersten Gruppe klappt. Aber danach scheint irgendwo was falsch zu laufen in den For Schleifen.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; sl: TStringList; begin sl:= TStringList.Create; for i := 0 to ListView1.Items.Count - 2 do if not (ListView1.Items[i].SubItems[2] = ListView1.Items[i+1].SubItems[2]) then sl.Add(IntToStr(i+1)); end;
Delphi-Quellcode:
Ich hoffe ich konnte mein Problem verdeutlichen und es findet sich jemand der mir helfen kann.
procedure TForm1.Button1Click(Sender: TObject);
var i, idx, c :integer; sl, slok: TStringList; begin sl:= TStringList.Create; for i := 0 to ListView1.Items.Count - 2 do if not (ListView1.Items[i].SubItems[2] = ListView1.Items[i+1].SubItems[2]) then sl.Add(IntToStr(i+1)); for idx := 0 to sl.Count - 2 do begin for I := StrToInt(sl.Strings[idx]) to StrToInt(sl.Strings[idx + 1]) do begin if Listview1.Items[i].SubItems[2] = 'gleich' then c := c + 1; //hier wusste ich nicht mehr so richtig wie ich weiter if c = StrToInt(sl.Strings[idx + 1]) then slok.add(sl.Strings[idx + 1]; //machen sollte und dabei ist das raus gekomen end; end; end; Danke schonmal im vorraus an alle die sich die Zeit nehmen eine Lösung zu finden. HG Onkelrossie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr. |
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