TListView und die ausgewählten Reihen...

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

TListView und die ausgewählten Reihen...

Beitrag von Adromir »

Mir wird es langsam echt peinlich das Forum mit meinen Fragen vollzuspammen :( Aber irgendwie komme ich gerade mit einem Problem nicht weiter, daß ich eigentlich für ganz einfach gehalten habe ..

Ich habe eine TListview (vsReport und multiselect true) und will dort die Items zählen, die der User ausgewählt hat, bzw später dann auch was damit machen. Aber alles was ich bisher versucht habe und alle im Netz gefundenen Codeschnipsel funktionierten nicht.

Code: Alles auswählen

ListView1.Items.SelCount


zählt einfach nicht richtig. Wenn ich mir den Wert per ShowMessage beim OnSelectItem anzeigen lasse, dann fängt er bei -1 an, zählt dann korrekt bis 1 hoch, dann bleibt der wert aber dabei.

Code: Alles auswählen

var Item : TListItem;
begin
  Item := Listview1.selected;
  showmessage(Item.text);
end;

von http://forum.lazarus.freepascal.org/ind ... ic=25758.0 will gar nicht kompilieren, da Lazarus direkt meckert, daß Text keine erlaubte eigenschaft ist

wenn ich sowas mache:

Code: Alles auswählen

 
for i := 0 to ListView1.Items.Count-1 do
  begin
    if ListView1.Items.Selected = True then
      dosomething();
   end
 


krieg ich nen SigSev fehler.. Es scheint mir jedenfalls so das Selected einen Falschen Wert zurück liefert? wenn ich alle alle Items durchlaufen lasse per

Code: Alles auswählen

 
for i := 0 to ListView1.Items.Count-1 do
  begin
    ShowMessage(BoolToStr(ListView1.Items[i].Selected));
   end
 


Dann krieg ich immer nur eine 0 zurück geliefert :/

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und die ausgewählten Reihen...

Beitrag von wp_xyz »

Bist du sicher, dass du alles richtig abgeschrieben hast? Ich kann mir nicht vorstellen, dass das so im Web steht. Oder du hast blind genommen, was du so gesehen hast, ohne zu verstehen, was du eigentlich tust.
  • Die Eigenschaft "Items" einer ListView ist eine Collection, Klasse TListItems (Plural). Die einzelnen Elemente der Collection sind Objekte der Klasse TListItem (Singular), und als Array-ähnliche Eigenschaft "Item[j]" abrufbar. Mit dem Aufruf "ListView1.Items.Item[0]" kommst du an die Eigenschaften jedes Collection-Elements. Da Item[j] die "Default"-Eigenschaft der Collection Items ist, kann man den "Array"-Index auch gleich direkt hinter Items setzen, also "ListView1.Items[0]".
  • Jeder ListItem hat eine boolsche Eigenschaft "Selected": mit "ListView1.Items[0].Selected" kannst du prüfen, ob der 1. Eintrag (Index 0) ausgewählt ist.
  • "SelCount" ist eine Eigenschaft der ListView, also musst du "ListView1.SelCount" aufrufen. "ListView1.Items.SelCount" gibt es gar nicht.
  • "ListView1.Selected" ist das Element der Items, das gerade ausgewählt wurde, also einer von den "ListView1.Items.Item[j]".
Das beigefühgte Demo-Programm zählt die ausgewählten Items einmal mit Hilfe der TListItem-Eigenschaft "Selected", und einmal durch Abfragen von TlistView.SelCount.
Dateianhänge
ListView_MultiSelect.zip
(2.03 KiB) 87-mal heruntergeladen

Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Re: TListView und die ausgewählten Reihen...

Beitrag von Adromir »

So ich hab jetzt den Denkfehler rausgefunden. Ich hab die Items immer über die Checkbox in der TListview ausgewählt. Hätte mir ja denken können das das nicht das gleiche ist *kopfklatsch*..

Auch wenn es jetzt damit nichts zu tun hat, mir ist Aufgefallen, daß das LIstView unter windows leer bleibt, bis alles einträge geladen sind. Unter Linux werden die Items direkt gezeichnet, was mir besser gefällt. Kriegt man das hin, daß sich das bei Windows genau so verhält?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und die ausgewählten Reihen...

Beitrag von wp_xyz »

Adromir hat geschrieben: mir ist Aufgefallen, daß das LIstView unter windows leer bleibt, bis alles einträge geladen sind. Unter Linux werden die Items direkt gezeichnet, was mir besser gefällt. Kriegt man das hin, daß sich das bei Windows genau so verhält?

Sorry, versteh' ich nicht... Wie werden die Einträge "geladen"? Dauert das etwa lang und du willst sehen, wie sich die ListView füllt? Davon würde ich dringend abraten, weil dann nach jedem geladenen Eintrag ein Neuzeichnen erfolgen müsste, was die in diesem Fall ja ohnehin schon lange Ausgabe noch mehr in die Länge zieht. Kannst du ein Demo-Projekt posten, an dem ich sehe, was du genau erreichen willst? (Anhänge funktionieren ja wieder...)

Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Re: TListView und die ausgewählten Reihen...

Beitrag von Adromir »

Okay, das hab ich nun hinbekommen, daß die Items direkt beim Hinzufügen unter Windows angezeigt werden.. Nun hab ich aber das nächste Problem.. Befülle ich die TListView unter Windows neu (mit komplett anderen Werten) dann kommt es zu einem Index out of Bonds Fehler.. "aktualisiere" ich sie mit den gleichen Werten dann kommt der Fehler nicht.. Auch wenn er den Fehler vorhaer auch angezeigt hat..

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: TListView und die ausgewählten Reihen...

Beitrag von wp_xyz »

Zu einem "Index out of bounds" Fehler kommt es, wenn du auf ein Array (o.ä.)-Element außerhalb des erlaubten Bereichs zugreifst. Wenn deine ListView z.B. 3 Items enthält, dann kannst du auf die Items [0], [1] und [2] zugreifen, nicht aber auf [3], denn das wäre das 4. Element, die Liste enthält aber nur 3.

Weiter kann ich ohne kostenpflichten Gebrauch meiner Kristallkugel nicht helfen.

Adromir
Beiträge: 37
Registriert: Sa 28. Apr 2018, 04:09

Re: TListView und die ausgewählten Reihen...

Beitrag von Adromir »

Hab gerade gesehen, daß es doch irgendwo anders hängt. Ein RegEx scheint unter manchen bedingungen nicht das richtige ergebnis zu liefern. Der Indexfehler ist nicht in der Liste, sondern in einer Funktion die mir bestimmte werte per Regex als StringList zurück liefert..

Antworten