Autor Beitrag
AScomp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 28.04.11 12:35 
Hallo,

momentan habe ich ein äußerst seltsames Problem. Und zwar prüft mein Programm über einen TTimer einmal pro Minute, ob das SubItem eines Listview gleich der aktuellen Uhrzeit ist. Wenn ja, passiert irgendwas und wenn nicht, geht's ohne Änderungen weiter und nach einer Minute wird erneut geprüft. Das Programm läuft immer minimiert, quasi unsichtbar. Lediglich ein TrayIcon ist sichtbar, über das man die Oberfläche anzeigen kann.

Unsichtbar wird es sofort beim Start gemacht, ShowMainForm ist false. Zudem wird FormMain.Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0) aufgerufen. Wenn man das TrayIcon anklickt, wird die MainForm angezeigt: FormMain.Show;

Mit Delphi 2009 kompiliert funktionierte das immer einwandfrei. Jetzt habe ich dasselbe Programm in Delphi XE kompiliert und es gibt folg. Problem: Anscheinend prüft der Timer nicht mehr einmal pro Minute oder aber führt die Aktionen nicht aus, die zur jeweiligen Uhrzeit gestartet werden sollen (z.B. wird etwas in eine Logdatei geschrieben). Sobald man das Fenster anzeigt (durch Anklicken des TrayIcon), funktioniert wieder alles und der Timer prüft korrekt und alle Aktionen werden korrekt ausgeführt.

Probleme bei der Zeitkonvertierung bzw. beim Zeitformat kann ich ausschließen. Ich vermute eher, dass neuerdings bei minimierten Fenstern irgendetwas anders abgearbeitet wird als bisher/als bei sichtbaren Fenstern.

Von anderen Objekten kenn ich das z.B., dass im unsichtbaren Zustand die Properties falsche Werte zurückliefern, weil diese erst aktualisiert werden, wenn sie neu gezeichnet werden. Das Listview war davon bisher aber nie betroffen.

Vielleicht hat ja jemand eine Idee...

Danke schonmal!

Viele Grüße

Andy
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.04.11 13:05 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Und zwar prüft mein Programm über einen TTimer einmal pro Minute, ob das SubItem eines Listview gleich der aktuellen Uhrzeit ist.
Mach das ganze halt einfach sauber...
Die ListView ist wie alle visuellen Komponenten eben nur zur Anzeige der Daten da. Und dementsprechend ist das auch umgesetzt. Wenn gewisse von Windows verwaltete Controls noch nie sichtbar waren oder wieder unsichtbar sind, gibt es da komische Ergebnisse.

Das gilt auch für die ListView. Das weiß ich aus eigener Erfahrung... denn vor einigen Jahren als ich anfing programmieren zu lernen habe ich den Blödsinn mit der Datenspeicherung in visuellen Controls ja auch mal gemacht. :oops:

Deshalb trenne deine Daten von der visuellen Darstellung und damit hat sich die Sache...
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 28.04.11 13:40 
Problem gelöst. Danke dir!

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Doch nicht. ;)

Ich speichere jetzt die Daten in einer Datei ab und lese sie von dort wieder ein. Wenn das Fenster aber minimiert/nicht sichtbar ist, gibt mir ListView.Items.Count = 0 zurück. Ich muss aber jetzt ja das SubItem des jeweiligen Items korrigieren, das muss seine neue Uhrzeit bekommen.

Wenn ich versuche, direkt auf das Item zuzugreifen (Index vorher gespeichert), dann gibt's eine EAccessViolation, weil er das Item ja angeblich nicht kennt.

Gibt es irgendeine Möglichkeit, das ListView zu aktualisieren? Refresh hab ich schon erfolglos probiert. Das einzige, was das ListView korrekt aktualisiert, ist das jeweilige Form sichtbar und wieder unsichtbar zu machen. Aber DAS ist wirklich unsauber.