VisualBasic Benutzung der Entertaste

Winter88

Ensign
Registriert
Okt. 2009
Beiträge
222
Hallo,
ich hab folgendes Problem...
ich programmiere gerade einen Rechner für den PC
Diesen bediene ich halt über die Buttons aber auch per Tastatur.
Soooweit funktioniert das auch.
Nur drücke ich die Enter Taste und er soll mir eigentlich das Ergebnis ausrechnen, greift meines Wissens nach die Windows-Programmierung der Enter Taste und er führt den Befehl des markierten Buttons aus, welches er aber nicht tun soll. In meinem Fall Button 2.
Wie unterbinde ich das und er soll bloß alles ausrechnen.

Public Class formRechner
Dim Zahl As String
Dim Zwischenergebnis As String
Dim Zahlenspeicher_1 As String
Dim Zahlenspeicher_2 As String
Dim Zahlenspeicher_3 As String
Private Ziffer As String
Dim Rechenart As String
Dim Rechenart_2 As String
Dim Rechnung As String
Dim neue_Zahl As Boolean
Dim neue_Rechnung As Boolean
Dim PunktvorStrich As Boolean

Private Sub formRechner_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Rechnung = ""
Rechenart = ""
Rechenart_2 = ""
Zahl = ""
Zwischenergebnis = ""
Zahlenspeicher_1 = ""
Zahlenspeicher_2 = ""
Ziffer = ""
neue_Zahl = True
neue_Rechnung = True
PunktvorStrich = False
KeyPreview = True
End Sub

Private Sub SubZiffer(ByVal sender As System.Object, ByVal e As System.EventArgs)
If neue_Zahl = True Then
lblformel.Text = ""
End If
If neue_Rechnung = True Then
Rechenart = ""
End If
If Zahl = "0" Then
lblformel.Text = ""
Zahl = ""
End If
Zahl &= Ziffer
lblformel.Text &= Ziffer
neue_Zahl = False
neue_Rechnung = False
End Sub

Private Sub SubRechnen(ByVal sender As System.Object, ByVal e As System.EventArgs)
Select Case Rechenart
Case ""
Zahlenspeicher_1 = Zahl
Case "plus"
Select Case (PunktvorStrich)
Case False
Select Case (Rechenart_2)
Case ""
If Zahl = "" Then
Zahl = Zahlenspeicher_2
End If
Zahlenspeicher_2 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) + CDbl(Zahlenspeicher_2)
Zahlenspeicher_1 = Rechnung
lblformel.Text = Rechnung
Case "mal"
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) + CDbl(Zahlenspeicher_2) * CDbl(Zahlenspeicher_3)
Zahlenspeicher_1 = Rechnung
lblformel.Text = Rechnung
Case "geteilt"
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) + CDbl(Zahlenspeicher_2) / CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
End Select
Case True
Select Case (Rechenart_2)
Case ""
Zahlenspeicher_2 = Zahl
Case "mal"
If Zahl = "" Then
Zahl = Zahlenspeicher_3
End If
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_2) * CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
Case "geteilt"
If Zahl = "" Then
Zahl = Zahlenspeicher_3
End If
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_2) / CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
End Select
End Select
Case "minus"
Select Case (PunktvorStrich)
Case False
Select Case (Rechenart_2)
Case ""
If Zahl = "" Then
Zahl = Zahlenspeicher_2
End If
Zahlenspeicher_2 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) - CDbl(Zahlenspeicher_2)
Zahlenspeicher_1 = Rechnung
lblformel.Text = Rechnung
Case "mal"
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) - CDbl(Zahlenspeicher_2) * CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
Case "geteilt"
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) - CDbl(Zahlenspeicher_2) / CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
End Select
Case True
Select Case (Rechenart_2)
Case ""
Zahlenspeicher_2 = Zahl
Case "mal"
If Zahl = "" Then
Zahl = Zahlenspeicher_3
End If
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_2) * CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
Case "geteilt"
If Zahl = "" Then
Zahl = Zahlenspeicher_3
End If
Zahlenspeicher_3 = Zahl
Rechnung = CDbl(Zahlenspeicher_2) / CDbl(Zahlenspeicher_3)
Zahlenspeicher_2 = Rechnung
lblformel.Text = Rechnung
End Select
End Select
Case "mal"
If Zahl = "" Then
Zahl = Zahlenspeicher_2
End If
Zahlenspeicher_2 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) * CDbl(Zahlenspeicher_2)
Zahlenspeicher_1 = Rechnung
lblformel.Text = Rechnung
Case "geteilt"
If Zahl = "" Then
Zahl = Zahlenspeicher_2
End If
Zahlenspeicher_2 = Zahl
Rechnung = CDbl(Zahlenspeicher_1) / CDbl(Zahlenspeicher_2)
Zahlenspeicher_1 = Rechnung
lblformel.Text = Rechnung
Case Else
lblformel.Text = "Fehler."
End Select
neue_Zahl = True
Zahl = ""
neue_Rechnung = False
End Sub

