vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Variablen/Strings · Sonstiges   |   VB-Versionen: VB4, VB5, VB613.11.06
Fehler 6 bei Wertzuweisungen?

Dieser Tipp zeigt, wie man den Fehler 6 (Überlauf) bei einer Wertzuweisung umgehen kann.

Autor:   Dieter OtterBewertung:  Views:  9.995 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11kein 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.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.