Hallo.
Ich habe das Problem, dass ein Event-Handler nicht ausgeführt wird, sobald RaiseEvent Eventname ausgeführt wird.
Das selbe Problem hatte auch jemand in diesem Forum.
Der Code, reduziert auf das nötige, sieht so aus (Das UserControl befindet sich in einer eigenen Dll):
Spoiler anzeigen
Form1, die StartForm der Testanwendung:
StructureWrapperClass, das ist ein Wrapper für Structures, damit man diese als Typenparameter angeben kann.
RegisterView, ein UserControl:
Ich habe den Code mal in einer Testanwendung probiert, aber da läuft er problemlos.
Wenn man die Anwendung startet, kommt es zu einer Reihe von Aufrufen, bis Debugger.Break() bei Zeile 96 aufgerufen wird.
Die Methode Transmit1To2 bei Zeile 95 behandelt das TransmitValue-Event von DockPoint1, welches durch RaiseEvent TransmitValue(NewValue) bei Zeile 80 ausgelöst wird.
Das Problem: Im richtigen Programm wird diese Methode nicht ausgeführt.
Das Event wird zwar ausgelöst (getestet durch Hinzufügen eines weiteren Handlers), aber wenn man einen Haltepunkt auf Zeile 80 setzt und einen Einzelschritt macht, dann wird nirgends hin gesprungen, sondern einfach mit der nächsten Zeile weitergemacht.
Ich habe auch schon probiert im Konstruktor von Arrow per AddHandler die EventHandler mit den Events zu verknüpfen, aber das bleibt genauso erfolglos.
Zum Test habe ich den Code aus der Assembly mal in das Projekt kopiert, in dem ich sie verwende und vorher den Verweis gelöscht. Natürlich stimmt dann das Namespace nicht, deshalb habe ich das noch ausgebessert.
Und erstaunlich: So funktioniert es!
Und ich habe auch schon versucht den vereinfachten Code in eine Dll auszulagern. Da funktioniert es immer noch.
Mir gehen echt die Ideen aus.
Moment!
Jetzt habe ich das Dll-Projekt mal auf den Desktop verschoben, ein neues Projekt mit dem selben Namen erstellt, den ganzen Code übernommen (1:1 C&P) und dieses an die Stelle des alten Projektes gesetzt. Dll neu kompiliert, Projekt geöffnet und schon hat's einwandfrei funktioniert.
Wie zum Teufel kann das möglich sein?
Nur weil's mich interessiert: Mal sehen, ob es jetzt funktioniert, wenn ich den Verweis mal auf das alte Projekt setze (ohne das alte Projekt zurückzukopieren). Jetzt geht's auch
Will Microsoft mich ärgern?
Ich versteh's einfach nicht. Also wer mir das erklären kann kriegt 'nen Keks.
Edit: Jetzt funktioniert es schon wieder nicht.
Und jetzt funktioniert das Anlegen eines neuen Projektes auch nicht mehr.
Es ist echt zum Durchdrehen!
Ich habe das Problem, dass ein Event-Handler nicht ausgeführt wird, sobald RaiseEvent Eventname ausgeführt wird.
Das selbe Problem hatte auch jemand in diesem Forum.
Der Code, reduziert auf das nötige, sieht so aus (Das UserControl befindet sich in einer eigenen Dll):
Form1, die StartForm der Testanwendung:
StructureWrapperClass, das ist ein Wrapper für Structures, damit man diese als Typenparameter angeben kann.
VB.NET-Quellcode
- 'Da Typenparameter keine Structures sein können, muss ein Wrapper her, der die entsprechende Structure beinhaltet.
- 'Die Basisklasse ist nötig, dass beim Typenparameter (Of T >>As StructureWrapperClass<<) angegeben werden kann.
- 'Dadurch wird der Typ auf eine dieser Klassen beschränkt.
- Public MustInherit Class StructureWrapperClass
- End Class
- 'Wrapper für eine 8-Bit Zahl
- Public Class WrapperByte
- Inherits StructureWrapperClass
- Public Property Value As Byte
- Public Sub New(ByVal NewValue As Byte)
- Value = NewValue
- End Sub
- 'Um bei MessageBox.Show("Transmit1To2: " & NewValue.ToString) etwas sinnvolles herauszubekommen
- Public Overrides Function ToString() As String
- Return "WrapperByte " & Value.ToString
- End Function
- End Class
RegisterView, ein UserControl:
VB.NET-Quellcode
- Public Class RegisterView
- Dim _Frames As New Frames
- Dim _Arrows As New Arrows(_Frames.EEPROM, _Frames.InstructionBus)
- Public Sub Initialize()
- _Frames.Initialize()
- End Sub
- 'Hier drin befinden sich alle Instanzen von Klassen, die von Frame abgeleitet sind
- Public Class Frames
- 'Der EEPROM wird mit einem Arrow(Of WrapperByte) mit dem InstructionBus verbunden
- Public EEPROM As Frame.EEPROM
- Public InstructionBus As Frame.BUSWire.InstructionBus
- Public Sub New()
- 'Alle Instanzen erstellen
- EEPROM = New Frame.EEPROM
- InstructionBus = New Frame.BUSWire.InstructionBus
- End Sub
- Public Sub Initialize()
- EEPROM.Initialize()
- End Sub
- End Class
- 'Hier befinden sich alle Instanzen von Arrow
- Public Class Arrows
- Public EEPROM_DataBus As Arrow(Of WrapperByte)
- Public Sub New(ByVal EEPROM As Frame.EEPROM, ByVal InstructionBus As Frame.BUSWire.InstructionBus)
- 'Alle Instanzen erstellen
- 'Man beachte, dass die jeweiligen DockPoints angebgeben werden.
- EEPROM_DataBus = New Arrow(Of WrapperByte)(EEPROM.Dock_ToInstructionBus, InstructionBus.Dock_ToEEPROM)
- End Sub
- End Class
- 'Die Basisklasse, von der alle Baugruppen abgeleitet sind
- Public MustInherit Class Frame
- 'Nimmt eine Adresse und sendet das Byte an der Adresse weiter
- Public Class EEPROM
- Inherits Frame
- Public Dock_ToInstructionBus As ArrowDockPoint(Of WrapperByte)
- Public Sub New()
- Dock_ToInstructionBus = New ArrowDockPoint(Of WrapperByte)
- End Sub
- 'Löst das erstmalige Senden des Bytes an Adresse 0 aus
- 'Zum Testen wird immer 8 gesendet
- Public Sub Initialize()
- PushValue()
- End Sub
- Public Sub PushValue()
- Dock_ToInstructionBus.PushValue(New WrapperByte(8))
- End Sub
- End Class
- 'Verbindet mehrere Frames miteinander
- Public MustInherit Class BUSWire
- Inherits Frame
- 'Ein 8-Bit Bus (Darum wird WrapperByte verwendet)
- Public Class InstructionBus
- Inherits BUSWire
- Public WithEvents Dock_ToEEPROM As ArrowDockPoint(Of WrapperByte)
- Public Sub New()
- Dock_ToEEPROM = New ArrowDockPoint(Of WrapperByte)
- End Sub
- End Class
- End Class
- End Class
- 'Ein "Andockpunkt" für Arrows
- 'Löst als Sender das Event TransmitValue aus, welches vom Arrow behandelt wird, oder
- '(hier nicht gezeigt) wird vom Arrow als Empfänger verwendet, um das Gegenstück bei einer Übertragung darzustellen
- Public Class ArrowDockPoint(Of T As StructureWrapperClass)
- Public Event TransmitValue(ByVal NewValue As T)
- Public Sub PushValue(ByVal NewValue As T)
- RaiseEvent TransmitValue(NewValue) 'Diese Zeile wird ausgeführt, aber es wird nicht zum EventHandler gesrpungen
- End Sub
- End Class
- 'Verbindet zwei ArrowDockPoints und übergibt Werte vom ersten zum zweiten oder umgekehrt
- Public Class Arrow(Of T As StructureWrapperClass)
- Dim WithEvents DockPoint1 As ArrowDockPoint(Of T)
- Dim WithEvents DockPoint2 As ArrowDockPoint(Of T)
- Public Sub New(ByVal NewDockPoint1 As ArrowDockPoint(Of T), ByVal NewDockPoint2 As ArrowDockPoint(Of T))
- DockPoint1 = NewDockPoint1
- DockPoint2 = NewDockPoint2
- End Sub
- 'Ein Wert wird vom ersten ArrowDockPoint zum zweiten übergeben
- 'Dies ist der EventHandler für das TransmitValue-Event; Und er wird nicht ausgeführt, wenn das Event ausgelöst wird.
- Private Sub Transmit1To2(ByVal NewValue As T) Handles DockPoint1.TransmitValue
- If Debugger.IsAttached Then Debugger.Break()
- MessageBox.Show("Transmit1To2: " & NewValue.ToString)
- End Sub
- End Class
- End Class
Ich habe den Code mal in einer Testanwendung probiert, aber da läuft er problemlos.
Wenn man die Anwendung startet, kommt es zu einer Reihe von Aufrufen, bis Debugger.Break() bei Zeile 96 aufgerufen wird.
Die Methode Transmit1To2 bei Zeile 95 behandelt das TransmitValue-Event von DockPoint1, welches durch RaiseEvent TransmitValue(NewValue) bei Zeile 80 ausgelöst wird.
Das Problem: Im richtigen Programm wird diese Methode nicht ausgeführt.
Das Event wird zwar ausgelöst (getestet durch Hinzufügen eines weiteren Handlers), aber wenn man einen Haltepunkt auf Zeile 80 setzt und einen Einzelschritt macht, dann wird nirgends hin gesprungen, sondern einfach mit der nächsten Zeile weitergemacht.
Ich habe auch schon probiert im Konstruktor von Arrow per AddHandler die EventHandler mit den Events zu verknüpfen, aber das bleibt genauso erfolglos.
Zum Test habe ich den Code aus der Assembly mal in das Projekt kopiert, in dem ich sie verwende und vorher den Verweis gelöscht. Natürlich stimmt dann das Namespace nicht, deshalb habe ich das noch ausgebessert.
Und erstaunlich: So funktioniert es!
Und ich habe auch schon versucht den vereinfachten Code in eine Dll auszulagern. Da funktioniert es immer noch.
Mir gehen echt die Ideen aus.
Moment!
Jetzt habe ich das Dll-Projekt mal auf den Desktop verschoben, ein neues Projekt mit dem selben Namen erstellt, den ganzen Code übernommen (1:1 C&P) und dieses an die Stelle des alten Projektes gesetzt. Dll neu kompiliert, Projekt geöffnet und schon hat's einwandfrei funktioniert.
Wie zum Teufel kann das möglich sein?
Nur weil's mich interessiert: Mal sehen, ob es jetzt funktioniert, wenn ich den Verweis mal auf das alte Projekt setze (ohne das alte Projekt zurückzukopieren). Jetzt geht's auch
Will Microsoft mich ärgern?
Ich versteh's einfach nicht. Also wer mir das erklären kann kriegt 'nen Keks.
Edit: Jetzt funktioniert es schon wieder nicht.
Und jetzt funktioniert das Anlegen eines neuen Projektes auch nicht mehr.
Es ist echt zum Durchdrehen!
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Niko Ortner“ ()