Private Sub formRechner_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case (e.KeyCode)
Case Keys.Escape
Me.Close()
Case Keys.Back, Keys.Delete
Call cmdClear_Click(sender, e)
Case Keys.NumPad0, Keys.D0
Call cmdNull_Click(sender, e)
Case Keys.NumPad1, Keys.D1
Call cmdEins_Click(sender, e)
Case Keys.NumPad2, Keys.D2
Call cmdZwei_Click(sender, e)
Case Keys.NumPad3, Keys.D3
Call cmdDrei_Click(sender, e)
Case Keys.NumPad4, Keys.D4
Call cmdVier_Click(sender, e)
Case Keys.NumPad5, Keys.D5
Call cmdFünf_Click(sender, e)
Case Keys.NumPad6, Keys.D6
Call cmdSechs_Click(sender, e)
Case Keys.NumPad7, Keys.D7
Call cmdSieben_Click(sender, e)
Case Keys.NumPad8, Keys.D8
Call cmdAcht_Click(sender, e)
Case Keys.NumPad9, Keys.D9
Call cmdNeun_Click(sender, e)
Case Keys.Add, Keys.Oemplus
Call cmdplus_Click(sender, e)
Case Keys.Subtract, Keys.OemMinus
Call cmdminus_Click(sender, e)
Case Keys.Multiply, Keys.LShiftKey And Keys.Oemplus
Call cmdmal_Click(sender, e)
Case Keys.Divide, Keys.LShiftKey And Keys.D7
Call cmdgeteilt_Click(sender, e)
Case Keys.Return, Keys.Enter
Call cmdIst_Click(sender, e)
End Select
End Sub

Private Sub cmdClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdClear.Click
Rechnung = ""
Rechenart = ""
Rechenart_2 = ""
Zahl = ""
Zwischenergebnis = ""
Zahlenspeicher_1 = ""
Zahlenspeicher_2 = ""
Ziffer = ""
lblformel.Text = ""
neue_Zahl = True
neue_Rechnung = True
PunktvorStrich = False
End Sub

Private Sub cmdNull_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNull.Click
Ziffer = 0
Call SubZiffer(sender, e)
End Sub

Private Sub cmdEins_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdEins.Click
Ziffer = 1
Call SubZiffer(sender, e)
End Sub

Private Sub cmdZwei_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdZwei.Click
Ziffer = 2
Call SubZiffer(sender, e)
End Sub

Private Sub cmdDrei_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDrei.Click
Ziffer = 3
Call SubZiffer(sender, e)
End Sub

Private Sub cmdVier_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdVier.Click
Ziffer = 4
Call SubZiffer(sender, e)
End Sub

Private Sub cmdFünf_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFünf.Click
Ziffer = 5
Call SubZiffer(sender, e)
End Sub

Private Sub cmdSechs_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSechs.Click
Ziffer = 6
Call SubZiffer(sender, e)
End Sub

Private Sub cmdSieben_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSieben.Click
Ziffer = 7
Call SubZiffer(sender, e)
End Sub

Private Sub cmdAcht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAcht.Click
Ziffer = 8
Call SubZiffer(sender, e)
End Sub

Private Sub cmdNeun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdNeun.Click
Ziffer = 9
Call SubZiffer(sender, e)
End Sub

Private Sub cmdplus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdplus.Click
PunktvorStrich = False
Call SubRechnen(sender, e)
Rechenart_2 = ""
Rechenart = "plus"
End Sub

Private Sub cmdminus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdminus.Click
PunktvorStrich = False
Call SubRechnen(sender, e)
Rechenart_2 = ""
Rechenart = "minus"
End Sub

Private Sub cmdmal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdmal.Click
Select Case (Rechenart)
Case "plus", "minus"
PunktvorStrich = True
End Select
Call SubRechnen(sender, e)
Select Case (PunktvorStrich)
Case True
Rechenart_2 = "mal"
Case Else
Rechenart = "mal"
End Select
End Sub

Private Sub cmdgeteilt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdmal.Click
Select Case (Rechenart)
Case "plus", "minus"
PunktvorStrich = True
End Select
Call SubRechnen(sender, e)
Select Case (PunktvorStrich)
Case True
Rechenart_2 = "geteilt"
Case Else
Rechenart = "geteilt"
End Select
End Sub

Private Sub cmdIst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIst.Click
PunktvorStrich = False
Call SubRechnen(sender, e)
neue_Rechnung = True
Rechenart_2 = ""
End Sub
End Class
 

Anhänge

  • Rechner.jpg
    Rechner.jpg
    40,5 KB · Aufrufe: 197
