Programm funktioniert nur einmalig

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von MarvinKleinMusic.

    Programm funktioniert nur einmalig

    Hallo zusammen,

    Ich habe heute eine E-Mail bekommen, dass mein Programm bei dem User nicht mehr funktioniert. Es funktioniert einmalig, bis der Computer neugestartet wird. Anschließend erhält der User folgende Fehlermeldung:

    VB.NET-Quellcode

    1. ​See the end of this message for details on invoking
    2. just-in-time (JIT) debugging instead of this dialog box.
    3. ************** Exception Text **************
    4. System.FormatException: Input string was not in a correct format.
    5. at Microsoft.VisualBasic.CompilerServices.Conversions.ParseDouble(String Value, NumberFormatInfo NumberFormat)
    6. at Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble(String Value, NumberFormatInfo NumberFormat)
    7. ************** Loaded Assemblies **************
    8. mscorlib
    9. Assembly Version: 4.0.0.0
    10. Win32 Version: 4.6.127.1 built by: NETFXREL3STAGE
    11. CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
    12. ----------------------------------------
    13. Sownloader
    14. Assembly Version: 6.0.2.0
    15. Win32 Version: 6.0.2
    16. CodeBase: file:///C:/Users/User/Desktop/Sownloader.exe
    17. ----------------------------------------
    18. Microsoft.VisualBasic
    19. Assembly Version: 10.0.0.0
    20. Win32 Version: 14.6.79.0 built by: NETFXREL2
    21. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
    22. ----------------------------------------
    23. System
    24. Assembly Version: 4.0.0.0
    25. Win32 Version: 4.6.1081.0 built by: NETFXREL3STAGE
    26. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    27. ----------------------------------------
    28. System.Core
    29. Assembly Version: 4.0.0.0
    30. Win32 Version: 4.6.79.0 built by: NETFXREL2
    31. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
    32. ----------------------------------------
    33. System.Windows.Forms
    34. Assembly Version: 4.0.0.0
    35. Win32 Version: 4.6.79.0 built by: NETFXREL2
    36. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    37. ----------------------------------------
    38. System.Drawing
    39. Assembly Version: 4.0.0.0
    40. Win32 Version: 4.6.1068.2 built by: NETFXREL3STAGE
    41. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    42. ----------------------------------------
    43. System.Runtime.Remoting
    44. Assembly Version: 4.0.0.0
    45. Win32 Version: 4.6.79.0 built by: NETFXREL2
    46. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
    47. ----------------------------------------
    48. System.Configuration
    49. Assembly Version: 4.0.0.0
    50. Win32 Version: 4.6.79.0 built by: NETFXREL2
    51. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    52. ----------------------------------------
    53. System.Xml
    54. Assembly Version: 4.0.0.0
    55. Win32 Version: 4.6.1064.2 built by: NETFXREL3STAGE
    56. CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    57. ----------------------------------------
    58. ************** JIT Debugging **************
    59. To enable just-in-time (JIT) debugging, the .config file for this
    60. application or computer (machine.config) must have the
    61. jitDebugging value set in the system.windows.forms section.
    62. The application must also be compiled with debugging
    63. enabled.
    64. For example:
    65. <configuration>
    66. <system.windows.forms jitDebugging="true" />
    67. </configuration>
    68. When JIT debugging is enabled, any unhandled exception
    69. will be sent to the JIT debugger registered on the computer
    70. rather than be handled by this dialog box.


    Bei mir funktioniert es einwandfrei. DLL's sind alle vorhanden, auch die vom Programm erstellten Dateien sind alle vorhanden und weisen richtige Werte auf.

    Woran kann das liegen?

    LG Marvin
    Das ist ja das merkwürdige, überall funktioniert es.

    Hier ist mal der Code:

    VB.NET-Quellcode

    1. ​Imports System.Net
    2. Imports System.IO
    3. Public Class welcome
    4. Private currentversion_DownloadString_Client As New WebClient
    5. Private Version As String = Application.ProductVersion.ToString
    6. Private iniPath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Sownloader/config.ini")
    7. Private inidatei As New INIDatei
    8. Private logpfad As String = Path.Combine(Application.StartupPath, "sownloader.log")
    9. Private creationMessage1 As String = "Created directory: covers -- " & Date.Now & vbCrLf
    10. Private creationMessage2 As String = "Created directory: %appdata%\Sownloader -- " & Date.Now & vbCrLf
    11. Private creationMessage3 As String = "Extract Supdater.zip -- " & Date.Now & vbCrLf
    12. Private creationMessage4 As String = "Update Supdater -- " & Date.Now & vbCrLf
    13. Private downloadMessage1 As String = "Update version information was succussful:"
    14. Private downloadMessage2 As String = "Update version information failed:"
    15. Private Sub welcome_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    16. If Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Sownloader")) = False Then
    17. 'Create Sownloader folder in %appdata%
    18. Directory.CreateDirectory(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Sownloader"))
    19. My.Computer.FileSystem.WriteAllText(logpfad, creationMessage2, True)
    20. End If
    21. If Directory.Exists(Path.Combine(Application.StartupPath, "covers")) = False Then
    22. Directory.CreateDirectory(Path.Combine(Application.StartupPath, "covers"))
    23. My.Computer.FileSystem.WriteAllText(logpfad, creationMessage1, True)
    24. End If
    25. lblVersion.Text = Application.ProductVersion.ToString
    26. 'Look for an update
    27. DownloadVersionString()
    28. End Sub
    29. #Region "Search-Update"
    30. 'UpdateString
    31. Private Sub DownloadVersionString()
    32. If currentversion_DownloadString_Client.IsBusy = False Then
    33. Using currentversion_DownloadString_Client As New WebClient
    34. currentversion_DownloadString_Client.Proxy = Nothing
    35. Try
    36. currentversion_DownloadString_Client.Headers("User-Agent") = "Mozilla/4.0"
    37. currentversion_DownloadString_Client.DownloadStringAsync(New Uri("http://sownloader.com/version.txt"))
    38. AddHandler currentversion_DownloadString_Client.DownloadStringCompleted, AddressOf currentversion_DownloadString_Client_DownloadCompleted
    39. Catch ex As Exception
    40. 'Error report
    41. My.Computer.FileSystem.WriteAllText(logpfad, downloadMessage2 & ex.ToString & "--" & Date.Now & vbCrLf, True)
    42. End Try
    43. End Using
    44. Else : End If
    45. End Sub
    46. Private Sub currentversion_DownloadString_Client_DownloadCompleted(sender As Object, e As DownloadStringCompletedEventArgs)
    47. If e.Error IsNot Nothing Then
    48. 'Error
    49. Else
    50. lblStatus.Text = "Updating version information..."
    51. 'Write versions into inifile
    52. inidatei.Pfad = iniPath
    53. inidatei.WertSchreiben("Information", "version", Version)
    54. inidatei.WertSchreiben("Information", "latestVersion", e.Result())
    55. My.Computer.FileSystem.WriteAllText(logpfad, downloadMessage1 & e.Result() & "-- " & Date.Now & vbCrLf, True)
    56. 'Suche nach dem Supdater.exe
    57. If File.Exists(Path.Combine(Application.StartupPath, "Supdater.exe")) = False Then
    58. Dim updatelaunch As Object = My.Resources.Supdater
    59. File.WriteAllBytes("Supdater.zip", CType(updatelaunch, Byte()))
    60. Try
    61. lblStatus.Text = "Extract updater..."
    62. 'Extract Supdater.exe
    63. Dim cu As New ClassUnzip(Path.Combine(Application.StartupPath, "Supdater.zip"), Application.StartupPath)
    64. AddHandler cu.UnzipFinishd, AddressOf Unziped
    65. cu.UnzipNow()
    66. My.Computer.FileSystem.WriteAllText(logpfad, creationMessage3, True)
    67. Catch ex As Exception
    68. End Try
    69. Else
    70. Dim path_up As String = Path.Combine(Application.StartupPath, "Supdater.exe")
    71. Dim version As FileVersionInfo = FileVersionInfo.GetVersionInfo(path_up)
    72. Dim productVer As String = version.ProductVersion.ToString
    73. 'Update Supdater
    74. If (CDbl(productVer) < CDbl("1.1.0")) Then
    75. lblStatus.Text = "Updating updater..."
    76. Dim updatelaunch As Object = My.Resources.Supdater
    77. File.WriteAllBytes("Supdater.zip", CType(updatelaunch, Byte()))
    78. 'Extract Supdater.exe
    79. Dim cu As New ClassUnzip(Path.Combine(Application.StartupPath, "Supdater.zip"), Application.StartupPath)
    80. AddHandler cu.UnzipFinishd, AddressOf Unziped
    81. cu.UnzipNow()
    82. My.Computer.FileSystem.WriteAllText(logpfad, creationMessage4, True)
    83. End If
    84. End If
    85. lblStatus.Text = "Loading..."
    86. If inidatei.WertLesen("Information", "skipVersion") = Nothing Then
    87. inidatei.WertSchreiben("Information", "skipVersion", "1.0.0")
    88. End If
    89. If CInt(Version.Replace(".", "")) < CInt(e.Result().Replace(".", "")) Then
    90. If CInt(e.Result().Replace(".", "")) = CInt(inidatei.WertLesen("Information", "skipVersion").Replace(".", "")) Then
    91. 'No Update message
    92. TimerLoad.Enabled = True
    93. Else
    94. Process.Start(Path.Combine(Application.StartupPath, "Supdater.exe"))
    95. TimerLoad.Enabled = True
    96. End If
    97. Else
    98. TimerLoad.Enabled = True
    99. End If
    100. End If
    101. End Sub
    102. #End Region
    103. Private Sub TimerLoad_Tick(sender As Object, e As EventArgs) Handles TimerLoad.Tick
    104. Me.Hide()
    105. Sownloader.Show()
    106. End Sub
    107. Private Sub Unziped()
    108. File.Delete(Path.Combine(Application.StartupPath, "Supdater.zip"))
    109. TimerLoad.Enabled = True
    110. End Sub
    111. End Class


    Um welchen Input handelt es sich denn?
    Schau mal Zeile 80. Wie soll das jemals ein gültiger Double-Wert sein? Was kommt bei Dir dabei raus? Der ganze Code ist ziemlich ranzig.

    Bezogen auf diese spezifische Fehlermeldung tippe ich darauf, dass es Probleme mit dem Dezimalpunkt, bzw. Dezimalkomma gibt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Das .NET-Framework bietet Dir eine Menge nützlicher Datentypen an, um in den verschiedensten Bereichen damit zu arbeiten.
    Hier könnte man wunderschön System.Version verwenden, um die Versionen zu repräsentieren. Stattdessen nutzt Du allerdings einfach Strings, konvertierst diese u. a. in Double, um diese dann zu vergleichen. Dieses System ist unsauber und unflexibel.
    Stattdessen würde ja Application.ProductVersion schon eine verwertbare System.Version-Instanz enthalten, die man wunderbar vergleichen kann, weil Microsoft die Operatoren überladen hat.

    Generell gibt's natürlich noch mehr: Option Strict Off, My-Namespace, redundante Teile in Abfragen, UI und Funktionalität nicht sauber getrennt, Timer, wildes Konvertieren von Datentypen, etc.
    Jedenfalls würde eine saubere Architektur und ein ausgeklügeltes Versionierungssystem Dein Problem relativ schnell beseitigen. Du kannst das natürlich anders beheben, aber das Grundsystem bleibt unflexibel und unschön. Wenn's dann mal Erweiterungen geben soll, musste das alles neu schreiben.

    Ich weiß auch nicht, wie "SUpdater.exe" funktioniert, aber es ist ja durchaus möglich, dass Binaries unverifiziert aus dem Internet geladen und ausgeführt werden, was ein Einfallstor für Malware ist. Daher auch mal präventiv: Updater - Warum sollte man eigene Updater vermeiden?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @VB1963 Ich denke, es geht um diese Zeile hier: Dim updatelaunch As Object = My.Resources.Supdater
    Das müsste doch spätes Binden sein, oder so ähnlich? Kann aber auch sein, dass ich mich irre. Jedenfalls ist das ja direkt ein ​Byte().

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Sorry, das ist ja 'ne direkte Zuweisung (Easy Binding). Ich hatte da was falsches im Kopf, was auch mit ​Object zu tun hatte.
    Ja, das geht natürlich.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @MarvinKleinMusic Ein paar Anmerkungen:
    • Der 1. Befehl in der Prozedur TimerLoad_Tick sollte sein:

      VB.NET-Quellcode

      1. TimerLoad.Enabled = False
      (ich hab das mit ner MessageBox getestet).
    • Mach Dir die Mühe und erstell eine Vergleichsfunktion für Versionsnummern mit dem Aufruf

      VB.NET-Quellcode

      1. Dim ver As FileVersionInfo = FileVersionInfo.GetVersionInfo(Application.ExecutablePath)
      kommst Du an alle Teile der Version ran:

    • Wenn Du einen Haltepunkt in die Prozedur currentversion_DownloadString_Client_DownloadCompleted machst und sie schrittweise abarbeitest, findest Du ganz fix die Zeile, die Dein Programm beendet. Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @MarvinKleinMusic Ein paar Anmerkungen:
    • Der 1. Befehl in der Prozedur TimerLoad_Tick sollte sein:

      VB.NET-Quellcode

      1. TimerLoad.Enabled = False
      (ich hab das mit ner MessageBox getestet).
    • Mach Dir die Mühe und erstell eine Vergleichsfunktion für Versionsnummern mit dem Aufruf

      VB.NET-Quellcode

      1. Dim ver As FileVersionInfo = FileVersionInfo.GetVersionInfo(Application.ExecutablePath)
      kommst Du an alle Teile der Version ran:
      vb-paradise.de/index.php/Attac…5e5bd2a3b0f04060a0e399c3b
    • Wenn Du einen Haltepunkt in die Prozedur currentversion_DownloadString_Client_DownloadCompleted machst und sie schrittweise abarbeitest, findest Du ganz fix die Zeile, die Dein Programm beendet. Gugst Du hier.


    Hallo RodFromGermany,

    Zu 1:
    Der Timer ist standardmäßig über die Eigenschaften deaktiviert. Er soll ja aktiviert werden, sobald alle Überprüfungen abgeschlossen sind.
    EDIT: Vergiss diesen Punkt, habe gerade gesehen, was du meinst ;)

    Zu 2:
    Benutze ich diese Methode nicht schon längst?

    VB.NET-Quellcode

    1. Dim path_up As String = Path.Combine(Application.StartupPath, "Supdater.exe")
    2. Dim version As FileVersionInfo = FileVersionInfo.GetVersionInfo(path_up)
    3. Dim productVer As String = version.ProductVersion.ToString


    Der Sinn der Abfrage ist, dass das Programm, welches Überprüft wird in dem Programm, wo die Überprüfung stattfindet immer in einer neuen Version enthalten ist (sofern ein User das Update manuell über die Webseite runterlädt). Wenn dann die Versionsnummer des zu Überprüfenden Programms kleiner als die angegebene im aktuellen Programm ist, wird die alte Datei aus den Ressourcen des laufenden Programms überschrieben.

    Das Problem lag wirklich an der double Abfrage. Aber warum hat der Code an meinem PC einwandfrei funktioniert, aber bei der anderen Person nicht? Auf beiden Rechner ist die aktuelle Windows 10 Version installiert.

    Das Problem habe ich nun wie folgt gelöst:

    VB.NET-Quellcode

    1. If CInt(productVer.Replace(".", "")) < CInt("110") Then


    LG Marvin

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

    Hast Du Post 6 überhaupt gelesen?
    Und das Problem könnte evtl. in unterschiedlichen Kulturen liegen. Grade deswegen solltest Du das System ändern.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Vollzitat entfernt. ~Trade

    Nun mal einige Fragen zurück:

    Wie kommt hier jeder dadrauf, dass ich Option Strict auf Off habe? Ich habe Option Strict sehr wohl auf On gestellt. Projekt->Eigenschaften->Kompilieren->Option Strict->On.

    Was ist daran schlecht, wenn ich den My-Namespace verwende? Er ist einfach zu nutzen, und wie soll ich sonst das Programm im Programm mitliefern, wenn nicht mit My.Ressources?

    Was meinst du mit redundante Teile in Abfragen?

    Wie soll ich sonst die UI und Funktionalität sauber trennen? Er soll ja immer am Anfang einer Funktion mitteilen, was gerade gemacht wird.

    Was gibt es am Timer zu meckern? Die generelle Funktion hinter dem Timer ist, dass das Logo noch ein paar Sekunden zu sehen ist.

    Wie soll ich sonst an die aktuelle Zahl kommen, wenn ich diese mit dem Webclient nur als String erhalte? Da halte ich das Replacen der Punkte und die Umwandlung zu einer Ganzzahl am sinnvollsten. Oder wie soll ich denn 1.0.0, was als String runtergeladen wird mit Application.Productversion vergleichen?

    Ich gebe ja zu, dass es sicherlich bessere Wege gibt, diese muss ich mir erstmal aber aneignen, und solange gilt: "Never change a running system". Für mich persönlich (als Anfänger), solche Posts nie besonders Hilfreich, welche mir nur irgendeine Methode um die Ohren werfen, weil ich mittels MSDN meistens nie eine sinnvolle Antwort auf meine Frage erhalte. Wenn man mir genau sagt, was falsch ist, und wie es richtig geht, wäre vielleicht auch mal ein Lerneffekt vorhanden.

    LG Marvin

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

    1. Erledigt.
    2. Ich rede nicht von den Resources, denn die sind okay, sondern von sowas hier: My.Computer.FileSystem.WriteAllText(logpfad, creationMessage3, True). Das wrappt das vorhandene Zeugs äußerst unsauber und ist daher vollkommen redundant. Stattdessen solltest Du System.IO benutzen.
    3. If File.Exists(Path.Combine(Application.StartupPath, "Supdater.exe")) = False Then wird zu If Not File.Exists(Path.Combine(Application.StartupPath, "Supdater.exe")) Then. Bei = True könnte man es z. B. weglassen.
    4. Diese Funktionalität in eine eigene Klasse auslagern, Eigenschaften, Events bzw. Patterns implementieren und dann entsprechend kommunizieren.
    5. Okay, erledigt.
    6. Schau Dir die Typen an, die Du hast. Dann findest Du u.a. das: msdn.microsoft.com/de-de/library/y0hf9t2e(v=vs.110).aspx

    MarvinKleinMusic schrieb:

    Wenn man mir genau sagt, was falsch ist, und wie es richtig geht, wäre vielleicht auch mal ein Lerneffekt vorhanden.
    Ich habe Dir ja den Tipp gegeben, dass Du System.Version verwenden sollst und dass Du auf die Sicherheit der Pakete achten musst.

    Außerdem:
    Zu Sownloader.Show() Dialoge: Instanziierung von Forms und Aufruf von Dialogen lesen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    z.B.:

    VB.NET-Quellcode

    1. Private creationMessage1 As String = "Created directory: covers -- " & Date.Now & vbCrLf

    Auch wenn es die IDE nicht bemängelt, Date.Now ist vom Datentyp Date, nicht String.
    vbCrLf ist aus dem Microsoft.VisualBasic-Namespace, also schon leicht schimmelig, nutze stattdessen das .Net Äquivalent System.Environment.NewLine.

    VB.NET-Quellcode

    1. Sownloader.Show()

    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    :rolleyes:

    Pasta schrieb:

    Auch wenn es die IDE nicht bemängelt, Date.Now ist vom Datentyp Date, nicht String.
    Ja, das macht aber nichts. Beachte den &-Operator, der das automatisch konvertiert.
    vbCrLf ist nur eine Konstante und daher okay. Allerdings ist Environment.NewLine natürlich moderner und plattformunabhängig.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:


    2. Ich rede nicht von den Resources, denn die sind okay, sondern von sowas hier: My.Computer.FileSystem.WriteAllText(logpfad, creationMessage3, True). Das wrappt das vorhandene Zeugs äußerst unsauber und ist daher vollkommen redundant. Stattdessen solltest Du System.IO benutzen.
    Erledigt.
    3. If File.Exists(Path.Combine(Application.StartupPath, "Supdater.exe")) = False Then wird zu If Not File.Exists(Path.Combine(Application.StartupPath, "Supdater.exe")) Then. Bei = True könnte man es z. B. weglassen.
    Erledigt.
    4. Diese Funktionalität in eine eigene Klasse auslagern, Eigenschaften, Events bzw. Patterns implementieren und dann entsprechend kommunizieren.
    Soetwas habe ich noch nie gemacht. Könntest du mir mal ein Beispiel geben, wie soetwas sauber gemacht wird?
    6. Schau Dir die Typen an, die Du hast. Dann findest Du u.a. das: msdn.microsoft.com/de-de/library/y0hf9t2e(v=vs.110).aspx
    Hier ist wieder das Problem mit MSDN. Ich sehe dort lediglich wie ich es importieren kann, sowie die Ausnahmen. Allerdings keinerlei Methoden oder irgendwelche Hinweise darauf, wie ich diese Funktion sinnvoll einsetzen kann.


    Siehe fett.

    MarvinKleinMusic schrieb:

    Könntest du mir mal ein Beispiel geben, wie soetwas sauber gemacht wird?
    Naja, Beispiel wäre etwas zu umfangreich. Du kannst halt 'ne Klasse machen, die das Zeugs für Dich übernimmt, was Du da hast. Heißt Du lagerst den Teil halt in 'ne Methode aus und schmeißt Events, die Du im UI-Codebehind behandeln kannst.

    MarvinKleinMusic schrieb:

    Allerdings keinerlei Methoden oder irgendwelche Hinweise darauf, wie ich diese Funktion sinnvoll einsetzen kann.
    Das klingt stark nach fehlenden Grundlagen. Wenn Du Dir dann so ein Objekt erzeugst, kannst Du ja einfach mal dessen Methoden, Operatoren etc. anschauen, die es implementiert und zur Verfügung stellt. Dann kannst Du Dir da was basteln.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Öhm ich habe ein Problem. Ich habe jetzt das Form als neue Instanz starten lassen, sowie in der Anleitung. Doch nun sehen alle Controls beim ausführen des Programms aus, als würden sie aus Windows 95 stammen. Im Entwurfsfenster jedoch, ist alles korrekt.

    Wie behebe ich das?

    LG