| |
VB.NET - Ein- und UmsteigerSonderbarer Fehler | | | Autor: Ortech | Datum: 19.01.17 17:38 |
| Grüß euch,
bitte seht euch mal folg. Code Snipsel an:
Public Class AEB
Public Structure IOEXBproperties
Dim safetylevelin As safetyoptions
Dim safetylevelout As safetyoptions
Dim autopos As yesno
Dim manpos As manpos
Dim AEBIDout As Integer
End Structure
Public Structure AEBproperties
Dim ID As Integer
Dim Inputs() As Boolean
Dim Outputs() As Boolean
Dim IO_Anzahl As Integer
Dim IOEXB() As IOEXBproperties
End Structure
Private AEBXXX(3) As AEBproperties
Public Sub New(ByVal icanid As Integer, ByVal IO_Anzahl As Integer, ByVal _
IOEXBsetting As IOEXBproperties, ByVal control As Control, ByVal x As _
Integer, ByVal y As Integer)
Dim iAEBID As Integer
iAEBID = icanid
For i As Integer = 0 To 7
With AEBXXX(iAEBID).IOEXB(i)
.safetylevelin = IOEXBsetting.safetylevelin
.safetylevelout = IOEXBsetting.safetylevelout
.autopos = IOEXBsetting.autopos
.manpos = IOEXBsetting.manpos
.AEBIDout = IOEXBsetting.AEBIDout
End With
Next
zeichneAEBmitIOEXB(iAEBID, IO_Anzahl, control, New Point(x, y))
End Sub Bei der fett markierten Zeile im Konstruktor steigt das Programm einfach aus. Es wir ddie Form gezeichnet u.s.w. aber wenn man dort hin debugged (F8), steigt das Rrogramm aus.
Was mach ich denn hier bitte falsch??
Alois | |
Re: Sonderbarer Fehler | | | Autor: Manfred X | Datum: 19.01.17 20:28 |
| Deine Fehler:
Du gibst nicht an, wie safetylevelin u.a. deklariert ist
Du verwendest Structures in Arrays. Verwende besser Klassen.
Du deklarierst Arrays (z.B. IOEXB) nicht in einer bestimmten Länge.
Die Array-Elemente, auf die Du zugreifen möchtest, existieren nicht.
usw.
Deklariere z.B. die Länge von Arrays im Konstruktor der Klasse,
in der sie enthalten sind. Oder verwende Listen.
Beitrag wurde zuletzt am 19.01.17 um 20:35:09 editiert. | |
Re: Sonderbarer Fehler | | | Autor: Ortech | Datum: 20.01.17 08:13 |
| sorry, hab das ENUM rausgelöscht, wollte nicht unnötigen Code posten, habe dadurch versehentlich zuviel gelöscht
Enum safetyoptions
not_used
single_
dual
quad
End Enum
Enum yesno
no
yes
End Enum
Enum manpos
_3_to_5_8_14
_6_to_8_11_17
_9_to_11_14_20
_12_to_14_17_23
_15_to_17_20__
_18_to_20_23__
_21_to_23____
End Enum In einer structure kann man keine arrays mit einer bestimmten Länge deklariern.
Du schreibst: "verwende besser....". Für mich heißt das, dass es bessere Wege gibt, um das zu programmieren, aber das heißt für mich auch, dass es nicht zwangsweise falsch ist und zu meinem ominösen Fehler führt. Versteh ich dich da richtig?
Mit LIST kann man nur einen Datentypen haben, soweit ich gelesen hab.
Wie ginge das mit einer Klasse? Hab keine Vorstellung-könntest du mir einen Beispielcode posten?
Beitrag wurde zuletzt am 20.01.17 um 08:23:04 editiert. | |
Re: Sonderbarer Fehler | | | Autor: Manfred X | Datum: 20.01.17 08:32 |
| Hallo!
Ich weiß nicht, wie gut Du in die OP-Materie bereits eingearbeitet bist.
Structures sind Werttypen, Array-Variable sind stets Verweistypen, auch wenn
die Elemente des Array Werttypen sind.
Ich empfehle insbesondere Anfängern, auf Verweistypen innerhalb einer Structure
zu verzichten, z.B. weil die Zuweisung als Mix von Werten und Referenzen auf
eine Structure-Instanz zu unerwarteten Effekten führen kann.
Falls Du trotzdem wie gehabt weitermachen willst ...
Public Sub New(ByVal icanid As Integer, ByVal IO_Anzahl As Integer, ByVal _
IOEXBsetting As IOEXBproperties, ByVal control As Control, ByVal x As _
Integer, ByVal y As Integer)
Dim iAEBID As Integer
iAEBID = icanid
Array.Resize(AEBXXX(icanid).IOEXB, 8) 'Deklaration des Array
For i As Integer = 0 To 7
AEBXXX(iAEBID).IOEXB(i) = IOEXBsetting
Next i
zeichneAEBmitIOEXB(iAEBID, IO_Anzahl, control, New Point(x, y))
End Sub | |
Re: Sonderbarer Fehler | | | Autor: Ortech | Datum: 20.01.17 08:39 |
| Wie du vermutlich vermutest (...) bin ich noch nicht recht fiirm mit OOP , möchte es aber unbedingt verstehen und andwenden können, habe auch schon tuts gelesen, aber trotzdem tu ich mir schwer.
Deine Idee mit einer eigenen Klasse hört sich sehr vernünftig an, abe wie genau ginge das.
Habe grad eine classIO angelegt, aber wie kann ich auf die Members von der classAEB aus zugreifen?
sicher, ich erstelle ein Objekt von der classIO in der classAEB, und dann?
Datenaustausch über properties?
Habe auch noch eine Form, auf der ich mit den Daten was anstelle, in beide Richtungen...
Mir ist der "Knopf" noch nicht aufgegangen...
Könntest du mir ein kleines Beispiel zeigen? | |
Re: Sonderbarer Fehler | | | Autor: Manfred X | Datum: 20.01.17 09:38 |
| Die Member der Structure IOEXProperties sind Werttypen.
Diese Structure kannst Du beibehalten.
Der Austausch von Daten zwischen Instanzen einer Klasse erfolgt durch Properties.
Gewöhnlich kapselt man die Membervariablen (Private) und legt sie durch
Properties offen.
Public Class AEBpropertiesC
Const arrlength As Integer = 8 'Länge der Array-Member
Dim _ID As Integer
Dim _Inputs(arrlength) As Boolean
Dim _Outputs(arrlength) As Boolean
Dim _IO_Anzahl As Integer
Dim _IOEXB(arrlength) As IOEXBproperties
Public Property Inp(ByVal index As Integer) As Boolean
Get
Return _Inputs(index)
End Get
Set(value As Boolean)
_Inputs(index) = value
End Set
End Property
Public ReadOnly Property Outp(ByVal index As Integer) As Boolean
Get
Return _Outputs(index)
End Get
End Property
Public Property ioexb(ByVal index As Integer) As IOEXBproperties
Get
Return _IOEXB(index)
End Get
Set(value As IOEXBproperties)
_IOEXB(index) = value
End Set
End Property
End Class Um Instanzen dieser Klasse als Array-Elemente in einer anderen Klasse
verwenden zu können, ist eine Array-Initialisierung zweckmäßig.
'innerhalb der Klasse AEB
Private AEBXXX(3) As AEBpropertiesC 'Es entstehen keine Class-Instanzen
Private IsInitialized As Boolean
Private Sub Init()
If IsInitialized Then Exit Sub
'Instanzen erstellen
For i As Integer = 0 To AEBXXX.Length - 1
AEBXXX(i) = New AEBpropertiesC
Next i
IsInitialized = True
End Sub
Public Sub New(ByVal icanid As Integer, ByVal IO_Anzahl As Integer, ByVal _
IOEXBsetting As IOEXBproperties, ByVal control As Control, ByVal x As _
Integer, ByVal y As Integer)
Init() 'Instanzen im Array sicher stellen
Dim iAEBID As Integer = icanid
For i As Integer = 0 To 7
'Structure komplett auf Property zuweisen
AEBXXX(iAEBID).ioexb(i) = IOEXBsetting
Next i
End Sub | |
Re: Sonderbarer Fehler | | | Autor: Ortech | Datum: 20.01.17 10:19 |
| Danke, verstanden.
Immer wieder ein klasse Forum ... | |
| 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 |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access 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
|