Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Wert im Stringgrid verschwindet


Peter18 - Fr 05.05.23 12:31
Titel: Wert im Stringgrid verschwindet
Ein freundliches Hallo an alle,

ich habe einen Effekt, den ich bisher nicht erklären kann. Vielleicht hat jemand schon herausgefunden, was da geschieht und kann es erklären.

Da es um einige hundert Programmzeilen geht, beschreibe ich den Effekt, statt den Code zu zeigen. Ich verwende ein Stringgrid, um Daten für eine Anzeige aus einer Datei zu laden. Wenn ich nun einen Link der einer Taste zugeordnet ist anlegen will, wird ein Fenster geöffnet, mit dem die Daten bearbeitet werden können. Die Daten werden dann vom Fenster abgeholt und in eine Stringliste nach dem Schema "Wert=Datum" eingetragen. Diese Stringliste wird dann als Commatext in die Zelle geschrieben. Damit der gesamte Datensatz und nicht jeder Wert einzeln in die Datei geschrieben wird, erfolgt das Speichern auf "Knopfdruck". Doch da zeigt sich folgender Effekt: Beim Speichern im Stringgrid sehe ich die Daten im Grid, aber beim Speichern der Datenzeile ist die Zelle leer.

Das Grid und die Routinen sind Teil des Objekts. Wenn ich mir die Adresse des Grids beim Speichern im Grid und beim Speichern in der Datei hole (Addr(X)), ist diese identisch, aber nicht der Inhalt. Ausschalten der Optimierung vor und wieder Einschalten nach den Routinen ergab keine Änderung.

Hat jemand eine Idee, was hinter diesem Effekt steckt??

Grüße von der wolkigen Nordsee

Peter

Moderiert von user profile iconTh69: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 05.05.2023 um 15:08


Th69 - Fr 05.05.23 15:25

Wie genau speicherst du denn die Grid-Daten? Evtl. würden ein paar Screenshots (während dem Debuggen) helfen?!


Peter18 - Fr 05.05.23 16:43

Hallo Th69,

Dank Dir für Deine Antwort! Leider helfen Screenshots nichts. Die Zelle wird auf Link geprüft und der Inhalt gegebenenfalls für den Dateityp aufgearbeitet, deshalb "Wert=Datum". Wenn ich bei der Linkprüfung den Zelleninhalt mit "Auswerten/Ändern" ansehe, ist der leer!

Grüße von der immer noch wolkigen Nordsee

Peter


Th69 - Fr 05.05.23 17:35

Verwendest du beim StringGrid Ereignisse o.ä., welche dann die Zelle wieder löscht?

Und ist denn der Zellenwert direkt nach dem Setzen des Zellenwerts programmtechnisch derselbe?


jaenicke - Fr 05.05.23 20:14

Füg doch StringGridX.Cells[00], natürlich mit den von dir gewünschten Koordinaten, einfach der Liste der überwachten Ausdrücke hinzu. Dann musst du nach dem Schreiben in die Zelle dort ja deinen Wert sehen. Und wenn du auf Speichern gehst, siehst du dann, ob sich in der Zwischenzeit etwas geändert hat.

Du kannst dann auch einen Haltepunkt auf TStringGrid.SetCells setzen, so dass du bei Änderungen dort ankommst und siehst woher eine Änderung kommt.

Klar ist jedenfalls, dass aus einem TStringGrid nicht einfach etwas verschwindet. Ohne Quelltext lässt sich daher dazu auch nicht viel sagen. Irgendwo muss in deinem Code die Erklärung zu finden sein. Du kannst mir den Code auch per PN schicken, am besten ein wenig um für den Fall unwichtige Teile gekürzt, dann schaue ich gerne einmal rein.


Peter18 - Sa 06.05.23 13:40

Hallo Th69, hallo jaenicke,

Dank euch für Eure Antwort! Der Fehler ist gefunden!

In einer Konfigurationsdatei waren zwei Anzeigeelemente auf den gleichen Spaltenindex gesetzt. Da das leere Element zuerst bearbeitet wurde ist der Inhalt gelöscht worden.

jaenicke, die Liste der überwachten Ausdrücke war der entscheidende Tipp. Ich hatte schon nach so etwas gesucht, es aber übersehen. Daher dachte ich das hätte ich von VBA in Erinnerung.

Grüße von der wieder wolkigen Nordsee

Peter