Zuletzt bearbeitet:
Jeder Button hat auch ein KeyDown- bzw. ein Click-Event. Dadrin eine Prüfung auf Key.Enter und dann ein e.Cancel = true; und der Button wird nicht ausgeführt.
 
Ich kann das KeyDown-Event für jeden Button öffnen und auf Keys.Enter überprüfen, jedoch e.Cancel=true gibt es dort LEIDER nicht, beziehungsweise ich find es nicht
 
Zuletzt bearbeitet:
Wenn du einfach nur die Enter-Taste zum Berechnen abfangen willst, reicht es bei der Form der Eigenschaft AcceptButton den "IstGleich" Button zu zuweisen. Das machst du am Besten über den Designer.
 
Nein funktioniert auch nicht, er schreibt mir weiterhin 2en an, also als ob ich den Button 2 drücke, was meines nach daher kommt, dass der Button 2 Markiert ist (siehe blaue Umrandung auf dem Bild) und ein tieferes Problem liegt.
Meine Vermutung ist, dass in Windows ja bereits gesagt wird, wenn die Enter-Taste gedrückt wird oder die Return-Taste, dann soll das markierte symbol geklickt/ausgeführt/etc. werden. Das hat soweit nichts mit meinem Programmcode zu tun sondern mit etwas im Hintergrund, von Windows.
 
Du könntest auch einfach die keyPreview mittels "this.KeyPreview = true" innerhalb deiner Form einschalten.
Dann überschreibst Du die "OnPreviewKeyDown" methode, und reagierst auf deine Enter-Taste ;)


//kalleberlin
 
Ich hab es jetzt einmal so gemacht, dass das KeyPreview von anfang an auf False gesetzt wird und auf False gesetzt bleibt und den Rechner gestartet und die Enter Taste gedrückt und siehe da er schreibt immer noch die 2 hin, wie als wenn ich den Button 2 drücke. Drücke ich jedoch die Taste 2 oder + oder eine andere meiner programmierten Tasten, dann passiert natürlich nix.
Ich hab das Gefühl ich steh grad vor nem Riesenproblem, was ich vermutlich mit VBA nicht lösen kann. :confused_alt:
 
Du sollst die KeyPreview *einschalten* und Im KeyPreview event reagieren. Dein Problem ist definitiv *nicht* riesig, und schon gar nicht *nicht lösbar* ;)

//kalleberlin
 
waaah?
also soll ich die KeyDown Abfrage nicht im formRechner_KeyDown - Event vornehmen sondern im Event formRechner_PreviewKeyDown - Event oder wie???
Sorry aber ich versteh es grad nicht so wirklich, was du genau meinst
 
Hallo Winter88,

Code:
Protected Overrides Sub OnPreviewKeyDown(e As PreviewKeyDownEventArgs)
	If e.KeyCode = Keys.Enter Then
	End If

	MyBase.OnPreviewKeyDown(e)
End Sub

Der Code ist von c# -> VB mit einem tool konvertiert, keine Ahnung ob die Syntax 100% stimmt. Aber die Idee dahinter sollte klar sein.

Diese Funktion wird aufgerufen *bevor* deine Form / Button die Info bekommt das da gerade jemand die Enter-Taste gedrückt hat. Sprich wenn Du verhinder willst das deine 2 geschrieben wird, dann wäre hier nen guter Ansatz..


//kalleberlin
 
Nah, er braucht gar keinen Extracode.
Es sollte reichen KeyPreview auf True zu setzen und den Enter-Button als AcceptButton festzulegen.

btw ist es scheiße die Ausbildungsaufgaben von anderen zu machen.
 
Zuletzt bearbeitet:
reicht aber wie gesagt nicht
drück ich enter, rechnet er es nicht aus, sondern schreibt eine 2 dahinter, ihr könnt es ja gern einmal ausprobieren, oder ich mach etwas grundlegend falsch???
 
Zuletzt bearbeitet:
@derlolomat

Ganz so einfach ist es nicht, denn deine Variante funktioniert nicht sobald ein Button den Fokus hat.

@Winter88

Ich habe es auch gerade mal ausprobiert und keiner der Tips hier fuehrte zum Ziel. Fuer mich war der einfachste Weg in deiner Form die Funktion ProcessCmdKey zu ueberschreiben und wenn die passende Taste Enter ist, deine "Endergebnisfunktion" aufrufen und ture zurueck geben. In C# saehe das so aus :

Code:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                // hier deine ausrechnen funktion aufrufen
                return true;
            }
            
            return base.ProcessCmdKey(ref msg, keyData);
        }

Somit wird das Event nicht an die Controls weitergeleitet. Problem hierbei ist aber, dass jetzt auch dein "IstGleich - Button" nicht mehr auf Enter reagiert sondern nur noch auf Clicks.
 
Zurück
Oben