AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Adressen von ListItems ändern sich

Ein Thema von Wormid · begonnen am 4. Dez 2014 · letzter Beitrag vom 5. Dez 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#1

Adressen von ListItems ändern sich

  Alt 4. Dez 2014, 14:31
Delphi-Version: XE6
Hallo liebe DPler,

vielleicht hat jemand von Euch eine Idee zu folgendem Problem:

Ein Kollege hat in vielen seiner Programme Konstrukte drin, das Objekte an ListItems "hängen" und das im Gegenzug das Objekt das ListItem kennt.
Wird das ListView aktualisiert, kennt es das Objekt und holt sich von dort die Daten zum Visualisieren... Ändert sich am Zustand des Objektes etwas,
kann das Objekt direkt das ListItem aktualisieren, da es das ja kennt. (Saubere Trennung sieht anders aus, ich weiß - die Programme sind halt schon ein paar Jahre alt...)

Die ListViews sind was die Anzahl und Reihenfolge der Items angeht in der Regel bis auf den Programmstart eher statisch - also keine Sortierfunktionen, etc.

Zur "Illustration"...

Delphi-Quellcode:
type
   TMyObject = class(TObject)
   private
      fListItem: TListItem;
    procedure SomeProc;
   public
      constructor Create(AListItem: TListItem);
      property ListItem: TListItem read fListItem;
   end;
   
implementation

constructor TMyObject.Create(AListItem: TListItem);
begin
   fListItem := AListItem;
   ...
end;

procedure TMyObject.SomeProc;
begin
  ...
  fListItem.SubItems[3] := 'FooBar';
  ...
end;

procedure TSomeControllerObject.FooBar;
var
   li: TListItem;
begin
   li := lvSomeListView.Items.Add;
   li.Data := TMyObject.Create(li);
   ...
end;
Vielleicht nicht sehr schön... Allerdings hat das jahrelang einwandfrei funktioniert, solange die Programme mit Delphi 2006 kompiliert waren...

Nun das eigentliche Problem:

Er hat umgestellt auf XE6 und seitdem passiert es aus bisher nicht nachvollziehbaren Gründen, das unter der Adresse, auf die fListItem
zeigt, entweder nichts mehr (dann knallt es), oder ein anderes ListItem (dann wird die falsche Zeile aktualisiert) zu finden ist.

Wir sind nun schon ein bisschen länger auf der Suche nach der Ursache und haben nun festgestellt, dass sich im Laufe der Zeit (bisher
kein Muster erkennbar), die tatsächliche Adresse des ListItems ändert - aber nicht in seinen Objekten, sondern im ListView!

Ist das Normal? Vorher konnten die Programme Wochenlang durchlaufen, ohne das solche Probleme auftraten - war das nur Zufall?

Der Fehler ist auf dem Entwicklungsrechner vom Kollegen bisher leider nicht nachvollziehbar, wie immer passiert so etwas natürlich nur
sporadisch beim Kunden, was es umso schwieriger macht, das Problem zu lokalisieren.

Hat irgendjemand eine Idee? Wir sind mit unserem Pascal am Ende?

Gruß

Wormid
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Adressen von ListItems ändern sich

  Alt 4. Dez 2014, 17:13
Ich habe kein XE6. Irgendeine theoretische Erklärung könnte ich mir auch nicht aus den Fingern saugen.

Das passiert nur sporadisch und nur auf dem Kundenrechner?
Habt Ihr mal externe Probleme ausgeschlossen (Hauptspeicher und Betriebssystem)?


PS: Die LiveBindings könnte ich mir notfalls noch als Grund vorstellen, aber die verwendet Ihr ja offenbar nicht.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.990 Beiträge
 
Delphi 12 Athens
 
#3

AW: Adressen von ListItems ändern sich

  Alt 4. Dez 2014, 17:57
Steht OwnerData auf true? In dem Fall sollte ein Blick in die Methode TCustomListView.GetItem genügen, um zu verstehen, daß man besser keine Pointer auf TListItems speichert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Adressen von ListItems ändern sich

  Alt 4. Dez 2014, 18:01
Welche Delphi Version war es, als es noch lief? Wenn es älter als 2009 ist, wäre ein (zugegebenermaßen sehr abstruser) Gedanke: Werden die Adressen irgendwo vielleicht mal als Strings oder PChars angesprochen? Ich wüsste keinen tollen Grund, dies je zu tun - maximal bei Kommunikation mit DLLs mit fragwürdiger API - aber man darf ja nix ausschließen. Wenn das wirklich so sein sollte, könnte die Umstellung auf Unicode eine Rolle spielen. Das ist jetzt echt sehr weit her geholt, aber das würde mir so als erste sehr grundlegende Änderung mit "Überraschungseffekt" in den letzten Jahren einfallen. (Und erklären, warum das auf euren Rechnern nicht passiert, tut es auch nicht so richtig. Aber wer weiss.)


