Eingaben in Basic-Dialogen überprüfen
Verfasst: Fr, 22.06.2007 11:41
Mir geht es darum, Eingaben, die der Benutzer in Eingabefeldern gemacht hat, zu überprüfen, gegebenenfalls zu korrigieren oder den Benutzer zur Korrektur aufzufordern. Prinzipiell bin ich dabei (auch in anderen Programmiersprachen) so vorgegangen: an das Ereignis lostFocus (oder wie auch immer das jeweils heißt), wird eine Prozedur angebunden, die die Eingabe überprüft. Gegebenenfalls wird eine Fehlermeldung ausgegeben und der Focus auf Eingabefeld zurück gesetzt, in dem die fehlerhafte Eingabe gemacht wurde.
Das hat bislang eigentlich auch bei OOO-Basic funktioniert. Im Rahmen der Entwicklung einer umfangreicheren Anwendung hatte ich jetzt aber einen Dialog, in dem einige Eingabefelder auf diese Weise überprüft werden mußten. Das Austesten führte dann dazu, daß sich OpenOffice (incl. Schnellstarter) sang- und klanglos verabschiedete, so daß ich beim ersten Mal auch einiges an neuem Code verloren habe.
Nach einigem Probieren und Überlegen, habe ich - so denke ich jedenfalls - das Problem isoliert und eine wenig komfortable Lösung gefunden. Folgendes scheint zu passieren: ich schließe die Eingabe in einem Eingabefeld (Feld1) ab, welches dadurch den Focus verliert. Deshalb wird checkFeld1() aufgerufen. Weil die Eingabe fehlerhaft ist, wird durch die Prozedur der Focus wird auf Feld1 zurück gesetzt. Zwischenzeitlich war der Focus aber schon auf Feld2, welches nun durch das Setzen des Focus auf Feld1 den Focus verliert, wodurch nun die Prozedur checkFeld2() ausgelöst wird. Dies führt dazu, daß nun in einer Endlosschleife der Focus zwischen den beiden Feldern hin und her gesetzt wird, womöglich sogar, bevor die Prozeduren jeweils beendet werden, und OOO schließlich abstürzt. Sinnvoll wäre natürlich, wenn der Focus erst dann auf ein anderes Feld gesetzt wird, wenn das Ereignis lostFocus abgearbeitet wurde.
Gelöst habe ich dies dadurch, daß ich in jeder der check-Prozeduren als erstes ein globales Flag setze, bzw. die Prozedur sofort beende, wenn das Flag bereits gesetzt ist. An Ende der Prozedur wird das Flag natürlich wieder gelöscht.
Ist dieses Verhalten bekannt oder sogar erwünscht? Hat jemand eine elegantere Lösung des Problems gefunden?
Das hat bislang eigentlich auch bei OOO-Basic funktioniert. Im Rahmen der Entwicklung einer umfangreicheren Anwendung hatte ich jetzt aber einen Dialog, in dem einige Eingabefelder auf diese Weise überprüft werden mußten. Das Austesten führte dann dazu, daß sich OpenOffice (incl. Schnellstarter) sang- und klanglos verabschiedete, so daß ich beim ersten Mal auch einiges an neuem Code verloren habe.
Nach einigem Probieren und Überlegen, habe ich - so denke ich jedenfalls - das Problem isoliert und eine wenig komfortable Lösung gefunden. Folgendes scheint zu passieren: ich schließe die Eingabe in einem Eingabefeld (Feld1) ab, welches dadurch den Focus verliert. Deshalb wird checkFeld1() aufgerufen. Weil die Eingabe fehlerhaft ist, wird durch die Prozedur der Focus wird auf Feld1 zurück gesetzt. Zwischenzeitlich war der Focus aber schon auf Feld2, welches nun durch das Setzen des Focus auf Feld1 den Focus verliert, wodurch nun die Prozedur checkFeld2() ausgelöst wird. Dies führt dazu, daß nun in einer Endlosschleife der Focus zwischen den beiden Feldern hin und her gesetzt wird, womöglich sogar, bevor die Prozeduren jeweils beendet werden, und OOO schließlich abstürzt. Sinnvoll wäre natürlich, wenn der Focus erst dann auf ein anderes Feld gesetzt wird, wenn das Ereignis lostFocus abgearbeitet wurde.
Gelöst habe ich dies dadurch, daß ich in jeder der check-Prozeduren als erstes ein globales Flag setze, bzw. die Prozedur sofort beende, wenn das Flag bereits gesetzt ist. An Ende der Prozedur wird das Flag natürlich wieder gelöscht.
Ist dieses Verhalten bekannt oder sogar erwünscht? Hat jemand eine elegantere Lösung des Problems gefunden?