none
Keypress-Prozedur läuft nur mit Unterbruch korrekt (MS Access 2010 ×64)

    Frage

  • Hallo,

    Um eine Referenznummer ohne Leerstellen in ein Access-Formular einzugeben, habe ich folgende Prozedur geschrieben:

     

    Private Sub Referenz_Nummer_KeyPress(KeyAscii As Integer) ' Extras | Verweise | "Microsoft Forms 2.0 Object Library" aktivieren ' ( …\system32\fm20.dll ) Dim DataObj As MSForms.dataObject, RefNr As Variant Set DataObj = New MSForms.dataObject ' Debug.Print KeyAscii Select Case KeyAscii Case 32, 43 ' 32 = Leer / 43 = Num+ DataObj.GetFromClipboard ' DataObj-Format 1 = Text (andere Werte nicht gefunden) If DataObj.GetFormat(1) = True Then RefNr = DataObj.GetText(1) RefNr = Replace(RefNr, " ", "") If IsNumeric(RefNr) Then Me![Referenz-Nummer] = RefNr 'Debug.Print RefNr
    End If End If End Select
    'Stop End Sub

    Diese Prozedur wird ausgelöst durch Eingabe einer Leerstelle oder eines Plus-Zeichens (Bei Taste = KeyPress-Ereignis). Das läuft perfekt im Debug-Mode mit einem Halt oder einem Stop irgendwo (auch ein Stop erst am Schluss nach End Select genügt !).

    Ohne diese Pause bewirkt die Prozedur aber gar nichts, obwohl sie durchlaufen wird (Test mit Debug.Print, auch RefNr bekommt den richtigen Wert): es wird jedoch ein Leerzeichen oder ein + ins Textfeld geschrieben, wie ohne die Prozedur. Nach 5× alternierend "+" und " " resultiert einfach "+ + + + + ", nicht " " (egal, was in der Zwischenablage ist).

    Ich habe versucht, die Prozedur zu löschen, die Datenbank zu "komprimieren und reparieren" und dann die Prozedur neu zu erstellen (manchmal hilft das, wenn es "nur" ein Kompilierungsfehler ist). Verhält sich aber reproduzierbar genau gleich. Auch die Einführung einer Zeitschlaufe (5s) vor dem Select Case brachte keine Besserung.

    NB: eine nachträgliche Behandlung des Clipboard-Inhalts kommt nicht in Frage, da dieser zu lang ist für das Feld und die Feldlänge bewusst so knapp ist, um Fehleingaben zu verhindern. Natürlich könnte ich eine Schaltfläche mit Code ins Formular basteln, aber dann wird dieses unübersichtlich.

    Wer kann helfen ?

    PS: Es scheint ein altes Multitasking-Problem zu sein: der Tastendruck gibt zuerst Feld, Feldinhalt und Taste an ein internes Prozess weiter, dann nochmals die Taste weiter an meine Access-Prozedur in einem zweiten Prozess, der irgendwie den ersten Prozess überholt, sofern er nicht durch ein Halt oder Stop unterbrochen wird. Dann überschreibt der später fertige erste Prozess das Resultat des zweiten Prozesses…

    NB: Ich hatte auch einmal eine sehr langsame Prozedur mit SendKeys (aus sehr umfangreichen Word-Dokumenten zu einer nicht anders steuerbaren Spezialsoftware mit etlichen OLE-Objekten, das dauerte mehrere Minuten), die nur dann korrekt ablief, wenn man Kaffee trinken ging (sogar der Eingang von E-Mails störte).


    Donnerstag, 4. Mai 2017 16:00

Alle Antworten

  • So aus dem hohlen Bauch: Was ist, wenn du die Eingabe in ein ungebundenes Feld nimmst und im AfterUpdate-Ereignis dieses Feldes die unerwünschten Zeichen entfernst und erst dann den korrigierten Inhalt in das Tabellenfeld schreibst?

    Matthias Kläy, Kläy Computing AG

     
    Samstag, 6. Mai 2017 02:37