vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
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:     [ Jetzt bewerten ]Views:  9.986 
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.

Dieser Tipp wurde bereits 9.986 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel