Programmcode vor dem Start von Form1 ausführen

  • VB.NET

Es gibt 112 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.

    DL3AD schrieb:

    warum ist die sub leer ?

    Weil deine Klasse ACB_com ja auch keinen Inhalt im Konstruktor hat. Man BRAUCHT halt einen, ob der was macht, ist allerdings egal. Wenn man selber keinen anlegt, legt der Compiler allerdsings einen an, der ist dann aber "Public" und gerade das wollen wir ja nicht.

    Wo muss der Code stehen?

    In der Klasse, die nur einmal instanziert werden darf.

    Wo muss die Klasse EsKennNurEinenGeben instanziert werden ?

    In sich selbst, das ist ja der "Trick"

    ... was ist ein Single-Instance-Pattern ?

    Ein (programmatisches) Entwurfsmuster das dafür sorgt, dass es von einer Klasse immer nur genau EINE Instanz gibt.
    ... so habe ich nun die Klasse ACB_Com geändert

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class ACB_Com
    3. Private _ACB_OK As Boolean
    4. Private _ACB_out As String
    5. Private _ACB_in As String
    6. Dim ACB_Port As New SerialPort()
    7. ReadOnly Property ACB_OK As Boolean
    8. Get
    9. Return _ACB_OK
    10. End Get
    11. End Property
    12. WriteOnly Property ACB_out As String
    13. Set(value As String)
    14. _ACB_out = value
    15. ACB_write_read()
    16. End Set
    17. End Property
    18. ReadOnly Property ACB_in As String
    19. Get
    20. Return _ACB_in
    21. End Get
    22. End Property
    23. Sub ACB_init()
    24. For Each ComPort As String In SerialPort.GetPortNames
    25. Try
    26. ACB_Port.PortName = ComPort
    27. ACB_Port.BaudRate = 9600
    28. ACB_Port.DataBits = 8
    29. ACB_Port.Parity = Parity.None
    30. ACB_Port.StopBits = StopBits.One
    31. ACB_Port.NewLine = ControlChars.Cr
    32. ACB_Port.Open()
    33. ACB_Port.WriteLine("X00")
    34. System.Threading.Thread.Sleep(50)
    35. If ACB_Port.ReadExisting = "X00" & ControlChars.Cr Then
    36. _ACB_OK = True
    37. Exit For
    38. Else
    39. ACB_Port.Close()
    40. _ACB_OK = False
    41. End If
    42. Catch ex As Exception
    43. End Try
    44. Next
    45. End Sub
    46. Sub ACB_write_read()
    47. ACB_Port.WriteLine(_ACB_out)
    48. System.Threading.Thread.Sleep(50)
    49. _ACB_in = ACB_Port.ReadExisting()
    50. System.Threading.Thread.Sleep(50)
    51. End Sub
    52. Private Shared _singleinstance As ACB_Com
    53. Private Sub New()
    54. End Sub
    55. Public Shared Function CreateInstance() As ACB_Com
    56. If _singleinstance Is Nothing Then
    57. _singleinstance = New ACB_Com
    58. End If
    59. Return _singleinstance
    60. End Function
    61. End Class



    und z.B. in der Form1 so aufgerufen

    VB.NET-Quellcode

    1. Public Class Form1
    2. ACB_com.CreateInstance
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ACBPort.ACB_init()
    5. If ACBPort.ACB_OK = False Then
    6. MessageBox.Show("ACB nicht gefunden")
    7. Me.Close()
    8. End If
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. ACBPort.ACB_out = "X00"
    12. Label1.Text = ACBPort.ACB_in
    13. End Sub
    14. End Class


    ... macht er aber nicht ???
    ... immer noch Fehler ;(

    VB.NET-Quellcode

    1. Public Class Form1
    2. ACBPort = ACB_Com.CreateInstance
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ACBPort.ACB_init()
    5. If ACBPort.ACB_OK = False Then
    6. MessageBox.Show("ACB nicht gefunden")
    7. Me.Close()
    8. End If
    9. End Sub
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. ACBPort.ACB_out = "X00"
    12. Label1.Text = ACBPort.ACB_in
    13. End Sub
    14. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DL3AD“ ()

    Hallo,

    ich möchte eine Meldung ausgeben, dass mache ich mit

    VB.NET-Quellcode

    1. MessageBox.Show("Ref Rotor")


    Nun möchte ich dass wenn der Vorgang abgeschlossen ist, dass sich die MessageBox wieder selbst schließt bzw. mit einem Button die Aktion abbrechen können.
    Welche Möglichkeiten habe ich da ?

    DL3AD schrieb:

    Welche Möglichkeiten habe ich da ?

    Keine ;)

    Die Standard Messagebox blockiert das Programm (na ja den UI-Thread) und wartet darauf dass der Benutzer was tut. Wenn du was anderes willst musst du dir halt selber ne Form bauen, die dir als Messagebox dient und die mehr Funktionen hat. Ich meine sogar, hier im Forum gibts ein paar Sourcen dafür.

    EDIT zb hier: [Sonstige/Allgemein] Timeout für msgbox