Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Fehler 2474 abfangen beim direkten öffnen von Formular

Begonnen von Chiefhenk, April 20, 2025, 13:31:43

⏪ vorheriges - nächstes ⏩

Chiefhenk

Hallo Zusammen

Ich habe das Problem das eine Function einen Fehler auslöst.

Öffne ich das Formular zuerst im Bearbeitung Modus und Wechsle dann in den Formular Modus klappt alles.
Öffne ich das Formular direkt bekomme ich diesen Fehler.

Laufzeitfehler '2474':

Für den von Ihnen eingegeben Ausdruck ist es erforderlich, dass sich dass
Steuerelement im aktiven Fenster befindet.


Was löst diesen Fehler aus:

Ich habe 2 Funktionen in einem Modul

Diese werden im Formular mit folgendem Code Aktiviert und deaktiviert:

Private Sub ST_Titel_GotFocus()

Call BackcolorOn

End Sub

Private Sub ST_Titel_LostFocus()

Call BackcolorOff

End Sub

Im Modul:
Public Function BackcolorOn()

With Screen.ActiveControl

.BackColor = QBColor(14) 'Hellgelb

.SetFocus

End With

End Function

Public Function BackcolorOff()

With Screen.ActiveControl

.BackColor = QBColor(15) 'weiss

.SetFocus

End With

End Function

Dies funktioniert auch toll, solange das Fenster über einen Umweg geöffnet wird.

Auf welchem Weg kann ich diesen Fehler abfangen? Hat da jemand eine Idee.


Knobbi38

Hallo,

während des Öffnens eines Formulars erhält das erste Steuerelement den Fokus und damit wird dann auch deine Ereignisroutine angesprungen. Zu dem Zeitpunkt gibt es aber noch kein aktiviertes Steuerelement und deshalb geht der erste Aufruf von Screen.Activecontrol schief. 

Hier mußt du die eine andere Logik einfallen lassen, die deine Ereignisbehandlung erst freischaltet, wenn ein Formular auch sichtbar ist oder du baust eine entsprechende Fehlerbehandlungsroutine ein.

Im übrigen würde ich das eher mit einer Klasse oder einem "Shared Eventhandler" lösen, anstatt jedes mal eine Funktion auszurufen.

Gruß Knobbi38
 

Chiefhenk

Hallo Knobi
Danke für deine Antwort.

Das habe ich mir fast gedacht

Da Ich Anfänger bin weis ich nicht wie das mit der Klasse oder dem Shared Eventhandler geht.

Bitsqueezer

Hallo,

im übrigen gibt es für den Zweck auch eine Bedingte Formatierung, dort kannst Du als Regel einstellen, daß das Control aktiv sein muß und welche Formatierung dann einzustellen ist.
Das funktioniert dann ganz ohne Programmierung und ist nicht auf unzuverlässige Referenzen wie "Screen.ActiveControl" angewiesen.

Außerdem:

Private Sub ST_Titel_GotFocus()

BackcolorOn

End Sub

Wenn Du eine Eventfunktion für "GotFocus" hast, dann weißt Du explizit, daß das aktive Control hier "ST_Titel" ist. Also kannst Du, wenn "BackColorOn" wiederverwendbar sein soll, die Referenz einfach übergeben mit "BackColorOn Me.ST_Titel".

Deine Funktion wird dann modifiziert:
Public Function BackcolorOn(ctlTextbox As Access.TextBox)
    ctlTextBox.BackColor = QBColor(14) 'Hellgelb
End Function

Ein "SetFocus" ist hier sinnfrei, da Du ja bereits mit "GotFocus" einen Event ausgelöst hast, der besagt, daß der Fokus sich genau hier befindet.

Mit dieser Modifikation erhält die Funktion genau die richtige Referenz, während "Screen.ActiveControl" u.U. auf ein anderes Control verweist, was gerade nicht verfügbar ist.

Gruß

Christian

Knobbi38

Hallo,

die Lösung von Christian ist sicherlich in diesem Fall die einfachste und beste Variante. 👍

Alternativ  kannst du hier einfach deine Funktion als "Shared Eventhandler" direkt per Ausdruck bei den Textboxen eintragen und aufrufen:
Sie dürfen in diesem Board keine Dateianhänge sehen.

Public Function BackcolorOn() As Variant
  On Error Resume Next
  Screen.ActiveControl.BackColor = QBColor(14) 'Hellgelb
End Function

Übrigens solltest du bei Verwendung des Screen-Objekts immer mit einem Fehler rechnen. Eine minimale Fehlerbehandlung ist dabei also obligatorisch.

Gruß Knobbi38

Chiefhenk

Hallo Knobbi

Deine Letzte Antwort funktioniert Tadellos
Danke für das schnipped.

Ich habe das qbcolor noch mit RGB(224, 224, 224) ausgetauscht.
Nun Passt es