Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Adressen von ListItems ändern sich (https://www.delphipraxis.net/183019-adressen-von-listitems-aendern-sich.html)

Wormid 4. Dez 2014 14:31

Delphi-Version: XE6

Adressen von ListItems ändern sich
 
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

stahli 4. Dez 2014 17:13

AW: Adressen von ListItems ändern sich
 
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.

Uwe Raabe 4. Dez 2014 17:57

AW: Adressen von ListItems ändern sich
 
Steht OwnerData auf true? In dem Fall sollte ein Blick in die Methode
Delphi-Quellcode:
TCustomListView.GetItem
genügen, um zu verstehen, daß man besser keine Pointer auf TListItems speichert.

Medium 4. Dez 2014 18:01

AW: Adressen von ListItems ändern sich
 
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! :D

Dejan Vu 5. Dez 2014 06:50

AW: Adressen von ListItems ändern sich
 
-Zu früh-

Wormid 5. Dez 2014 07:40

AW: Adressen von ListItems ändern sich
 
Zitat:

Zitat von stahli (Beitrag 1282260)
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.

Zitat:

Zitat von Uwe Raabe (Beitrag 1282265)
Steht OwnerData auf true? In dem Fall sollte ein Blick in die Methode
Delphi-Quellcode:
TCustomListView.GetItem
genügen, um zu verstehen, daß man besser keine Pointer auf TListItems speichert.

Sehr guter Hinweise, aber OwnerData ist überall auf false.

Zitat:

Zitat von Medium (Beitrag 1282266)
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. ;-)

jsp 5. Dez 2014 08:52

AW: Adressen von ListItems ändern sich
 
Hallo Wormid,

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

Jörn

Christian Seehase 5. Dez 2014 08:58

AW: Adressen von ListItems ändern sich
 
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.

Wormid 5. Dez 2014 09:19

AW: Adressen von ListItems ändern sich
 
Zitat:

Zitat von Christian Seehase (Beitrag 1282318)
...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).

Zitat:

Zitat von jsp (Beitrag 1282316)
...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...

Dejan Vu 5. Dez 2014 09:27

AW: Adressen von ListItems ändern sich
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Seite 1 von 2  1 2      

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