Jag har en Klass "TsUppdrag" som jag sedan använder i Klassen "Tsplanering". Jag har inte läst igenom din kod speciellt långt och noggrannt, men jag ser att du använder gamla VB sättet för att hantera detta. I VS2005 är ju generic'ska listor asmidiga att använda. Kolla på System.Collections.Generic.List... Jag förstår inte riktig. Jag har labbat lite och kommit fram till att mitt problem ligger i min test kod. Du använder ju samma instans, samma objekt hela tiden och bara ändrar värdena på egenskaperna. Då är det självklart att värdena ändras i vektorn. Objektet är en referens och pekar hela tiden på samma minnesområde (heap). Du måste skapa ett nytt "upp"-objekt för varje gång du lägger till objektet i vektorn (med hjälp av new()) Sedan bör du nog använda en konstruktor för att egenskaperna i objektet ska få sina värden. Du skulle nog kanske behöva läsa på lite mer om objektorientering tror jag. Tack så mycket för svaret. Ok, jag ska försöka förklara lite. Jag kommenterar och ändrar litegrand i koden. Du skall nog gå ifrån det gamla sättet att koda. Det är inte objektorienterat och väldigt krångligt att hantera. Detta kanske hjälper: Tack så mycket för all hjälp och specielt för kod exempelena jag fått. Det konverterar du till 2.0 i VS 2005 automatiskt. När jag själv konverterade ett lagom stort projekt från 1.X till 2.0 så fick jag endast ändra på något ställen i koden efter konverteringen. Man skulle skriva på ett lite annat sätt i VS 2005 i ett visst avseende men Visual Studio sa vad som skulle skrivas istället så det var inga problem. Tanke vurpa i egen Klass?
Denna Klass är inte färdig men jag fastnade redan vid första testen.
Den har en vektor som jag döpt till "PAllaUppgifter"
Det jag har börjat testa är att lägga till poster i vektorn med sub-rutinen AddUppdrag och sedan läsa av dem genom egenskapen AllaUppdrag.
Det som händer är att alla poster innehåller samma information, den sista jag matat in.
Vad är fel i koden?
Om ni ser fler fel i koden som inte har med just detta problem så är jag tacksam för hjälp med det också.
Public Class TsUppdrag
Public Uppdrag As String
Public Ansvatig As String
Public Kontaktas As String
Public TillFrogad As Boolean = False
Public OK As Boolean = False
End Class
__________________
Public Class TsPlanering
'Minnes banken
Private PAllaUppdrag(0) As TsUppdrag
'Bearbetning av minnet PAllaUppdrag
'Skriv och läs av hela vektorn
Property AllaUppdrag()
Get
Return PAllaUppdrag
End Get
Set(ByVal Value)
ReDim PAllaUppdrag(Value.Length - 1)
PAllaUppdrag = Value
End Set
End Property
'Lägg till en post med värden
Sub AddUppdrag(ByVal Value As TsUppdrag)
If PAllaUppdrag(0) Is Nothing Then
PAllaUppdrag(0) = Value
Else
ReDim Preserve PAllaUppdrag(PAllaUppdrag.Length)
PAllaUppdrag(PAllaUppdrag.Length - 1) = Value
End If
End Sub
'Radera alla väredn
Sub DelUppdrag()
ReDim PAllaUppdrag(0)
PAllaUppdrag(0) = Nothing
End Sub
'Radera en känd post i PAllaUppdrag
Function DelUppdragsPost(ByVal Value As Integer) As Boolean
If PAllaUppdrag.Length > Value Then
PAllaUppdrag(Value).Uppdrag = ""
PAllaUppdrag(Value).Ansvatig = ""
PAllaUppdrag(Value).Kontaktas = ""
PAllaUppdrag(Value).TillFrogad = False
PAllaUppdrag(Value).OK = False
Return True
Else
MessageBox.Show("Uppgiften kunde ej utföras!" & vbCrLf & "(Function DelUppdragPost har felaktigt värde)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
End If
End Function
'Ändra känd post i PAllaUppdrag
Function AddUppdragsPost(ByVal Value As Integer, ByVal Post As TsUppdrag) As Boolean
If PAllaUppdrag.Length > Value Then
PAllaUppdrag(Value) = Post
Return True
Else
MessageBox.Show("Uppgiften kunde ej utföras!" & vbCrLf & "(Function AddUppdragPost har felaktigt värde)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
End If
End Function
'Läs från känd post i PAllaUppdrag
Function ReadUppdragsPost(ByVal Value As Integer) As TsUppdrag
If PAllaUppdrag.Length > Value Then
Return PAllaUppdrag(Value)
Else
MessageBox.Show("Uppgiften kunde ej utföras!" & vbCrLf & "(Function ReadUppdragPost har felaktigt värde)", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return Nothing
End If
End Function
End Class
__________________
Och till sist koden jag använder för att testa det hela
__________________
'testknapp2
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
MsgBox("Detta är en text knapp för egna klasserna ""TsUppdrag"" & ""TsPlanering"".")
Dim Upp As New TScontroler.TsUppdrag
Dim post As New TScontroler.TsUppdrag
Dim Plan As New TScontroler.TsPlanering
Upp.Uppdrag = "Städa"
Upp.Ansvatig = "Torgny"
Upp.Kontaktas = "0123-456789"
Upp.TillFrogad = True
Plan.AddUppdrag(Upp)
MsgBox("Fösta kollen")
For Each post In Plan.AllaUppdrag
MsgBox(post.Uppdrag & vbCrLf & post.Ansvatig & vbCrLf & post.Kontaktas & vbCrLf & post.TillFrogad & vbCrLf & post.OK)
Next
Upp.Uppdrag = "Sång"
Upp.Ansvatig = "Eva"
Upp.Kontaktas = "0123-456789"
Upp.TillFrogad = False
Plan.AddUppdrag(Upp)
MsgBox("Andra kollen")
For Each post In Plan.AllaUppdrag
MsgBox(post.Uppdrag & vbCrLf & post.Ansvatig & vbCrLf & post.Kontaktas & vbCrLf & post.TillFrogad & vbCrLf & post.OK)
Next
Upp.Uppdrag = "Dans"
Upp.Ansvatig = "Christer"
Upp.Kontaktas = ""
Upp.TillFrogad = True
Upp.OK = True
Plan.AddUppdrag(Upp)
MsgBox("Tredje kollen")
For Each post In Plan.AllaUppdrag
MsgBox(post.Uppdrag & vbCrLf & post.Ansvatig & vbCrLf & post.Kontaktas & vbCrLf & post.TillFrogad & vbCrLf & post.OK)
Next
End Sub
___________________
Tack från Torgny
Sv: Tanke vurpa i egen Klass?
.NET har ju collections och arraylist etc som du med fördel skall använda istället. Vill du skräddarsy en egen collection class kan du ärva ner collectionbase eller någon av de andra basklasserna och bygga ut därifrån.
Du hittar allt detta under System.Collections namespacet.Sv:Tanke vurpa i egen Klass?
Sv:Tanke vurpa i egen Klass?
Skulle du kunna förklara med ett litet kod exempel.
Vad för fördelar blir det om jag gårifrån det "gammla" settet att koda.
TorgnySv: Tanke vurpa i egen Klass?
Jag laddar variabeln "Upp" med värden och sender dom till "Plan" som har en vektor att lagra värdena i.
När jag sedan återanvänder "Upp" och laddar in nya värden i "Upp" ändras inte bara dessa utan också de som finns i vekorn i "Plan".
Vad kommer detta sig, Är inte dessa variabler två skilda lagringsplatser med information?
Hur förhindrar jag det?
(Jag uppteckte detta när jag provade att inte återanvända "upp", då fungerade det som väntat)
mvh
TorgnySv:Tanke vurpa i egen Klass?
Sv: Tanke vurpa i egen Klass?
Jo jag vet att jag har mycket kvar att lära, därför tackar jag dej och alla andra här som är mina lärare som jag kan rådfråga.
Jimmy skulle du kunna skriva lite ex.kod med new() sedan låvar jag att jag ska slå upp och läsa om de övriga begreppen, konstruktor & objektorjentering. Jag hoppas att konstruktor finns i registret på min bok, objektorgentering gör det det vet jag för där har jag läst endel.
Tack alla lärare
TorgnySv: Tanke vurpa i egen Klass?
' Här skapas en ny instans eller ett nytt objekt av TsUppdrag klassen. Du reserverar plats i minnesområdet i och med detta. Det du bör göra här är att endast deklarera en variabel av typen TsUppdrag och inte skapa själva instansen/objektet ännu. "Bara för att man köper ett garage så måste ju inte bilen följa med direkt" har man hört några gånger i dessa sammanhang. Ny kod är markerad med "***"
'Dim Upp As New TScontroler.TsUppdrag - Kommenterar ut din kod här
Dim Upp as TSControler.TsUppdrag '***Endast variabeldekleration av typen TsUppdrag
Dim post As New TScontroler.TsUppdrag
Dim Plan As New TScontroler.TsPlanering
Upp = new TsUppdrag() '***En ny instans/nytt objekt skapas av klassen TsUppdrag.
'Nytt minnesområde.
' Här nedan skulle du istället ha använt en egen konstruktor för att sätta värden på
'objektets egenskaper/properties (Uppdrag, Ansvarig, Kontaktas, Tillfrogad). Läs om detta.
Upp.Uppdrag = "Städa"
Upp.Ansvatig = "Torgny"
Upp.Kontaktas = "0123-456789"
Upp.TillFrogad = True
'Här sätter du in det objektet du precis skapade och i vektorn så refererar du till det
'minnesområdet. Torgny-objektet är på denna plats.
Plan.AddUppdrag(Upp) MsgBox("Fösta kollen")
For Each post In Plan.AllaUppdrag
MsgBox(post.Uppdrag & VbCrLf & post.Ansvatig & VbCrLf & post.Kontaktas & VbCrLf & post.TillFrogad & VbCrLf & post.OK)
Next
'***En ny instans/nytt objekt skapas av klassen TsUppdrag. Nytt minnesområde.
Upp = new TsUppdrag()
Upp.Uppdrag = "Sång"
Upp.Ansvatig = "Eva"
Upp.Kontaktas = "0123-456789"
Upp.TillFrogad = False
Plan.AddUppdrag(Upp) 'Här sätter du in Eva-objektet som referar till ett annat minnesområde
MsgBox("Andra kollen")
For Each post In Plan.AllaUppdrag
MsgBox(post.Uppdrag & VbCrLf & post.Ansvatig & VbCrLf & post.Kontaktas & VbCrLf & post.TillFrogad & VbCrLf & post.OK)
Next
'***En ny instans/nytt objekt skapas av klassen TsUppdrag. Nytt minnesområde.
Upp = new TsUppdrag()
Upp.Uppdrag = "Dans"
Upp.Ansvatig = "Christer"
Upp.Kontaktas = ""
Upp.TillFrogad = True
Upp.OK = True
'Slutligen sätts även Christer-objektet in som referar till ett annat minnesområde.
Plan.AddUppdrag(Upp) MsgBox("Tredje kollen")
For Each post In Plan.AllaUppdrag
MsgBox(post.Uppdrag & VbCrLf & post.Ansvatig & VbCrLf & post.Kontaktas & VbCrLf & post.TillFrogad & VbCrLf & post.OK)
Next
Hoppas att det klarnade lite. Objektorienteringen är den svåraste biten tycker jag, tar tid att greppa allting.
Sv: Tanke vurpa i egen Klass?
Om du vill spara instanser av klasser i en lista skall du använda dig av en klass som sparar de andra klasserna. Självklart kan du ha en array och ReDim den hela tiden, men det finns inga direkta fördelar med detta. Det blir svårt att hantera denna lista och utföra operationer på den. Helt enkelt mer att hålla reda på.
I C++ använder man ofta dynamiska listor, vilket innebär att ett objekt länkas till ett annat etc. Fördelen med denna implementation är att du inte behöver ändra storleken på arrayer och flytta data från en plats till en annan, utan kan snabbt och enkelt lägga till och ta bort samt flytta på data i listan.
Vilken version av VB.NET skriver du i?
Du kan hitta ett litet exempel på hur du kan ärva från en arraylist och göra din egna klass på http://aspnet.4guysfromrolla.com/articles/102302-1.2.aspx. Du behöver bara ta exempel från sektionerna där en egen implementation av UserCollection skapas.Sv: Tanke vurpa i egen Klass?
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox("Detta är en text knapp för egna klasserna ""TsUppdrag"" & ""TsPlanering"".")
Dim Uppdrag As TScontroler.TsUppdrag
Dim Plan As New TScontroler.TsPlanering
Uppdrag = New TsUppdrag
With Uppdrag
.Uppdrag = "Städa"
.Ansvatig = "Torgny"
.Kontaktas = "0123-456789"
.TillFrogad = True
End With
Plan.Add(Uppdrag)
MsgBox("Fösta kollen")
For Each Uppdrag In Plan
With Uppdrag
MsgBox(.Uppdrag & vbCrLf & _
.Ansvatig & vbCrLf & _
.Kontaktas & vbCrLf & _
.TillFrogad & vbCrLf & _
.OK)
End With
Next
Uppdrag = New TsUppdrag
With Uppdrag
.Uppdrag = "Sång"
.Ansvatig = "Eva"
.Kontaktas = "0123-456789"
.TillFrogad = False
End With
Plan.Add(Uppdrag)
MsgBox("Andra kollen")
For Each Uppdrag In Plan
With Uppdrag
MsgBox(.Uppdrag & vbCrLf & _
.Ansvatig & vbCrLf & _
.Kontaktas & vbCrLf & _
.TillFrogad & vbCrLf & _
.OK)
End With
Next
Uppdrag = New TsUppdrag
With Uppdrag
.Uppdrag = "Dans"
.Ansvatig = "Christer"
.Kontaktas = ""
.TillFrogad = True
.OK = True
End With
Plan.Add(Uppdrag)
MsgBox("Tredje kollen")
For Each Uppdrag In Plan
With Uppdrag
MsgBox(.Uppdrag & vbCrLf & _
.Ansvatig & vbCrLf & _
.Kontaktas & vbCrLf & _
.TillFrogad & vbCrLf & _
.OK)
End With
Next
End Sub
Public Class TsUppdrag
Public Uppdrag As String
Public Ansvatig As String
Public Kontaktas As String
Public TillFrogad As Boolean = False
Public OK As Boolean = False
End Class
Public Class TsPlanering
Inherits System.Collections.CollectionBase
'Lägg till en post med värden
Sub Add(ByVal Value As TsUppdrag)
List.Add(Value)
End Sub
'Radera en känd post i PAllaUppdrag
Function Del(ByVal Index As Integer) As Boolean
If Index > 0 And Index < List.Count Then
list.RemoveAt(Index)
Return True
Else
Return False
End If
End Function
'Ändra känd post i PAllaUppdrag
Function Update(ByVal Index As Integer, ByVal Post As TsUppdrag) As Boolean
If Index > 0 And Index < List.Count Then
list.Item(Index) = Post
Return True
Else
Return False
End If
End Function
'Läs från känd post i PAllaUppdrag
Function ReadUppdragsPost(ByVal Index As Integer) As TsUppdrag
If Index > 0 And Index < List.Count Then
Return list.Item(Index)
Else
Return Nothing
End If
End Function
End Class
End Class
Sv: Tanke vurpa i egen Klass?
Jag tycker det många ggr är lättare att läsa kod än förstå en förklarande text pga. att jag inte har lärt mej alla begrepp än.
Det frågades efter vilken verition av VB.net jag använder, jag har visualstudio 2003 student och lärarutgåva med 1.1 dotnet, med bara VB.net instalerat
En följdfråga på detta kan jag uppgradera till dotnet 2.0 ,hur gör jag om det går, vad händer med mina gammla projekt måste jag skriva om den koden?
mvh
TorgnySv:Tanke vurpa i egen Klass?