Lese-/Schreib-Problem

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Lese-/Schreib-Problem

    Liebe Helfergemeinde,
    Vorbemerkung: Bin VB.NET-Anfänger, bitte um Nachsicht. Habe neben dem von Euch verschmähten VB 2010 von T.T. auch versucht, jenes Werk von Herrn Löffelmann zu verstehen, was mir aber nur partiell gelingt.
    Ferner weiß ich, dass mein Thema schon tausendfach - nicht nur in diesem Forum - besprochen wurde. Habe vieles versucht, immer aber ohne Erfolg.
    Das Programm läuft durch. Im angegebenen Pfad ist auch die entsprechende Datei angelegt. Aber - jetzt kommt das Problem - wenn ich es erneut starte, wird nur "0" gelesen, obwohl zuvor der Zähler, den ich an anderer Stelle des Programmes zwingend wieder verwenden muss, in der Schleife um jeweils +1 inkrementiert wurde.
    Offenbar speichert er den Zähler-Wert nicht. Was mache ich falsch ? Mir ist bekannt, dass das Arbeiten mit filegetobject und fileputobject von Euch nicht mehr gewünscht ist, aber das Arbeiten mit "File.create" etc. ist mir noch weniger gelungen.
    Hier der Programm-Ausschnitt (als Datei-Anhang)
    Was mache ich falsch?
    Herzlichen Dank im voraus für einen Tip!
    Dateien
    @woofy49 Willkommen im Forum. :thumbup:
    Wenn Du mit VB6 arbeitest, schreib in diesen Deinen Thread oben VB6 hin.
    Wenn Du mit solch verpönten Befehlen wie FileOpen(), FileGetObject(), FileClose() arbeiten musst, schreib das explizit hin und Du wirst den meisten hier leid tun und entsprechend wqenig qualifizierte Hilfe bekommen.
    Wenn Du nicht mit diesen Befehlen arbeiten musst, lass es und arbeite mit .NET.
    Was ganz genau soll passieren in Deinem Programm?
    PDF-Anhänge mit Quelltext sind suboptimal.
    Schreibe hier Quellcode rein und markiere ihn und tagge ihn mit VB.NET:

    dann können wir ihn nämlich per C&P bei uns einfügen und testen.
    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 woofy49

    Ich bin auch kein VB-Experte, deshalb mein vielleicht etwas pragmatischer Ansatz.
    Wenn es nur darum geht, eine Zahl bei Programmende zu speichern, und beim nächsten Start wieder zu laden, (so verstehe ich Deine Anforderung) könntest Du auch mit mySettings arbeiten.
    Wenn Du die Zahl jedoch auch asserhalb Deines VB-Programmes verwenden willst/musst, geht diese Lösung natürlich nicht.
    [TUTORIAL] Die My.Setting Speichermethode

    Gruss

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

    @ErfinderDesRades Der Code funktioniert schon, nur ist das ein binary Output:
    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!

    ErfinderDesRades schrieb:

    wird man nichts auslesen können.
    Das ist eine redundante Konvertierung, da blabla bereits vom Typ Integer ist. Unsinnigerweise tut es der Code.
    Vielleicht sollte sich @woofy49 endlich mal zu Wort melden.
    ErfinderDesRades Der IlSpy macht da das hier draus:
    Spoiler anzeigen

    C#-Quellcode

    1. if (File.Exists(PfadZ))
    2. {
    3. FileSystem.FileOpen(1, PfadZ, OpenMode.Random);
    4. object Value = Wertzähler;
    5. FileSystem.FileGetObject(1, ref Value, 1L);
    6. FileSystem.FileClose();
    7. Wertzähler++;
    8. FileSystem.FileOpen(1, PfadZ, OpenMode.Random);
    9. FileSystem.FilePutObject(1, Wertzähler, 1L);
    10. FileSystem.FileClose();
    11. }
    12. else
    13. {
    14. Wertzähler = 1;
    15. FileSystem.FileOpen(1, PfadZ, OpenMode.Random);
    16. FileSystem.FilePutObject(1, Wertzähler, 1L);
    17. FileSystem.FileClose();
    18. }
    ====
    @woofy49 Kopiere bitte mal den Inhalt Deines PDFs in das Visual Studio.
    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!

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

    RodFromGermany schrieb:

    Das ist eine redundante Konvertierung, da blabla bereits vom Typ Integer ist. Unsinnigerweise tut es der Code.
    Ich bin noch nicht überzeugt.
    IMO ist Cint(blabla) eine andere Integer-Instanz als blabla.
    Die wird dann ByRef übergeben, und FileGet() soll da was reinschreiben.
    tut es auch, sodass da dann der Wert drinne ist.
    Aber in blabla ist der Wert nicht - weil blabla ist ja eine andere Integer-Instanz als Cint(blabla).
    So meine Überlegung.
    Aber du hast es sicher ausprobiert, und ein Messagebox.Show(blabla.Tostring) eingefügt, wo wirklich ausgegeben wird, was in die Datei eingeschrieben steht, und kannst ein Screenshot von machen?

    ErfinderDesRades schrieb:

    und kannst ein Screenshot von machen?
    In Post #6 sind die Shots vom Inhalt der Datei nach je einem Button_Click.
    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!
    achso? Mir sieht das aus wie ein Inspektions-Tool für Dateien.
    Dasser der TestCode die Datei richtig schreiben kann, glaube ich ja, und mit einem Datei-Inspektor kann man das auch nachgucken - der kann sie ja wohl richtig lesen.

    Das erweist aber doch nicht, dass der TestCode die Datei richtig lesen kann.
    Wie gesagt: Bildle vom TestCode, wie da in Cint(blabla) eingelesen wird und in nächster Zeile mit Messagebox.Show(blabla.Tostring) ausgegeben wird - und die MsgBox willich natürlich auch sehen.
    Hier ein Consolen Testprogramm:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.Text
    4. Imports System.IO
    5. Imports System.Console
    6. Module Module1
    7. Public WertZähler As Integer
    8. ' Dim i As Integer
    9. Public PfadZ As String = "d:\#0\test.dat" '<------ Gültigen Pfad angeben
    10. Sub Main()
    11. test()
    12. MsgBox("WertZähler = " & WertZähler.ToString)
    13. End Sub
    14. Sub test()
    15. If File.Exists(PfadZ) Then
    16. FileOpen(1, PfadZ, OpenMode.Random)
    17. FileGet(1, Wertzähler, 1)
    18. Wertzähler += 1
    19. FilePut(1, Wertzähler, 1)
    20. FileClose()
    21. Else
    22. WertZähler = 1
    23. FileOpen(1, PfadZ, OpenMode.Random)
    24. FilePut(1, WertZähler, 1)
    25. FileClose()
    26. End If
    27. End Sub
    28. End Module

    ErfinderDesRades schrieb:

    Inspektions-Tool für Dateien
    Salamander (Norton Commander Clone), Text-Viewer im Hex-Modus.
    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!
    Jo - ein Datei-Inspektor. Macht Aussagen über die Datei, aber wie gesagt: natürlich nicht, ob iein TestCode die Datei auch lesen kann.
    Eierleins TestCode würde ich für richtig erachten - er hat ja das leidige Cint(Wertzähler) weggelassen.
    (Ist natürlich von fragwürdigem Nutzen, dem TE einen vb6-Code-Müll zu geben, der (womöglich, leider) funktioniert, anstatt ihn dazu zu bringen, vb.net zu coden - zB mit BinaryReader/Writer)
    Andererseits ist der TE scheints eh entschlafen, und wir pflegen hier nur noch unserer Rechthaberei ;)

    Ah - vielleicht können wir wenigstens Eierlein dazu bringen, bei sich den vb6-Deppen-Import rauszuwerfen - sodass er derlei Codemüll garnet erst formulieren kann 8o !
    Visual Studio - Empfohlene Einstellungen

    Das wäre ja auch ein deutlicher Nutzen dieses Threads.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades Mit dem leidigen CInt(WertZähler):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Public PfadZ As String = "C:\Temp\Zähler.txt"
    4. Public WertZähler As Integer
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. If File.Exists(PfadZ) Then
    7. FileOpen(1, PfadZ, OpenMode.Random)
    8. FileGet(1, CInt(WertZähler), 1)
    9. WertZähler += 1
    10. FilePut(1, CInt(WertZähler), 1)
    11. FileClose()
    12. Me.ListBox1.Items.Add(WertZähler)
    13. Else
    14. WertZähler = 1
    15. FileOpen(1, PfadZ, OpenMode.Random)
    16. FilePut(1, CInt(WertZähler), 1)
    17. FileClose()
    18. End If
    19. End Sub
    20. End Class
    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!
    Vielen Dank, große Helfergemeinde !
    Zunächst: Ich nutze VB.net (nicht VB 6), Visual Studio 2019.
    Aufgrund der ersten zwei oder drei Beiträge bin ich - trotz größerer Sorge, dass Eure Vorschläge eine Nummer zu groß für mich sind, "in mich gegangen" und habe erst einmal sämtliche Tutorials über Dataset's , Datatables's, Datagridview gelesen, angesehen, z. T. mehrfach.
    Die - eigentlich leichte - Einrichtung eines typisierten Dataset-Modells, wie im Video von ErfinderDesRads vorgestellt, bzw. das leider ohne Ton und im Zeitraffer-Modus erscheinende Filmchen des anderen Kollegen haben mich überzeugt, doch eine Datatable einzurichten. Der Teufel steckte dann allerdings doch im Detail, wobei die .WriteXML- und ReadXML-Methode noch das einfachste waren. Unklar blieb mir z. B., warum eine Speicherung z. B. in "C:\Ordner\Unterordner" abgelehnt wurde, hingegen im Projekt selbst (AppData) funktionierte. Leider waren Foren-Beiträge hierzu wenige zu finden.
    In einer anderen "Problemphase" las der Reader nur die erste Zeile der Tabelle, alle weiteren hingegen nicht. Was ich hier falsch geschrieben hatte, weiß ich nicht.
    Inzwischen bin ich in meinem Projekt mit persistierendem Speichern und Auslesen der Tabelle aus dem AppData-Ordner soweit fortgeschritten, dass ich zu diesem Kapitel DANKE sagen kann, vor allem den Erstellern der Videos, die mir gute Hilfe geleistet haben.
    Möglicherweise benötige ich an anderer Stelle nochmal Hilfe.
    Vielen Dank !

    woofy49 schrieb:

    Unklar blieb mir z. B., warum eine Speicherung z. B. in "C:\Ordner\Unterordner" abgelehnt wurde, hingegen im Projekt selbst (AppData) funktionierte. Leider waren Foren-Beiträge hierzu wenige zu finden.
    Man könnte das auch fragen im Forum, wenn man es wissen wollte.
    Aber Fragen entwickeln sich immer gerne zu Diskussionen - will man vlt. nicht.
    Und viele Antworten sind auch nur Mutmassungen...

    woofy49 schrieb:

    Unklar blieb mir z. B., warum eine Speicherung z. B. in "C:\Ordner\Unterordner" abgelehnt wurde,
    Möglicherweise liegt es daran, dass eine zu übereschreibende Datei von einem anderen Rechner dort hin kopiert wurde, und dann nur unter Win10.
    Mir ist so was passiert, als ich eine Konfigurationsdatei von einem Win7-Rechner zu einem Win10-Rechner übertrtagen habe.
    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!