ListView OnChange absturz

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

ListView OnChange absturz

Beitrag von Aphadias »

Moin ich mal wieder :roll:

wie ihr seht trainiere ich immer noch mit meiner ListView. Dieses mal folgendes Problem.

Ich wollte im OnChange process eine FOR Schleife unterbringen die die Aufgabe hat auszuzählen wie oft ein bestimmtes Wort in der ListView vor kommt und zwar immer sobald etwas sich in der ListView ändert.
Soweit so gut. Alles klappt so lange ich einen Eintrag dazu füge, weil dann stürzt das System richtig kräftig mit anlauf ab! Sobald ich was lösche ist das kein Problem und das macht mich stuzig!

Code: Alles auswählen

for i:=0 to ListView1.Items.Count -1 do


Wenn ich etwas dazu füge kann doch OnChange erst ausgelößt werden wenn etwas zugefügt wurde oder nicht? Weil erst dann ändert sich ja was wo er auslösen soll... vor allem warum meckert er nicht beim Löschen?!

Zweite Problem: Wenn das Programm startet wird ja im OnCreate die Lsitview schon im Hintergrund beschrieben und sobald ich die Aufrufe wurde aber noch nicht durch gezählt sondern erst durch ein Klick in die ListView bzw wenn ich irgend was mit der mache.

Ziel ist es das Permanent wenn etwas mit der ListView geschieht immer live die Auszählung statt findet.

p.s. ich habe es auch schon mit OnInsert probiert was den gleichen Fehler brachte.

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

Re: ListView OnChange absturz

Beitrag von wp_xyz »

Bei OnChange würde ich mich auf keine Logik verlassen, das ist manchmal so, manchmal anders...

Das beigefügte Programm schreibt bei TListview.Onchange und .OnInsert eine entsprechende Nachricht in ein Memo. Du siehst nach dem Programmstart, wo im OnCreate zwei ListItems erzeugt werden, zwei OnChange-Meldungen; die Zahl der ListItems wird sauber hochgezählt. Ein Klick auf den Button fügt einen neuen Item hinzu, es kommen dreimal OnChange-Ereignsse vor dem OnInsert, sowie einmal nach dem Insert. Die Zahl der ListItems stimmt aber schon nach dem allerersten OnChange.

Ich würde daraus schließen, dass dein Programm sich nicht ins OnChange Ereignis einhängen sollte, sondern ins OnInsert (und entsprechend ins OnDeletion), wenn du nicht unnütze Arbeit erledigen willst.

Deine Abstürze hängen mit großer Wahrscheinlichkeit nicht mit dem ListView zusammen, sondern mit deinem Code. Leider ist dein Code-Auszug so wie die Cliff-Hanger am Ende einer Fernsehserie: Da wo's spannend wird, hört es auf.
Dateianhänge
listview_onInsert.zip
(2.07 KiB) 65-mal heruntergeladen

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: ListView OnChange absturz

Beitrag von Aphadias »

wp_xyz hat geschrieben:Deine Abstürze hängen mit großer Wahrscheinlichkeit nicht mit dem ListView zusammen, sondern mit deinem Code. Leider ist dein Code-Auszug so wie die Cliff-Hanger am Ende einer Fernsehserie: Da wo's spannend wird, hört es auf.


das Argument war so toll das ich doch glatt mal meins hier niederschreiben muss weil ich nicht wie Cliff-Hanger enden will :lol:

Code: Alles auswählen

procedure TFbdv.ListView1Change(Sender: TObject; Item: TListItem;
  Change: TItemChange);
var
  GW,PZ:Double;
  i:Integer;
begin
  GW:=Listview1.Items.Count;
  PZ:=0;
  for i:=0 to Listview1.Items.Count -1 do
  begin
      if Listview1.Items[i].SubItems.Strings[3] = 'BDV A' then
      begin
        PZ:=PZ+1;
      end;
  end;
  Label12.Caption:=floattostr(PZ);
  //Rechnung
  Label7.Caption:=inttostr(Round(PZ*100/GW));
 