Edit: Uwes Idee klingt besser!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Adressen von ListItems ändern sich

  Alt 5. Dez 2014, 06:50
-Zu früh-

Geändert von Dejan Vu ( 5. Dez 2014 um 06:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Adressen von ListItems ändern sich

  Alt 5. Dez 2014, 07:40
Das passiert nur sporadisch und nur auf dem Kundenrechner?
Habt Ihr mal externe Probleme ausgeschlossen (Hauptspeicher und Betriebssystem)?
Ja leider, das passiert nur sporadisch. (Sporadisch = Nach einigen Stunden bis Tagen, ohne bisher erkennbares Muster).
Den Kundenrechner haben wir noch nicht ausgeschlossen - das werden wir aber baldmöglichst nachholen.
(RAM testen, ggfls. ganze Maschine tauschen). Allerdings verspreche ich mir da nicht sehr viel von, der Rechner ist der Gleiche wie vor dem "Update" - und da lief es (mit der alten Version) Problemlos.

Steht OwnerData auf true? In dem Fall sollte ein Blick in die Methode TCustomListView.GetItem genügen, um zu verstehen, daß man besser keine Pointer auf TListItems speichert.
Sehr guter Hinweise, aber OwnerData ist überall auf false.

Welche Delphi Version war es, als es noch lief?
...
Werden die Adressen irgendwo vielleicht mal als Strings oder PChars angesprochen?
Vorher war es Delphi 2006.
Die üblichen Unicode-Problemchen hatte er bei der Umstellung auch, allerdings werden keine Adressen zu Strings konvertiert oder ähnliches.


Danke für die bisherigen Anregungen - bin jedoch noch offen für andere Ideen.
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
jsp

Registriert seit: 9. Aug 2003
50 Beiträge
 
#7

AW: Adressen von ListItems ändern sich

  Alt 5. Dez 2014, 08:52
Hallo Wormid,

in solchen 'ab und zu' Fällen habe ich gute Erfahrungen mit
http://www.eurekalog.com/ gemacht.

Jörn
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Adressen von ListItems ändern sich

  Alt 5. Dez 2014, 08:58
Moin Wormid,

seid ihr sicher, dass es an der Delphi-Version und nicht an der Betriebssystemversion liegt?
Immerhin wird ein ListView ja vom jeweiligen Betriebssystem zur Verfügung gestellt und ist keine generische VCL-Komponente.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Wormid
Wormid

Registriert seit: 26. Aug 2003
Ort: Steinfurt
292 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Adressen von ListItems ändern sich

  Alt 5. Dez 2014, 09:19
...seid ihr sicher, dass es an der Delphi-Version und nicht an der Betriebssystemversion liegt?
Die "alte" Version lief ja vorher auch auf dem gleichen Rechner beim Kunden. (*hust* War XP, ist XP).

...in solchen 'ab und zu' Fällen habe ich gute Erfahrungen mit
http://www.eurekalog.com/ gemacht.
Der Kollege vermeidet Exceptions mittlerweile, indem er die ListItems nicht mehr über die gespeicherte Referenz anspricht, sondern indem er sie jedesmal im ListView sucht, wenn er die Anzeige aktualisieren will.
Das brachte schon einiges an Verbesserung, leider aber noch nicht vollends. Und vor allem bleibt die Frage ("das Geschmäckle"), warum es auf einmal halt nicht mehr geht...
Debuggers don't remove Bugs, they only show them in Slow-Motion.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Adressen von ListItems ändern sich

  Alt 5. Dez 2014, 09:27
Also ich bin mir ziemlich sicher, das hier ein overrun-Problem besteht, d.h. es wird irgendwann irgendwo etwas überschrieben. Das íst vielleicht beim alten Delphi nicht aufgefallen, weil der Memory-Manager anders funktioniert hat, aber jetzt vielleicht.

Verwende vielleicht auch mal FastMM im FullDebugMode, schalte RangeCheck an, Overflowchecks auch usw. Du kannst ach Sentinel-Variablen einführen, oder die Referenz an anderer Stelle nochmals sichern und dann prüfen, ob die Referenzen noch identisch sind (Aber auch nur, wenn die vorherigen Maßnahmen nichts bringen)

Die ListViewItems werden vom Delphi-Control verwaltet. Über 'Items.Add' wird einfach nur ein neues TListItem instantiiert´. Das von Uwe beschriebene 'OwnerDraw'-"Problem" ist nur in "GetItem(Item : TLVItem)" vorhanden, und ob da ein Problem draus wird, würde ich bezweifeln. Denn dieses 'GetItem' hat mit dem Getter von 'Items[Index]' nichts zu tun, denn 'Items' ist eine Liste mit eigenem Getter und liefert einfach das Element an der Stelle zurück (soweit ich mich erinnere). Da auch die Liste an sich nicht verändert wird, sollte es daran eigentlich nicht liegen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:02 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