ListView OnChange absturz

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

ListView OnChange absturz

Beitragvon Aphadias » 5. Sep 2017, 17:41 ListView OnChange absturz

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.
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon wp_xyz » 5. Sep 2017, 18:14 Re: ListView OnChange absturz

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2186
Registriert: 8. Apr 2011, 08:01

Beitragvon Aphadias » 5. Sep 2017, 19:23 Re: ListView OnChange absturz

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?
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon braunbär » 5. Sep 2017, 20:07 Re: ListView OnChange absturz

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?
braunbär
 
Beiträge: 162
Registriert: 8. Jun 2017, 17:21

Beitragvon wp_xyz » 5. Sep 2017, 20:07 Re: ListView OnChange absturz

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.
wp_xyz
 
Beiträge: 2186
Registriert: 8. Apr 2011, 08:01

Beitragvon Aphadias » 6. Sep 2017, 14:39 Re: ListView OnChange absturz

@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...
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon braunbär » 7. Sep 2017, 15:41 Re: ListView OnChange absturz

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
braunbär
 
Beiträge: 162
Registriert: 8. Jun 2017, 17:21

Beitragvon Mathias » 7. Sep 2017, 17:14 Re: ListView OnChange absturz

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3047
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast

porpoises-institution
accuracy-worried