| |
VB.NET - FortgeschritteneComponent und Event prozeduren | | | Autor: dj.tommy | Datum: 17.06.19 16:25 |
| Hallo Leute!
Kurze Frage
Ich möchte eine eigene Komponenten erstellen
aber je nach dem man die Property Eigenschaften einstellt, das nach der Einstellung
Gewisse Event Prozeduren erscheinen?
Sollte es jemand nicht genau wissen, was ich meine mache ich ein bei spiel:
im Komponenten Class befinden sich 2 Prozeduren
Public Event Test1( ByVal Wert As Integer)
Public Event Test2( ByVal Wert As String) und eine Property
Enum _Wahl
[Zahl]
[String]
End Enum
Dim VWahl As _Wahl
Public Property Wahl() As _Wahl
Get
Return VWahl
End Get
Set(ByVal Value As _Wahl)
VWahl = Value
End Set
End Property Wenn jetzt im Form unter Property Wahl die Einstellung Zahl hat
das die Prozedur
Sub Test1( ByVal Wert As Integer)
End Sub Erscheint.
Wenn jetzt aber im Form unter Property Wahl die Einstellung String eingestellt ist, das dann die Prozedur
Sub Test2( ByVal Wert As String)
End Sub Erscheint.
Ist Sowas möglich, wenn ja wie muss, ich es machen
ich habe es leider nur so geschafft.
#Const einstellung = 0
#If einstellung = 0 Then
Public Event Test1( ByVal Wert As Integer)
#Else
Public Event Test2( ByVal Wert As String)
#End If Wird die Einstellung, 0 angegeben wird im Form Test1 angezeigt und bei anderen zahl Test2 angezeigt
leider schaffe ich es nicht per Property einzustellen.
Danke im Voraus. | |
Re: Component und Event prozeduren | | | Autor: sv00010 | Datum: 17.06.19 19:09 |
| Grober Beispielcode:
Public Class Event_Wahl
Inherits System.EventArgs
Public Structure WAHL
'Einen Wert für die Auswahl des verwendeten Typs
'und für jeden im Enum deklarierten Wert ein Variable deklarieren
'Es soll immer nur die Value_WAHL..-Variable mit Werten gefüllt werden,
'welche bei Selected_Wahl eingstellt wurde.
'Die andere Value_WAHL..-Variable dann einfach unbenutzt lassen.
Dim Selected_Wahl As ENUM_SELECTED_WAHL
Dim Value_WAHL_Zahl_Integer As Integer
Dim Value_WAHL_String As String
Public Enum ENUM_SELECTED_WAHL As Integer
WAHL_Zahl_Integer = 0
WAHL_String = 1
End Enum
End Structure
Dim Value_WAHL As WAHL
Sub New(ByVal Wahl_IN As WAHL)
Value_WAHL = Wahl_IN
End Sub
ReadOnly Property Value_Wahl As WAHL
Get
return Value_WAHL
End Get
End Property
End Class Die selbsterstellte Event-Klasse soll dann in die Komponente rein, damit von überall darauf zugegriffen werden kann.
In der Komponente muss dann noch ein EventHandler erstellt werden, welcher mit public deklariert ist,
sodass er im Hauptprogramm an die Routine gebunden werden kann.
Wenn dann die Komponente ein Event_Wahl auslöst (musst du selber programmieren, wann das sein soll), dann springt die Code-Ausführung in die Routine, welche an den EventHandler in der Komponente gebunden ist.
Das bedeutet die Code-Ausführung springt ins Hauptprogramm.
Da das Event_Wahl die ganzen Werte, welche ausgewählt wurden enthält kann dann per Select Case einfach die entsprechende Unterroutine aufgerufen werden.
Man könnte natürlich auch zwei Event-Klasen erstellen und diese stattdessen gleich an die entsprechenden Unterroutine binden.
Ich habe das allerdings erstmal so gemacht, damit die allgemeine Funktionionsweise erkennbar bleibt.
Beitrag wurde zuletzt am 17.06.19 um 19:19:05 editiert. | |
Re: Component und Event prozeduren | | | Autor: dj.tommy | Datum: 17.06.19 21:06 |
| Hallo sv00010!
Sorry da stehe ich aber sowas auf dem schlau.
Wenn du mal zeit und Lust hast, würdest du es mir genauer erklären?
Ich habe mir dein Text mindestens 10 mal durchgelesen.
Und herumprobiert aber da komm ich nicht auf einem grünen Zweig.
Es hapert allein schon von der Erstellung von EventHandler da kommen nur Fehler und kann mir nicht vorstellen, wie du das meinst, so das die Prozedur Test1 oder Test2 im Komponenten Klasse freigeschaltet werden, so das es im Form sichtbar ist. | |
Re: Component und Event prozeduren | | | Autor: Kuno60 | Datum: 18.06.19 01:00 |
| Hallo,
ich verstehe zwar nicht, welchen Sinn das haben soll, ein Event per Eigenschaft einzustellen...
Hier mal ein paar Vorschläge:
Erstelle 2 Events und benutze nur eins davon.
Public Event Test1(wert As Integer)
Public Event Test2(wert As String) Erstelle ein Event mit 2 Argumenten.
Public Event Test(zahl As Integer, zeichen As String) Erstelle ein Event als Object und teste den Typ in der behandelnden Sub.
Hier wäre es auch möglich, abhängig von einer Einstellung, einen Integer oder String-Wert zurück zu geben.
Public Event Test(wert As Object)
' in der Form
Private Sub Komponente_Test(wert As Object) Handles Komponente.Test
If TypeOf wert Is Integer Then
ElseIf TypeOf wert Is String Then
End If
End Sub Oder mit generischem Typ. Kann dann aber nur per Code erstellt werden, da dies der Designer nicht unterstützt.
Im Editor wird über die Auswahl des Events (Test), über die Navigationsleiste, dann der richtige Typ eingefügt.
Public Class MeinControl(Of T)
Public Event Test(wert As T)
End Class
Public Class Form1
Dim WithEvents Komponente As New MeinControl(Of Integer) 'gewünschter Typ
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Controls.Add(Komponente)
End Sub
' automatisch eingefügt:
Private Sub Komponente_Test(wert As Integer) Handles Komponente.Test
End Sub
End Class | |
Re: Component und Event prozeduren | | | Autor: sv00010 | Datum: 18.06.19 06:17 |
| dj.tommy schrieb:
Zitat: | |
Es hapert allein schon von der Erstellung von EventHandler da
kommen nur Fehler und kann mir nicht vorstellen, wie du das
meinst, so das die Prozedur Test1 oder Test2 im Komponenten
Klasse freigeschaltet werden, so das es im Form sichtbar
ist. | |
Ich benutze das eigentlich immer in C#.
Es ist wirklich zu kompliziert.
Verwende jetzt einfach nur die Structure zum Speichern der Auswahl.
Public Structure WAHL
'Einen Wert für die Auswahl des verwendeten Typs
'und für jeden im Enum deklarierten Wert ein Variable deklarieren
'Es soll immer nur die Value_WAHL..-Variable mit Werten gefüllt werden,
'welche bei Selected_Wahl eingstellt wurde.
'Die andere Value_WAHL..-Variable dann einfach unbenutzt lassen.
Dim Selected_Wahl As ENUM_SELECTED_WAHL
Dim Value_WAHL_Zahl_Integer As Integer
Dim Value_WAHL_String As String
Public Enum ENUM_SELECTED_WAHL As Integer
WAHL_Zahl_Integer = 0
WAHL_String = 1
End Enum
End Structure | |
Re: Component und Event prozeduren | | | Autor: Manfred X | Datum: 18.06.19 08:10 |
| Hallo!
Erkläre, was genau Du erreichen möchtest.
Mit Deiner Planung scheinst Du auf dem Holzweg zu sein.
Gewöhnlich leidet man in solchen Fällen von einer Basisklasse
weitere Klassen ab, die eigene Methoden oder Events hinzufügen. | |
Re: Component und Event prozeduren | | | Autor: dj.tommy | Datum: 18.06.19 16:33 |
| Hallo sv00010!
Die Struktur kenne ich, das hat so in VB.Net eh funktioniert, aber ich habe dich nicht genau verstanden, wie ich es machen soll, das die Event-Prozeduren freischalten werden.
Hallo Kuno60!
Dein Vorschlag sieht für mich nicht gut aus für eine Komponenten Klasse Sorry.
Hallo Manfred X!
Bitte schimpfe nicht mit mir.
Ich weiß, dass ich eigentlich von Alten VB6 loslassen sollte.
Aber ich komme einfach nicht hinweg, wie ich das sonst machen sollte.
Also was habe ich vor
Ich erstelle eigene Komponenten Klasse, mit TCP Socket Funktion, die man per Code oder per Design einbinden kann.
Es funktioniert soweit gut, nun soll es auch noch die Funktion haben, das man mehreren Verbindungen aufnehmen kann.
Für mich ist es auch sehr wichtig, das man auch die Verbindung auseinander halten kann.
d.h. wenn z.b: Der Server ist mit 5 Clienten verbunden ist, und man will Nachricht oder Daten an Client 3 senden, das man weiß, wo der Client 3 Verbindung ist.
Im VB6 mittels Winsock hat man es mit Index gemacht.
Und so was in der Richtung möchte ich auch machen.
Winsock mit nur einer Verbindung war z.b: DataArrival so.
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
End Sub und hatte man mehrere Verbindungen, konnte man die Verbindung mittels Index auseinander halten, daher war die Prozedur so
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
End Sub somit wusste man durch Index wer was geschickt hat.
Und bei senden:
Winsock1(Index).SandData() auf dem richtigen Rechner zurücksenden.
Ich habe kein Passenden Code gefunden, wie man das macht.
Ich habe im Internet unter vb-paradise.de den Versuch Chat gefunden.
Da wird erklärt, wie die Nachricht an alle Chats gesendet werden.
Public Overrides Sub Send(ByVal Msg As String)
OnChatMessage(New MessageEventargs(Msg)) ' anzeigen
For Each C As Client In _Clients ' an alle versenden
C.Send(Msg)
Next
End Sub nun wie soll ich jetzt herausfinden wer, wer ist.
Also war, meine einzige Lösung, mach es wie Winsock mittels Index, den sobald eine Verbindung akzeptiere wird, legt man sich ein Index Nummer an, wenn eine Nachricht ankommt, das man mit Index Nummer ermitteln kann wer das ist.
wenn Daten gesendet wird, das es mittel Index auch an den Richtigen gesendet wird.
Wenn du weißt wie ich das im Komponenten ein programmieren soll,
das wenn mehrere Verbindungen sind, so das es an die richtige Verbindung, die Daten gesendet werden.
Und das man weiß, von wem die Daten kommen.
Dann würde ich gerne dein Ratschlag erfahren.
Mfg DjTommy | |
Re: Component und Event prozeduren | | | Autor: Manfred X | Datum: 18.06.19 18:59 |
| Meinst Du die Zuordnung einer Ereignisverarbeitung zu
verschiedenen Instanzen einer Klasse???
Public Class frmZZZ
'eine Klasse, von der mehrere Instanzen verwendet werden sollen
Private Class xxx
Public Event xxx_event(sender As Object, e As EventArgs)
Public Sub eventraiser()
RaiseEvent xxx_event(Me, EventArgs.Empty)
End Sub
End Class
'Liste der Klasseninstanzen
Dim lstXXX As New List(Of xxx)
Private Sub frmZZZ_Load(sender As Object, _
e As EventArgs) Handles MyBase.Load
'Diverse Klasseninstanzen erstellen
For i As Integer = 0 To 10
Dim xxx_inst As New xxx
'Handlerroutine einem Event der Instanz zuordnen
AddHandler xxx_inst.xxx_event, AddressOf xxx_eventhandler
'Neue Instanz in der Instanz-Liste hinzufügen
lstXXX.Add(xxx_inst)
Next i
'Ein Event auslösen
lstXXX(7).eventraiser()
End Sub
Public Sub xxx_eventhandler(sender As Object, e As EventArgs)
'Im gemeinsamen Handler den Liste-Index der sendenden Instanz ermitteln
Dim index As Integer
For i As Integer = 0 To lstXXX.Count - 1
If sender Is lstXXX(i) Then index = i
Next i
End Sub
End Class | |
Re: Component und Event prozeduren | | | Autor: dj.tommy | Datum: 18.06.19 19:20 |
| Hallo Manfred X!
nun ja so in der Richtung.
Aber da muss man alles in Form aufbauen und das wollte ich ja nicht.
Ich wollte, das alles im Komponenten passiert und im Form in eine Prozedur wieder geben so wie Winsock ist viel leichter und übersichtlicher.
Verstehst du was ich meine
deswegen wollte ich wissen, wie ich je nach Einstellung die Komponenten Event Prozeduren sich anpassen.
Aber trotzdem Danke für deine antworten
schön Abend noch. | |
Re: Component und Event prozeduren | | | Autor: Manfred X | Datum: 18.06.19 19:47 |
| Dein DataArrival-Index im VB6-Code ergibt sich aus der Verwendung
eines Steuerelemente-Feldes.
Ich habe Dir die Entsprechung in VB.Net gezeigt. Dieses Vorgehen
(List, Addhandler) kannst Du genauso innerhalb einer Komponente
verwenden.
https://activevb.de/tutorials/tut_vbnetcontrolarrays/vbnetcontrolarrays.html
Du kannst auch ein Usercontrol erstellen, daß die Verwaltung mehrerer
Winsocks übernimmt und die Kommunikation als Events mit dem jeweiligen
Index an das nutzende Programm weiterleitet.
Beitrag wurde zuletzt am 18.06.19 um 20:06:54 editiert. | |
Re: Component und Event prozeduren | | | Autor: sv00010 | Datum: 18.06.19 20:30 |
| dj.tommy schrieb:
Zitat: | | Hallo sv00010!
Die Struktur kenne ich, das hat so in VB.Net eh funktioniert,
aber ich habe dich nicht genau verstanden, wie ich es machen
soll, das die Event-Prozeduren freischalten werden.
| |
Ich habe ein Beispiel-Projekt erstellt (Visual Studio 2017)
Beispiel-Projekt Download
Beitrag wurde zuletzt am 18.06.19 um 20:31:36 editiert. | |
Re: Component und Event prozeduren | | | Autor: dj.tommy | Datum: 18.06.19 20:41 |
| Hallo sv00010!
Erstmal danke für deine Mühe, aber Google lässt mich nicht herunterladen
Zitat:
Diese Datei ist leider mit einem Virus infiziert.
Nur der Eigentümer ist dazu berechtigt, infizierte Dateien herunterzuladen.
| |
Re: Component und Event prozeduren | | | Autor: sv00010 | Datum: 18.06.19 21:37 |
| Ich habe es nochmal hochgeladen:
Downloadlink | |
Re: Component und Event prozeduren | | | Autor: dj.tommy | Datum: 19.06.19 17:11 |
| Hallo sv00010!
Danke dir, ich schau mir das mal an | |
Re: Component und Event prozeduren | | | Autor: sv00010 | Datum: 19.06.19 17:35 |
| dj.tommy schrieb:
Zitat: | | Hallo sv00010!
Danke dir, ich schau mir das mal an | |
Wenn du dann das Prizip verstanden hast, dann kannst du je nach Bedarf weitere Event-Klassen erstellen, mit immer den entsprechenden Daten, welche für das entsprechende Event benötigt werden.
In deinem Fall könnte das z.B. ein Event sein, was du auslöst, solltest du mitbekommen, dass die Netzwerkverbindung unterbrochen wurde usw.
Beitrag wurde zuletzt am 19.06.19 um 17:36:26 editiert. | |
Re: Component und Event prozeduren | | | Autor: dj.tommy | Datum: 19.06.19 19:33 |
| Hallo Leute!
Ich glaube das ich wirklich auf dem Holzweg war, so wie Manfred X gesagt hat.
Da es mit es keine ruhe gegeben hat, habe ich VMware Player gestartet wo ich Windows XP installiert habe.
Und habe VB6 geöffnet und Winsock noch mal genauer angesehen.
und bin der glauben das das ganze so Funktioniert.
Da im VB6 noch Index gab, gab es auch unter den Eigenschaften den Index.
Hatte man bei Index einen wert eingegeben, wusste der VB6-Editor, er soll Winsock oder andere Steuerelemente, das er diesen Steuerelemente als Arrays Anzahl die im vorgegeben wurde erstellt.
Und daher wurde unter der Prozedur auch Index Argument hinzugefügt.
Frage lege ich mit meinen Gedanken Richtig? | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|