Rubrik: Variablen/Strings · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 13.11.06 |
Fehler 6 bei Wertzuweisungen? Dieser Tipp zeigt, wie man den Fehler 6 (Überlauf) bei einer Wertzuweisung umgehen kann. | ||
Autor: Dieter Otter | Bewertung: | Views: 9.995 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Vor kurzem ist es mir passiert, dass ich bei einer Wertzuweisung an einen Long-Datentyp den "Fehler 6 - Überlauf" bekam, obwohl der Wert noch lange nicht die Grenzen des Long-Datentyps sprengen würde.
Konkret sollte der User eine Zeit einstellen können, nach der Nachrichten im E-Mail Programm autom. als gelesen gekennzeichnet werden sollen. Die Zeitspanne kann der User im Bereich zwischen 0 und 60 Sekunden festlegen. Für das autom. Kennzeichnen der Nachricht mit dem Status "Gelesen" wird ein Timer eingesetzt. Der vom User festgelegte Wert muss für das korrekte Arbeiten des Timers mit dem Faktor 1000 multipliziert werden, da das Timer-Control die Interval-Eigenschaft in Millisekunden erwartet.
Der verwendete Code sah wie folgt aus:
Option Explicit Dim nTimeAutoRead As Integer ... ' vom User festgelegte Zeit aus INI-Datei auslesen nTimeAutoRead = GetIniInt("eMail", "Vorschauzeit", "10", sIniFile) ... ' Timer-Interval einstellen (Zeit in Millisekunden!) Timer1.Interval = nTimeAutoRead * 1000
Das ganze funktionierte prima, bis ein User auf die Idee kam, die Zeit auf 60 Sekunden festzulegen. Normalerweise ja kein Problem, da die Interval-Eigenschaft des Timers Werte bis 65535 aufnehmen kann und die eingestellte Zeit von 60 Sekunden ja mit 60000 Millisekunden noch unter dem max. zulässigen Wert von 65535 liegt.
Nur was geschah?
Folgende Codezeile wurde von VB mit dem "Fehler 6 - Überlauf" quittiert!
Timer1.Interval = nTimeAutoRead * 1000
Nur warum?
Der Grund liegt am gewählten Datentyp von nTimeAutoRead! Die Variable wurde als Integer deklariert. Bei der Zuweisung der Multiplikation nTimeAutoRead * 1000 wurde somit der
Wertebereich der Integer-Variable überschritten, obwohl die Variable das Ergebnis ja gar nicht aufnehmen, sondern vielmehr der Interval-Eigenschaft des Timers zugewiesen werden sollte.
VB verarbeitet hier aber scheinbar die Multiplikation als INTEGER-Multiplikation, die somit ab dem Wert 33 (33 * 1000 = 33000) zu dem Überlauf führt.
Abhilfe schafft hier nur das explizite Umwandeln der Integer-Variable in den Long-Datentyp, wie nachfolgend gezeigt:
Timer1.Interval = CLng(nTimeAutoRead) * 1000
Alternativ kann man die Variable nTimeAutoRead auch gleich als LONG deklarieren statt INTEGER.