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.

    Hast Du Application.EnableVisualStyles() aufgerufen?

    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 :!:
    Habe das Problem behoben. Meine Maus ist defekt und klickt leider manchmal 3mal am Stück. Daraufhin wurde ausversehen die Funktion "Visuelle XP-Stile" deaktiviert.

    Trade schrieb:

    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.


    Ich verstehe immer noch nicht ganz, wie das für mich hilfreich sein soll. Wie ich eine Klasse erstelle weiß ich ja, aber dann ist der Code doch dort vorhanden anstatt im Event der Form. Ein kleines Beispiel wäre wirklich schon sehr Hilfreich. Es muss ja nichts weltbewegendes sein.

    LG Marvin

    MarvinKleinMusic schrieb:

    VB.NET-Quellcode

    1. If CInt(productVer.Replace(".", "")) < CInt("110") Then
    CInt("110")
    What :?:
    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!
    Ich habe mir interessehalber, mal die Version() Klasse angeguckt, ist nix kompliziertes.

    Version() Test

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim exePath As String = Application.ExecutablePath
    4. Dim exeVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(exePath)
    5. Dim exeVersion As New Version(exeVersionInfo.ProductVersion)
    6. Dim newVersion As New Version("1.0.0.0")
    7. If exeVersion.Equals(newVersion) Then
    8. ' mach was
    9. End If
    10. Select Case exeVersion
    11. Case = newVersion
    12. ' mach was
    13. Case > newVersion
    14. ' mach was
    15. Case < newVersion
    16. ' mach was
    17. End Select
    18. Dim lv As New ListView
    19. lv.View = View.List
    20. lv.Dock = DockStyle.Fill
    21. Me.Controls.Add(lv)
    22. Dim ver As New Version
    23. ver = exeVersion
    24. With lv.Items
    25. .Add("Version " & ver.ToString)
    26. .Add("Major " & ver.Major.ToString)
    27. .Add("MajorRevision " & ver.MajorRevision.ToString)
    28. .Add("Minor " & ver.Minor.ToString)
    29. .Add("MinorRevision " & ver.MinorRevision.ToString)
    30. .Add("Revision " & ver.Revision.ToString)
    31. .Add("Build " & ver.Build.ToString)
    32. End With
    33. End Sub
    34. End Class


    @ Trade
    Deine Einwände sind technisch gesehen, natürlich richtig, es geht doch aber darum, sauber zu programmieren und sich eben nicht auf die IDE zu verlassen, oder etwa nicht !?
    Ich versuche zumindest, "Option Strict On u.s.w. im Kopf zu aktivieren" und das geht nur durch konsequentes einhalten.
    Wer sich z.B. nicht um Datentypen kümmert, oder es nicht beherrscht und sich auf die IDE verläßt,
    produziert dann eben so etwas wie If CInt(productVer.Replace(".", "")) < CInt("110") Then, funktioniert wunderbar, ist aber der totale Ranz.
    Den &-Operator so zu nutzen ist total sauber, weil der das ja intern alles regelt. ToString o.ä. ist daher redundant.

    Schau Dir außerdem mal Application.ProductVersion an.

    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 :!:
    Ah ja, das hätte ich auch gleich so machen können, die Klasse ist mir ja nicht unbekannt, aber manchmal, sieht man den Wald, vor lauter Bäumen nicht. :rolleyes:

    VB.NET-Quellcode

    1. Dim exeVersion As New Version(Application.ProductVersion)
    2. ' anstatt
    3. Dim exePath As String = Application.ExecutablePath
    4. Dim exeVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(exePath)
    5. Dim exeVersion As New Version(exeVersionInfo.ProductVersion)
    Hallo nochmal,

    ich habe nun einiges schon angepasst. My.Computer.Filesystem ist schon komplett geflogen. Forms werden nun auch als Instanz gestartet.
    Bezüglich der Version:

    Pasta schrieb:

    Ah ja, das hätte ich auch gleich so machen können, die Klasse ist mir ja nicht unbekannt, aber manchmal, sieht man den Wald, vor lauter Bäumen nicht. :rolleyes:

    VB.NET-Quellcode

    1. Dim exeVersion As New Version(Application.ProductVersion)
    2. ' anstatt
    3. Dim exePath As String = Application.ExecutablePath
    4. Dim exeVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(exePath)
    5. Dim exeVersion As New Version(exeVersionInfo.ProductVersion)


    Meines Wissens nach, bekomme ich doch mit [b][/b]Application.ProductVersion[b][/b] einen String von meinen Aktuellen Programm. Ich muss aber die Version einer anderen Datei auslesen, welche sich im gleichen Verzeichnis befindet. So ganz konnte ich die Geheimnisse des Version Namespace noch nicht lüften. Z.B. wie ich die miteinander vergleichen soll. Und warum spuckt er bei Dim exeVersion As New Version(Application.ProductVersion) keinen Fehler aus, wenn du versucht einen String im 1.0.0.0 Format als Version zu erstellen?

    Des Weiteren noch eine Frage. Ich bin aktuell dabei den Microsoft.Visualbasic.Left/Right Müll zu ersetzen. Kenne aber nicht wirklich eine Alternative. Könnt ihr mir dort etwas empfehlen?

    LG Marvin
    Was soll an 1.0.0.0 denn ungültig sein? Major.Minor.Build.Revision
    Und Versionen vergleichen geht, wie bei sonst allem auch, über Operatoren. Wo ist das Problem?

    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 schrieb:

    Ich muss aber die Version einer anderen Datei auslesen
    Ja und?
    Die Lösung steht doch da:

    VB.NET-Quellcode

    1. Dim exePath As String = "C:\Program Files (x86)\Notepad++\notepad++.exe"
    2. Dim exeVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(exePath)
    3. Dim exeVersion As New Version(exeVersionInfo.ProductVersion)
    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!
    Hallo nochmal,

    erst einmal ein fettes Danke an alle für ihre Hilfe. Ich habe nun erneut einiges überarbeitet und dazugelernt. Endlich hat sich meine ewige Frage in Luft aufgelöst, wie ich nicht immer das selbe im Code schreiben muss, nur wenn sich ein Wert verändert hat. Ich habe nochmals alle File.WriteAllText aus dem Code entfernt, und diesen in eine extra Klasse ausgelagert.

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Imports System.Text
    3. Public Class logfile
    4. 'Paths
    5. Public logpfad As String = Path.Combine(Application.StartupPath, "sownloader.log")
    6. 'Logfile
    7. Public Sub TaskMessage(ByVal message As String)
    8. 'Create logfile if the file does not exist
    9. If Not File.Exists(Path.Combine(Application.StartupPath, "sownloader.log")) Then
    10. File.WriteAllText(logpfad, "Created logfile -- " & Date.Now & Environment.NewLine, Encoding.UTF8)
    11. End If
    12. 'Add Text to logfile
    13. File.AppendAllText(logpfad, message & " -- " & Date.Now & Environment.NewLine, Encoding.UTF8)
    14. End Sub
    15. End Class


    Nun habe ich mir ein neues logfile in den Forms erstellt:

    VB.NET-Quellcode

    1. ​Private logfile As New logfile

    Jetzt rufe ich nur noch den Sub mit den entsprechenden Eintrag auf:

    VB.NET-Quellcode

    1. ​ logfile.TaskMessage(creationMessage1)


    Und voilla, nun geht es deutlich einfacher. und ich spare mir immer die super langen Zeilen (Y).

    Das Versions Problem habe ich nun auch lösen können:

    VB.NET-Quellcode

    1. ​Imports System.Version

    VB.NET-Quellcode

    1. ​Private SupdaterLatestVersion As New Version(1, 1, 0)

    VB.NET-Quellcode

    1. 'Get installed version of Supdater in StartUpPath
    2. Dim path_up As String = Path.Combine(Application.StartupPath, "Supdater.exe")
    3. Dim version As FileVersionInfo = FileVersionInfo.GetVersionInfo(path_up)
    4. Dim productVer As New Version(version.ProductVersion)
    5. 'Update Supdater if installed version is smaller than the current version current version: 110 = 1.1.0
    6. If productVer < SupdaterLatestVersion Then
    7. 'Updating UI
    8. lblStatus.Text = "Updating updater..."
    9. 'Overwrite Supdater from Sownloader.Ressources
    10. Dim updatelaunch As Object = My.Resources.Supdater
    11. File.WriteAllBytes("Supdater.zip", CType(updatelaunch, Byte()))
    12. 'Extract Supdater.exe
    13. Dim cu As New ClassUnzip(Path.Combine(Application.StartupPath, "Supdater.zip"), Application.StartupPath)
    14. AddHandler cu.UnzipFinishd, AddressOf Unziped
    15. cu.UnzipNow()
    16. logfile.TaskMessage(creationMessage4)
    17. End If


    Diesbezüglich aber noch eine Frage:
    Ist es möglich auch die Version von ​My.Ressources.supdater auszulesen, ohne das Zip-Paket vorher immer zu extrahieren?

    Nun hänge ich noch an der Baustelle mit ​Microsoft.Visualbasic.Left/Right. Ich verstehe nicht, wie mir ​SubString weiterhelfen soll, weil ich ja nur den Anfang und das Ende einer URL bekommen möchte. Diese ist aber jedesmal unterschiedlich.

    LG Marvin
    Also, ich bin mir nicht ganz sicher was du vorhast, aber als Microsoft.VisualBasic.Left/Right-Alternative hätte ich:

    VB.NET-Quellcode

    1. Dim test as String = "Teststring"
    2. Dim test2 as String = test.Substring(0, 5)
    3. ''' Substring: Erster Parameter= Startindex, Zweiter Parameter, die Zeichen, die zurückgegeben werden sollen,
    4. '''startend beim Startindex. Hier: Die ersten 5 Zeichen, also "Tests"

    Um das von Rechts zu machen, lässt sich mit Length, arbeiten

    Edit: Okay, wer lesen kann ist klar im Vorteil. Wenn du bei einer URL nach der Endung suchst, kannst du mit Path.GetFileName den Dateinamen herausfinden, oder mit Split nach bestimmten Zeichen trennen.

    Grüße
    Grüße
    Felix

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kenaex“ ()

    Für eine Url, nutze die System.Uri Klasse.

    VB.NET-Quellcode

    1. Dim url as String = "http://www.vb-paradise.de/index.php/PostAdd/119344-Programm-funktioniert-nur-einmalig"
    2. Dim uri as New Uri(url)


    Pro Tip: :D
    Wenn man nach einer .Net Konformen Variante sucht, ist "Äquivalent" das beste Suchwort.
    In diesem Fall wäre das dann "Microsoft.Visualbasic.Left/Right Äquivalent".

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Pasta“ ()

    MarvinKleinMusic schrieb:

    ​My.Ressources.supdater
    Da solltest Du Deine Vorgehensweise ändern.
    Du musst ja bei einer neuen Version dieser Datei eh eine neue Exe kompilieren.
    Da kannst Du dieser Exe auch gleich von Hand die jeweilige Versionsnummer direkt in die Ressourcen eintragen.
    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!

    Kenaex schrieb:

    Also, ich bin mir nicht ganz sicher was du vorhast, aber als Microsoft.VisualBasic.Left/Right-Alternative hätte ich:

    VB.NET-Quellcode

    1. Dim test as String = "Teststring"
    2. Dim test2 as String = test.Substring(0, 5)
    3. ''' Substring: Erster Parameter= Startindex, Zweiter Parameter, die Zeichen, die zurückgegeben werden sollen,
    4. '''startend beim Startindex. Hier: Die ersten 5 Zeichen, also "Tests"

    Um das von Rechts zu machen, lässt sich mit Length, arbeiten

    Edit: Okay, wer lesen kann ist klar im Vorteil. Wenn du bei einer URL nach der Endung suchst, kannst du mit Path.GetFileName den Dateinamen herausfinden, oder mit Split nach bestimmten Zeichen trennen.

    Grüße


    Das ist genau das, was ich gesucht habe! Vielen Dank!

    RodFromGermany schrieb:

    MarvinKleinMusic schrieb:

    ​My.Ressources.supdater
    Da solltest Du Deine Vorgehensweise ändern.
    Du musst ja bei einer neuen Version dieser Datei eh eine neue Exe kompilieren.
    Da kannst Du dieser Exe auch gleich von Hand die jeweilige Versionsnummer direkt in die Ressourcen eintragen.


    Das per Hand eintragen wollte ich mir ja sparen. Die exe Datei welche überprüft wird, befindet sich immer im StartUpPath des Programms. Die neue Datei befindet sich immer in den My.Ressources des Programms in einem ZIP-Paket. Es kann ja immer mal passieren, dass ich sonst vergesse die Version im Programm per Hand zu aktualisieren.

    LG Marvin