end;


Als Fehlerbericht geht ein kleines Fenster mit einer ListView auf wo nur komische Zahlen drinne stehen... hilft das jetzt ein bisschen mehr?

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: ListView OnChange absturz

Beitrag von braunbär »

Was ich nicht verstehe: Es sollte doch kein Problem sein, einen Haltepunkt zu setzen und die Schleife einmal im Single-Step Modus im Debugger zu durchlaufen, dann siehst du doch genau, wo es kracht. So komplex ist der Code doch nicht?

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

Re: ListView OnChange absturz

Beitrag von wp_xyz »

Ich könnte mir vorstellen, dass das OnChange-Event zuerst kommt, wenn der neue ListItem eingefügt ist, wo es die diverse SubItems noch gar nicht gibt; mit jedem neuen Subitem kommt dann wieder ein OnChange. Konkret, ich würde mich nicht darauf verlassen, dass es SubItems[3] immer gibt, und daher vor dem Zugriff abfragen, ob SubItems.Count > 3 ist, oder wahrscheinlich besser, das OnChange Event gleich wieder verlassen, wenn die Items noch nicht ausreichend viele SubItems haben, dann dann ist das Event zu einem zu frühen Stadium erzeugt worden.

Ich könnte mir auch vorstellen, dass OnInsert hier nicht viel hilft, da es wahrscheinlich, wie der Name sagt, aufgerufen wird, wenn der neue Item eingefügt wird, aber noch keine Subitems hat.

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: ListView OnChange absturz

Beitrag von Aphadias »

@braunbär einmal auf deutsch bitte? und ja so komplex ist es nicht

@wp_xyz das mit dem OnChange dachte ich mir auch schon das der evtl zu früh betätigt wird... OnInsert macht die gleichen Probleme...

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: ListView OnChange absturz

Beitrag von braunbär »

Jeder, der mit einem modernen Programmieroberfläche arbeitet, sollte sich als erstes mit den Möglichkeiten des Debuggers beschäftigen, dann versteht er viel besser, was sein Code tatsächlich macht.

Mit einem Klick links neben einer Zeilennummer (roter Pfeil) setzst du einen "Haltepunkt". Du kannst auch mehrere Haltepunkte setzen.
Wenn du anschließend das Programm startest (blauer Pfeil), dann bleibt es stehen, wenn es einen Haltepunkt erreicht.
Dann kannst du das Programm Befehl für Befehl weitermachen lassen (grüner Pfeil, der linke Button geht direkt zum nächsten Befehl der aktuellen Prozedur, der rechte Button bleibt schon beim ersten Befehl einer aufgerufenen Prozedur stehen, wenn der aktuelle Befehl einen Prozedur- oder Fuktionsaufruf beinhaltet) und dir gleichzeitig in der "Liste der überwachten Ausdrücke" den Wert von Variablen und Ausdrücken anzeigen lassen, die dich interessieren. Mit dem Button, mit dem du das Programm gestartet hast (blauer Pfeil), lässt du das Programm weiterlaufen, bis es wieder einen Haltepunkt erreicht.
So siehst du in den meisten Fällen ohne Problem, wo und warum dein Programm aus dem Ruder läuft.
Und wenn dir ein Programmverhalten einmal trotzdem rätselhaft ist, dann kannst du hier immerhin schon wichtige Details zu diesem Programmverhalten posten, an Hand derer man dir wahrscheinlich auch besser helfen können wird.
Dateianhänge
debugger.PNG

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: ListView OnChange absturz

Beitrag von Mathias »

Diese Zeile sieht mir verdächtig aus.

Code: Alles auswählen

if Listview1.Items[i].SubItems.Strings[3] = 'BDV A' then

Evtl. ensteht bei Strings[3] ein Überlauf.
Versuche mal dies Zeile auszuklammern.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten