HEJ! Du kan skicka med en pekare till Form1 objektet när du skapar K1 resp. K2 objekten så att du kan komma åt rätt Form1 instans. Lämpligast är väl att skapa en constructor för Class1 resp. Class2 som tar Form1 instans som argument, tilldela sedan denna inskickade instans till en medlem i Class1 resp. Class2 (t.ex. kallad parent). Syftet med objektorienterad programmering är att en klass ska vara som en liten svart HEJ! Kul med lite svar! Jo att skriva den som STATIC eller som SHARED som det verkar heta i VB löser någ detta. hmm en liten tanke bara. Varför inte ha din instans som inparameter när du skapar de andra klasserna? Tackar Johan! Har nu fått ihop något. Verkar funka bra! >Vet ej om det det är det "rätta" sättet att skriva det på? Klassfrågor, forts...
Har inte riktigt fått kläm på detta ännu...
Är det möjligt att få K1 och K2 kända i andra klasser?
Någon som har något förslag?
Att använda SHARED verkar inte rätt för då kan man inte använda den instans man har skapat.
/Alexander
<code>
Public Class Form1
Inherits System.Windows.Forms.Form
Public K1 As New Class1()
Public K2 As New Class2()
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
components = New System.ComponentModel.Container()
Me.Text = "Form1"
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
K1.K1_RUN() 'Är känd här
K2.K2_RUN() 'Är känd här
Module1.M1_Run() 'Är känd här
End Sub
End Class
Public Class Class1
Public Sub K1_RUN()
K2.K2_RUN() 'Är EJ känd här
Module1.M1_Run() 'Är känd här
End Sub
End Class
Public Class Class2
Public Sub K2_RUN()
K1.K1_RUN() 'Är EJ känd här
Module1.M1_Run() 'Är känd här
End Sub
End Class
</code>Sv: Klassfrågor, forts...
I koden för K1_RUN gör du sedan:
parent.K2.K2_RUN()
Sedan måste du göra det möjligt att komma åt just K1 och K2 instanserna, det bästa alternativet är att skapa en Property men det funkar att ha den Public som du har idag.
Hoppas detta underlättar lite!
/MattiasSv: Klassfrågor, forts...
låda för andra klasser (utom dess "barn", som ska se och ha ärvt allt). Du ska med andra ord enbart komma åt en metod i klassen ifrån en instans av klassen eller klassen själv beroende på om det är en vanlig metod eller en klassmetod.
Vad är det du vill göra synligt och varför?
/EmmaSv: Klassfrågor, forts...
Det jag funderar på är:
Att skapa en klass som bland annat skriver till en loggfil.
Denna loggklass skall alla klasser kunna komma åt.
Även sådana som går på en annan tråd. Fast då gäller det att styra upp det hela!
Men nu när jag funderar så kanske man skriver en sådan grej i en modul!?
Att skapa en instans av loggklassen i varje klass kan väl inte vara rätt?
Att då bara låta en skriva i taget blir väl inte lätt???
/AlexanderSv: Klassfrågor, forts...
Men jag tycker ändå att man borde kunna komma åt andra instansierade klasser från en klass???
Men jag tänker nog helt programmeringsfelaktigt!!!Sv: Klassfrågor, forts...
(lite C# kod)
class Logger
{
}
class Ett
{
public Ett(Logger log){}
}
class Tvao
{
public Tvao(Logger log){}
}
Sen kan du ju göra motsvarande:
Logger minLog=new Logger();
Ett itt=new Ett(minLog);
Tvao två=new Tvao(minLog);
nu kommer ju både instanserna av itt och två att jobba mot samma instans (minLog)
Nån kanske kan hjälpa till att köra över det till VB.Net om du inte förstårSv: Klassfrågor, forts...
Det känns som att det är så man skall programmera.
Skall prova det i VB och återkomma.Sv: Klassfrågor, forts...
Vet ej om det det är det "rätta" sättet att skriva det på?
Verkar vara mindre(snyggare) kod i C# för att få till det!
Någon som har bättre sätt att skriva det på i VB!!!???
Blir mycket att skicka med om man har många klasser man vill åt?
Eller skapar man då en basklass!
<code>
Imports System.Threading
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button()
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(96, 64)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 0
Me.Button1.Text = "Button1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1})
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim MinLogger As New Logger()
Dim MinK1 As New Klass1(MinLogger)
Dim MinK2 As New Klass2(MinLogger)
MinK1.Kör()
MinK2.Kör()
End Sub
End Class
Public Class Klass1
Private Log As Logger
Private MeThread As Thread
Public Sub New(ByVal InLog As Logger)
Log = InLog
Log.Skriv("K1:NEW")
End Sub
Public Sub Kör()
MeThread = New Thread(AddressOf _Kör)
MeThread.Start()
Log.Skriv("K1:KÖR")
End Sub
Private Sub _Kör()
Thread.Sleep(5000)
Log.Skriv("K1:_KÖR")
End Sub
End Class
Public Class Klass2
Private Log As Logger
Private MeThread As Thread
Public Sub New(ByVal InLog As Logger)
Log = InLog
Log.Skriv("K2:NEW")
End Sub
Public Sub Kör()
MeThread = New Thread(AddressOf _Kör)
MeThread.Start()
Log.Skriv("K2:KÖR")
End Sub
Private Sub _Kör()
Thread.Sleep(10000)
Log.Skriv("K2:_KÖR")
End Sub
End Class
Public Class Logger
Private Mut As New Mutex()
Public Sub Skriv(ByVal Text As String)
Mut.WaitOne()
MsgBox(Text)
Mut.ReleaseMutex()
End Sub
End Class
</code>Sv: Klassfrågor, forts...
>Verkar vara mindre(snyggare) kod i C# för att få till det!
Det vet jag inte, att skriva motsvarande i C# skulle se ungefär likadant ut.
>Någon som har bättre sätt att skriva det på i VB!!!???
Jag skulle använt Monitor / SyncLock ist.f. en Mutex. Annars ser väl koden helt okej ut.
MS