![]() |
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:
Vielleicht nicht sehr schön... Allerdings hat das jahrelang einwandfrei funktioniert, solange die Programme mit Delphi 2006 kompiliert waren...
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; 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 |
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. |
AW: Adressen von ListItems ändern sich
Steht OwnerData auf true? In dem Fall sollte ein Blick in die Methode
Delphi-Quellcode:
genügen, um zu verstehen, daß man besser keine Pointer auf TListItems speichert.
TCustomListView.GetItem
|
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 |
AW: Adressen von ListItems ändern sich
-Zu früh-
|
AW: Adressen von ListItems ändern sich
Zitat:
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:
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. ;-) |
AW: Adressen von ListItems ändern sich
Hallo Wormid,
in solchen 'ab und zu' Fällen habe ich gute Erfahrungen mit ![]() Jörn |
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. |
AW: Adressen von ListItems ändern sich
Zitat:
Zitat:
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... |
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:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz