Getting a property from the instantiator class - vb.net
Not an experienced programmer, so probably not a hard question.
Developing a small application in VB.net in WPF.
I made 3 classes, EngineeringObject<==Inherits==PartOfInstallation<==Inherits==SensorActor
In the class SensorActor I'm trying to get a property of PartOfInstallation with the function MyBase.Name. But this goes directly to EngineeringObject. How do I solve this?
Public Class EngineeringObject
''Private declarations, alleen objecten die erven kunnen hieraan, of dmv van getters en setters
'Name of part
Private sName As String = "Naam"
'81346 Id's
Private sSystemId As String = "Functie" 'VentilationSystem, Pumpsystem
Private sLocationId As String = "Locatie" 'Room 0.0
Private sObjectId As String = "Object" 'Fan, Pump
'General
Private sPartNumber As String
Private sLinkToDatasheet As String
'Property's
Public Property Name() As String
Get
Return sName
End Get
Set(ByVal value As String)
sName = value
End Set
End Property
Public Property SystemId() As String
Get
Return sSystemId
End Get
Set(ByVal value As String)
sSystemId = value
End Set
End Property
Public Property PartNumber() As String
Get
Return sPartNumber
End Get
Set(ByVal value As String)
sPartNumber = value
End Set
End Property
Public Property LinkToDatasheet() As String
Get
Return sLinkToDatasheet
End Get
Set(ByVal value As String)
sLinkToDatasheet = value
End Set
End Property
Public Sub New()
End Sub
End Class
Public Class PartOfInstallation
Inherits EngineeringObject
'src: https://stackoverflow.com/questions/21308881/parent-creating-child-object
'src: https://stackoverflow.com/questions/16244548/how-to-create-a-list-of-parent-objects-where-each-parent-can-have-a-list-of-chil
Private lSensorActor As New List(Of SensorActor)
Public Function GetSensorActor()
Return Me.lSensorActor
End Function
Public Sub CreateSensorActor()
lSensorActor.Add(New SensorActor)
End Sub
End Class
Public Class SensorActor
Inherits PartOfInstallation
Dim sMyPartOfInstallation As String
Public Property MyPartOfInstallation As String
Get
Return sMyPartOfInstallation
End Get
Set(value As String)
sMyPartOfInstallation = MyBase.Name
End Set
End Property
End Class
If I understand it correctly, based on your comments, you want every SensorActor instantiated within a PartOfInstallation instance to get the same name as that instance.
If so, then just add a second constructor to your SensorActor class allowing you to pass a name for it as well:
Public Class SensorActor
Inherits PartOfInstallation
...your code...
Public Sub New() 'Empty constructor, for if/when you don't want to set the name immediately.
End Sub
Public Sub New(ByVal Name As String)
Me.Name = Name
End Sub
End Class
Now in your PartOfInstallation class you can do:
Public Sub CreateSensorActor()
lSensorActor.Add(New SensorActor(Me.Name)) 'Here, "Me" refers to the current PartOfInstallation instance.
End Sub
Alternatively you can make the SensorActor constructor take a PartOfInstallation instance instead, allowing you to copy any properties you like:
Public Class SensorActor
Inherits PartOfInstallation
...your code...
Public Sub New()
End Sub
Public Sub New(ByVal BasedOnPOI As PartOfInstallation)
Me.Name = BasedOnPOI.Name
End Sub
End Class
Thus making the code in the PartOfInstallation class:
Public Sub CreateSensorActor()
lSensorActor.Add(New SensorActor(Me))
End Sub
Read more about constructors: Object Lifetime: How Objects Are Created and Destroyed (Visual Basic) | Microsoft Docs
The result below, if there's room for improvement... always welcome.
SensorActor
Public Class SensorActor
Inherits PartOfInstallation
Dim sTemp As String
Public Overloads Property SystemId() As String
Get
Return Me.sSystemId
End Get
Set(ByVal value As String)
Me.sSystemId = sTemp + "." + value
End Set
End Property
Public Sub New(ByVal BasedOnPOI As PartOfInstallation)
sTemp = BasedOnPOI.SystemId
End Sub
End Class
PartOfInstallation
Public Class PartOfInstallation
Inherits EngineeringObject
'src: https://stackoverflow.com/questions/21308881/parent-creating-child-object
'src: https://stackoverflow.com/questions/16244548/how-to-create-a-list-of-parent-objects-where-each-parent-can-have-a-list-of-chil
Private lSensorActor As New List(Of SensorActor)
Public Function GetSensorActor()
Return Me.lSensorActor
End Function
Public Sub CreateSensorActor()
lSensorActor.Add(New SensorActor(Me))
End Sub
End Class
EngineeringObject
Public Class EngineeringObject
''Private declarations, alleen objecten die erven kunnen hieraan, of dmv van getters en setters
'Name of part
Private sName As String = "Naam"
'81346 Id's
Friend sSystemId As String = "Functie" 'VentilationSystem, Pumpsystem
Private sLocationId As String = "Locatie" 'Room 0.0
Private sObjectId As String = "Object" 'Fan, Pump
'General
Private sPartNumber As String
Private sLinkToDatasheet As String
'Property's
Public Property Name() As String
Get
Return sName
End Get
Set(ByVal value As String)
sName = value
End Set
End Property
Public Property SystemId() As String
Get
Return sSystemId
End Get
Set(ByVal value As String)
sSystemId = "=" + value
End Set
End Property
Public Property PartNumber() As String
Get
Return sPartNumber
End Get
Set(ByVal value As String)
sPartNumber = value
End Set
End Property
Public Property LinkToDatasheet() As String
Get
Return sLinkToDatasheet
End Get
Set(ByVal value As String)
sLinkToDatasheet = value
End Set
End Property
Public Sub New()
End Sub
End Class
Related
Interface with subProject
Hy, Can I create an interface with a sub-project? Public Interface IDraft Property LienVue() As String End Interface Public Class C2018 Implements IDraft Private m_LienVue As String Sub New(Optional ByVal LienVue As String = "") m_LienVue = LienVue End Sub Property LienVue() As String Implements IDraft.LienVue Get Return getlienvue() End Get Set(value As String) m_LienVue = value End Set End Property Private Function getlienvue() As String Return "xxxxxxxx" End Function End Class The c2018 class is in a sub-project of my main project. The goal is to add a reference to a different API from the main project
Refresh the design of a control with nested properties. VB.Net
I was trying to make a nested property redrawing the base (a control) of his parent property. Here is what I know: If we use the Refresh() command supposedly it should work for what I want. Just like below. Private Var_MyProperties_Parent As Integer Public Property MyProperties_Parent As Integer Get Return Var_MyProperties_Parent End Get Set(value As Class_Child) Var_MyProperties_Parent = value Refresh() End Set End Property But If I try to use it on nested properties it doesn't work, just like below. Imports System.ComponentModel Imports System.Globalization Public Class Class_ParentProperty_1 : Inherits Control Private Var_MyProperties_Parent As New Class_Child <Browsable(True)> <Description("Descrição não é necessária."), Category("Appearance")> ' Categoria da propriedade <EditorBrowsable(EditorBrowsableState.Always)> <RefreshProperties(RefreshProperties.Repaint)> Public Property MyProperties_Parent As Class_Child Get Return Var_MyProperties_Parent End Get Set(value As Class_Child) Var_MyProperties_Parent = value Refresh() End Set End Property Protected Overrides Sub OnPaint(e As PaintEventArgs) MyBase.OnPaint(e) MyBase.BackColor = MyProperties_Parent.TheMyColor MyBase.BackgroundImage = MyProperties_Parent.SimpleImage End Sub End Class <TypeConverter(GetType(Class_Child))> Public Class Class_Child : Inherits ExpandableObjectConverter <RefreshProperties(RefreshProperties.Repaint)> Private Var_TheMyColor As Color = Color.Crimson <RefreshProperties(RefreshProperties.Repaint)> Private Var_SimpleImage As Image <RefreshProperties(RefreshProperties.Repaint)> Private Var_ANumber As Integer <RefreshProperties(RefreshProperties.Repaint)> Public Property TheMyColor As Color Get Return Var_TheMyColor End Get Set(value As Color) Var_TheMyColor = value End Set End Property <RefreshProperties(RefreshProperties.Repaint)> Public Property SimpleImage As Image Get Return Var_SimpleImage End Get Set(value As Image) Var_SimpleImage = value End Set End Property <RefreshProperties(RefreshProperties.Repaint)> Public Property ANumber As Integer Get Return Var_ANumber End Get Set(value As Integer) Var_ANumber = value End Set End Property Public Overrides Function ToString() As String Return Nothing End Function End Class If someone have alternatives to me or someone can explain how can I think in other way to do it or something, I would be grateful.
vb.net No parameterless constructor defined for this object
I am download a Json libary here : http://www.pozzware.com/pozzware/Corsi/Programmazione/VB.NET/JSON%20Library.aspx This is my class on my project : Imports PW.JSON Public Class Prova Private _id As Integer Private _name As String Private _valido As Boolean Private _subObject As Prova Private _numero As Integer Private _numeroDec As Double Private _array() As String Public Property ID() As Integer Get Return _id End Get Set(ByVal value As Integer) _id = value End Set End Property Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = value End Set End Property Public Property Valido() As Boolean Get Return _valido End Get Set(ByVal value As Boolean) _valido = value End Set End Property Public Property SubObject() As Prova Get Return _subObject End Get Set(ByVal value As Prova) _subObject = value End Set End Property Public Property NumeroDec() As Double Get Return _numeroDec End Get Set(ByVal value As Double) _numeroDec = value End Set End Property Public Property Array() As String() Get Return _array End Get Set(ByVal value As String()) _array = value End Set End Property Public Sub New(ByVal ID As Integer, ByVal Name As String) _id = ID _name = Name End Sub Public Function SomeMethod() As String Return "Method: " & _id End Function End Class And this is my code : Sub PasteJsonExam() Dim strJSON As String = "{""NumeroDec"": 100.34, ""Name"": ""Nome Object"", " & _ " ""Array"": [""A"", ""E"", ""I"", ""O"", ""U""], " & _ " ""SubObject"": {""NumeroDec"": 0, ""Name"": ""Nome - SubObject"", " & _ " ""Array"": null, ""SubObject"": null, ""Valido"": false, ""ID"": 2}, " & _ " ""Valido"": true, ""ID"": 1}" Dim objprova As Prova objprova = PW.JSON.JSONHelper.StringToObject(strJSON, GetType(Prova)) MsgBox(objprova.Name) MsgBox(objprova.SubObject.Name) End Sub When i call that sub i got error : No parameterless constructor defined for this object. At this line : objprova = PW.JSON.JSONHelper.StringToObject(strJSON, GetType(Prova)) I am not an professonal in VB.net so i hope someone explain for me why i got that error and how can i fix this.
Probably StringToObject method try to create an instance of Prova. It does this by calling the default(parameterless) constructor of the type. But in the class you defined there isn't any parameterless constructor, you have only: Public Class Prova ' Other fields and methods Public Sub New(ByVal ID As Integer, ByVal Name As String) _id = ID _name = Name End Sub ' Other fields and methods End Class To let the method work you need to define a parameterless constructor like: Public Class Prova ' Other fields and methods Public Sub New() End Sub Public Sub New(ByVal ID As Integer, ByVal Name As String) _id = ID _name = Name End Sub ' Other fields and methods End Class
Well i think that the library you are using is not the best choice, but, if you want to run your program you must add a default constructor (a constructor without parameter). That's because the library probably uses Reflection This is the class with the Default Constructor: Imports PW.JSON Public Class Prova Private _id As Integer Private _name As String Private _valido As Boolean Private _subObject As Prova Private _numero As Integer Private _numeroDec As Double Private _array() As String Public Property ID() As Integer Get Return _id End Get Set(ByVal value As Integer) _id = value End Set End Property Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = value End Set End Property Public Property Valido() As Boolean Get Return _valido End Get Set(ByVal value As Boolean) _valido = value End Set End Property Public Property SubObject() As Prova Get Return _subObject End Get Set(ByVal value As Prova) _subObject = value End Set End Property Public Property NumeroDec() As Double Get Return _numeroDec End Get Set(ByVal value As Double) _numeroDec = value End Set End Property Public Property Array() As String() Get Return _array End Get Set(ByVal value As String()) _array = value End Set End Property ' This is the default constructor the library should need' Public Sub New() End Sub Public Sub New(ByVal ID As Integer, ByVal Name As String) _id = ID _name = Name End Sub Public Function SomeMethod() As String Return "Method: " & _id End Function End Class
Declare and and define Property in VB
I have two Class and I want to save my data into arrays form text box like this: Students.Name(txtID.Text-1).MathMark = txtMark.Text but I get error: Object reference not set to an instance of an object my code is: Dim StudentsNumber as Integer = txtstdnum.Text Dim Students as New StudentsInf(StudentsNumber) Students.Name(txtID.Text-1).MathMark = txtMark.Text Public Class StudentsInf Private mName() As String Sub New(ByVal StudentNumbers As Integer) ReDim mName(StudentNumbers-1) End Sub Public Property Name(ByVal Index As Integer) As LessonsMark Get Return mName(Index) End Get Set(ByVal Value As LessonsMark) mName(Index) = Value End Set End Property End Class Public Class LessonsMark Private mMathMark() As Object Public Property MathMark() As Object Get Return mMathMark End Get Set(ByVal Value As Object) mMathMark = Value End Set End Property End Class
This: Private mName() As String needs to be: Private mName() As LessonsMark then you have to create the objects in your constructor, something like: Sub New(ByVal StudentNumbers As Integer) ReDim mName(StudentNumbers - 1) For i As Integer = 0 To StudentNumbers - 1 mName(i) = New LessonsMark() Next End Sub then it looks like your LessonsMark class is declaring an array of objects when it looks like it should be just a string property: Public Class LessonsMark Private mMathMark As String Public Property MathMark As String Get Return mMathMark End Get Set(ByVal Value As String) mMathMark = Value End Set End Property End Class
Issue when implementing getter and setter from an interface
I have a class which implements another object. I set a property function for each property of the implemented object but keep getting an 'Invalid use of property' error. Here's my code: Test Sub: Sub tst() Dim a As Derived Set a = New Derived a.Base_name = "ALGO" 'Error happens when this executes End Sub Derived class module: Option Explicit Implements Base Private sec As Base Private Sub Class_Initialize() Set sec = New Base End Sub Public Property Get Base_name() As String Call sec.name End Property Public Property Let Base_name(value As String) Call sec.name(value) 'Error happens here End Property Base Class module: Private pname As String Public Property Get name() As String name = pname End Property Public Property Let name(value As String) pname = value End Property
Is this what you want? Module1 Sub tst() Dim a As Derived Set a = New Derived Debug.Print a.Base_name a.Base_name = "ALGO" Debug.Print a.Base_name End Sub Base Class Module Private pname As String Public Property Get name() As String name = pname End Property Public Property Let name(value As String) pname = value End Property Derived Class Module Option Explicit Implements Base Private sec As Base Private Sub Class_Initialize() Set sec = New Base End Sub Public Property Get Base_name() As String Base_name = sec.name End Property Public Property Let Base_name(value As String) sec.name = value End Property