Neuigkeiten:

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

Mobiles Hauptmenü

Event greift nicht

Begonnen von Milvus, Mai 27, 2019, 15:09:53

⏪ vorheriges - nächstes ⏩

Milvus

Hallo zusammen,

ich hatte hier vor einiger Zeit ein Topic zum Thema Klassenbibliothek als separate Access-Datei aufgemacht.

Im Zuge dessen bin ich auf ein Phänomen gestoßen und ich hatte schon so ein BAuchgefühl, bo das so geht, wie ich mir das vorstelle!?

Ich habe ein Formular mit Events verstehen. Beim Speichern eines Datensatzes oder beim späteren Schließen soll ein darunter liegendes Formular aktualisiert werden. Dies habe ich funktionsfähig mit Ergeignissen programmiert.

Nun habe ich dieses Formular in meine Klassenbibliothek ausgelagert und rufe es als Instanz in einem meiner vielen Frontends auf (Diskussione, warum so viele etc, hatten wir schon, bitte überspringen). Das Problem ist, dass ich das Event, welches sich in der Klassenbibliothek befindet, zwar raise-sen kann, das Abgreifen des Events im darunter liegenden Formular wird aber nicht angestoßen (Unterbrechnungsmarke: Nix).

Noch mal Definition Klassenbibliothek: Das ist nichts anderes als eine Access-Datei mit Klassenmodulen, Codemodulen und einnigen Formularen. Das ist - ganz allgemein- standardisierte Funktionalität, die ich in mehreren Frontends nutze.

Hier der Code:

Deklaration des Formulars, welches in der Biblio aufgerufen wird:

Private WithEvents frmLink2Doc As Form

Initialisierung:
Frontend/Anwendung:
Public Function New_Link2Doc() As Object
    Set New_Link2Doc = Application.Run(CurrentProject.Path & "\ClassLibary.New_Form_FRMLinksToDocs")
End Function

ClassLibary:
Public Function New_Form_FRMLinksToDocs() As Form_FRMLinksToDocs_Lib       
    Set New_Form_FRMLinksToDocs = New Form_FRMLinksToDocs_Lib
End Function

D.h., es wird die Variable ein allgemeines Formobject dimensioniert und als konkretes Klassenmodul des Formulars aus der Libary initialisiert.

Das klappt alles!

Im Form (in dem die Events erzeugt werden) folgender Code:

Public Event FormClose()

Private Sub Form_Close()
    RaiseEvent FormClose
End Sub


Auch dass klappt alles,  das Event wird beim Schließen ausgelöst.


Aber das da wird reagiert nicht:

Private Sub frmLink2Doc_FormClose()
    Set frmLink2Doc = Nothing
End Sub

Das ist der Code, der im aufrufenden Formular steht, also der in der Anwendung.

Ich habe das folgendermaßen gebaut:
Zunächst das ganze Form in der Anwendung selbst entwickelt, mit den Events! Daher weiß ich, dass das alles stimmt und funktionert.

Nach dem Auslagern und initialisieren von außerhalb greift der Punkt aber nicht mehr.

Einer eine Idee!?
:o

PhilS

Zitat von: Milvus am Mai 27, 2019, 15:09:53

Private WithEvents frmLink2Doc As Form
[...]
Im Form (in dem die Events erzeugt werden) folgender Code:
Public Event FormClose()
Dein Event FormClose, das du behandeln möchtest, ist nicht Teil der Klasse Form, sondern gehört zur Klasse Form_FRMLinksToDocs_Lib.

Ich würde mal die folgenden Deklaration ausprobieren:
Private WithEvents frmLink2Doc As Form_FRMLinksToDocs_Lib
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Milvus

Ja das hab ich schon versucht, funktioniert bei LateBinding nicht:

Benutzerdefinierter Typ nicht definiert.

Dazu müsste ich die ClassLib per Verweis einbinden. Hab ich so momentan aber eher locker gelöst.
Das Teil soll nur geöffnet werden, wenn auch eine Klasse aufgerufen wird. Also mittels Application.run

Daher zunächst die "common Class", dann der explizite Typ

Ich habe das Problem umschifft. Ich übergebe dem aufgerufenen Form das ursprüngliche Form als Instanz und aktualisiere dort.

Aber wenn es einen Weg gäbe, dann wäre das schon relativ interessant, da möglicherweise auch mal größere Event-Ationen ablaufen.





Josef P.

#3
Hallo!

Du könntest eine "Eventbridge" (Callback+Event) nutzen.

Prinzip:
An die Instanz Bibliotheksklasse wird eine "lokale" Klasseninstanz übergeben, von der die Bibliotheksinstanz eine Methode aufruft und in der lokalen Instanz diese Methode ein Ereignis auslöst.

Beispiel-Skizze (nur Luftcode!):

Bibliotheks Klasse: LinksToDocs
private m_EventBridge as Object  ' = LinksToDocsEventBridge

public property set EventBridge(byval NewRef as Object)
    set m_EventBridge = NewRef
end property

public sub EineSubMitEvent()
...
    Raiseevent EventABC ' für "normales" Earlybinding
    if not (m_EventBridge is nothing) then
        m_EventBridge.RaiseEventABC
    end if
...
end sub


Access-Anwendung:
Klasse LinksToDocsEventBridge
Public Event EventABC()

Public sub RaiseEventABC
   Raise EventABC
end sub


Klasse, die EineSubMitEvent aus der Lib nutzt:
private m_LinksToDocs as Object
private withevents m_EventBridge as LinksToDocsEventBridge

private property get LinksToDocs() as Object
    if m_LinksToDocs is nothing then
       InitLinksToDocs
    end if
    set LinksToDocs = m_LinksToDocs
end property

private sub InitLinksToDocs()
    set m_LinksToDocs = ....
    set m_EventBridge = New LinksToDocsEventBridge
    set m_LinksToDocs.EventBridge = m_EventBridge
end sub

private sub MachWas()
    LinksToDocs.EineSubMitEvent
end Sub

private sub m_EventBridge_EventABC()
    ...
end sub


mfg
Josef

Milvus

Danke Josef, das klingt logisch. Sollte gehen.

Ich melde mich bei Gelegenheit und berichte

Milv