Entwickler-Ecke
Sonstiges (Delphi) - Unterschied Delphi 2009 zu Delphi XE (Timer-Problem o.ä.)?
AScomp - Do 28.04.11 12:35
Titel: Unterschied Delphi 2009 zu Delphi XE (Timer-Problem o.ä.)?
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 - Do 28.04.11 13:05
AScomp hat folgendes geschrieben : |
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 - Do 28.04.11 13:40
Problem gelöst. Danke dir!
---
Moderiert von
Narses: 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!