none
Variabeln zur Auswertung einer Ini-Datei übergeben RRS feed

  • Frage

  • Hallo,

    ich stecke mal wieder fest und brauche Hilfe.
    Ich schreibe ein Programm, dass eine Menge Daten verarbeitet und ich möchte die Möglichkeit haben, zu prüfen ob die alle da sind.

    In Form1 sind diese Daten modulweit deklariert.
    Da gibt es beispielsweise den 1 Eintrag aus dem ersten Ordner. Der Ordner heisst ganz kryptisch O1L1
    Die der Pfad für O1L1 setzt sich zusammen aus:
    ZielVerzeichnis & "\" &  Ornder1 & "\" & Name
    Daraus ergibt sich im Beispiel C:\Programme\Stefan\Probe1\Test.txt"
    Soweit so gut. Die Auswertung mach ich nicht in Form1 sondern Form7.
    Wenn ich dort für das Laden der Form7 angebe:
    Label1.Text= O1L1 erhalte ich die korrekte Anzeige: C:\Programme\Stefan\Probe1\Test.txt

    Nun möchte ich der Reihe nach alle Einträge kontrollieren und das Ergebnis (gefunden oder nicht gefunden) in eine Ini-Datei schreiben, die ich SD.log genannt habe. (ini erschien mir zu "banal ;-) )

    Hier mein Code:


    Private

     

    Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

     

    Dim Ordner As String = "O" 'Kürzel für Ordner

     

    Dim Anhang As String = "L" 'Kürzel für Anhnag

     

    Try

     

    Dim d As DirectoryInfo

     

    Dim a As Integer 'Dateien 1 - 300

     

    Dim o As Integer 'Ordner 1 -60

     

    Dim dateiname As String = "O" & o.ToString & Anhang & a.ToString
    'z.B. O1L1 = "C:\Programme\Stefan\Probe1\Test.txt"

     

     

    ' Muss von Anwendung übergeben werden

     

    Const VERZEICHNIS = "C:\Programme\Stefan\SD.log"

     

    For o = 1 To 10 'Maximalwert 60

    d =

    New DirectoryInfo(dateiname) 'Generiert das Ordnerverzeichnis

     

    For a = 1 To 10 'Maximalwert 300

    dateiname =

    "O" & o.ToString & "L" & a.ToString 'setzt aus Fragmenten z.B. O2L45 zusammen

     

    If File.Exists (dateiname) Then

     

    'Ini(-Eintrag)

     

    ' Einzelnen Eintrag im Abschnitt [Settings] speichern

     

    Dim myIniFile As String

    myIniFile = VERZEICHNIS

    WritePrivateProfileString(

    "Liste der Verzeichnisse und Dateien", dateiname, " ok", _

    myIniFile)

     

    'Ende INi-Eintrag

     

    Else

     

    Dim myIniFile As String

    myIniFile = VERZEICHNIS

    WritePrivateProfileString(

    "Liste der Verzeichnisse und Dateien", dateiname, " nicht gefunden", _

    myIniFile)

     

    'Ende INi-Eintrag

     

    End If

     

    Next (a) 'Dateiname

     

    Next (o) 'Ordnername

    Button2.Enabled =

    True

    Label1.Text =

    "Die Überprüfung ist beendet. Um die Log-Datei zu öffnen, drücken Sie den ''Log-File anzeigen''-Schalter"

     

    Catch ex As Exception

    MsgBox(

    "Fehler beim Erstellen der Log-Datei.")

     

    End Try

     

    End Sub

    Was nun passiert ist folgendes. Der Dateiname wird so behandelt, als hätte ich ihn in Anführungszeichen gesetzt. Mein Ergebnis sieht also wie folgt aus:

    [Liste der Verzeichnisse und Dateien]
    O1L1= nicht gefunden
    O1L2= nicht gefunden
    O1L3= nicht gefunden
    O1L4= nicht gefunden
    O1L5= nicht gefunden
    O1L6= nicht gefunden
    O1L7= nicht gefunden
    O1L8= nicht gefunden
    O1L9= nicht gefunden
    O1L10= nicht gefunden
    O2L1= nicht gefunden
    O2L2= nicht gefunden
    O2L3= nicht gefunden
    O2L4= nicht gefunden
    O2L5= nicht gefunden
    O2L6= nicht gefunden
    O2L7= nicht gefunden
    O2L8= nicht gefunden
    O2L9= nicht gefunden

    So wie ich das sehe, weiß mein Programm nicht, dass es sich bei der generierten Variablen eben um Variablen handelt?
    Was mache ich falsch oder wie mache ich es richtig?

    Wenn ich den kompletten Pfad mit Namen von Hand eintrage stimmt das Ergebnis. Da dies jedoch in meinem Programm im Extremfall bis zu 18.000 Dateien werden können ist das keine Lösung. Mein Programm muss also lernen, dass eine Variable innerhalb der Prüfroutine genauso eine Variable ist wie beim Programmstart.

    Für eure Hilfe vielen Dank im Voraus.
    Stefan

    Liebe Grüße Stefan
    Freitag, 24. Juli 2009 09:32

Antworten

  • Hallo Stefan,

    der folgende Codeabschnitt ins Unreine runtergetippt:

    Imports System.Collections.Generic
    Imports System.IO
    Imports System.Text
    
    Public Class DateiAblage
        Private _verzeichnisse As SortedList(Of String, String)
        Private _vorlagen As SortedList(Of String, String)
    
        Public ReadOnly Property Verzeichnisse() As SortedList(Of String, String)
            Get
                If Me._verzeichnisse Is Nothing Then
                    Me._verzeichnisse = New SortedList(Of String, String)(StringComparer.OrdinalIgnoreCase)
                End If
                Return Me._verzeichnisse
            End Get
        End Property
    
        Public ReadOnly Property Vorlagen() As SortedList(Of String, String)
            Get
                If Me._vorlagen Is Nothing Then
                    Me._vorlagen = New SortedList(Of String, String)(StringComparer.OrdinalIgnoreCase)
                End If
                Return Me._vorlagen
            End Get
        End Property
    
        Public Function GetDateiname(ByVal verzeichnisKey As String, ByVal vorlageKey As String) As String
            Return Path.Combine(Me.Verzeichnisse(verzeichnisKey), Me.Vorlagen(vorlageKey))
        End Function
    
        Public Sub Verify(ByVal fileName As String, ByVal verbose As Boolean)
            Dim verzeichnisAnzahl As Integer
            Dim verzeichnisFehlt As Integer
            Dim vorlageAnzahl As Integer
            Dim vorlageFehlt As Integer
    
            Using logWriter As New StreamWriter(fileName, False, Encoding.Default)
                ' Verzeichnisse prüfen
                For Each verzeichnisKey As String In Me.Verzeichnisse.Keys
                    verzeichnisAnzahl += 1
    
                    Dim verzeichnisName As String = Me.Verzeichnisse(verzeichnisKey)
                    If Not Directory.Exists(Me.Verzeichnisse(verzeichnisKey)) Then
                        verzeichnisFehlt += 1
    
                        If verbose Then
                            logWriter.WriteLine( _
                                "Verzeichnis '{0}' = '{1} nicht vorhanden.", _
                                verzeichnisKey, verzeichnisName)
                        End If
                    Else
                        ' Vorlagen im Verzeichnis prüfen
                        For Each vorlageKey As String In Me.Vorlagen.Keys
                            vorlageAnzahl += 1
    
                            Dim vorlageName As String = Me.Vorlagen(vorlageKey)
                            Dim dateiName As String = GetDateiname(verzeichnisKey, vorlageKey)
                            If Not File.Exists(dateiName) Then
                                vorlageFehlt += 1
    
                                If verbose Then
                                    logWriter.WriteLine( _
                                        "Verzeichnis '{0}' Vorlage '{1}' nicht vorhanden.", _
                                        verzeichnisKey, vorlageKey)
                                End If
                            End If
                        Next
                    End If
                Next
    
                logWriter.WriteLine()
                logWriter.WriteLine("Zusammenfassung")
                logWriter.WriteLine("{0} Verzeichnisse", verzeichnisAnzahl)
                logWriter.WriteLine("{0} Verzeichnisse fehlen", verzeichnisFehlt)
                logWriter.WriteLine("{0} Vorlagen", vorlageAnzahl)
                logWriter.WriteLine("{0} Vorlagen fehlen", vorlageFehlt)
            End Using
        End Sub
    
        <Conditional("Debug")> _
        Friend Shared Sub Test()
            Dim Ablage As New DateiAblage()
    
            Ablage.Verzeichnisse.Add("O1", "C:\TEMP\Verzeichnis1")
            Ablage.Verzeichnisse.Add("O2", "C:\TEMP\Verzeichnis2")
            Ablage.Verzeichnisse.Add("O3", "C:\TEMP\Verzeichnis3")
    
            Ablage.Vorlagen.Add("A1", "Vorlage1.doc")
            Ablage.Vorlagen.Add("A2", "Vorlage2.bmp")
            Ablage.Vorlagen.Add("A3", "Vorlage3.xls")
    
            Const Protokoll As String = "C:\TEMP\Ablage.log"
            Ablage.Verify(Protokoll, True)
            Dim ausgabe As String = File.ReadAllText(Protokoll, Encoding.Default)
            Console.WriteLine(ausgabe)
        End Sub
    End Class
    
    Die Verzeichnisse, Vorlagen werden über zwei Auflistungen angesprochen.
    Zur Addressierung dienen hier Zeichenketten als Schlüssel, dass können
    aber auch Integer sein, wenn das für Dein jetziges Programm günstiger ist.
    Die Methode Verify prüft die Zusammenhänge und gibt entweder eine kurze
    oder lange Liste aus.
    Idealerweise würde man dort auch das Speichern und Laden der Einstellungen
    vornehmen. Da ich nicht weiss wie Du das bisher machst (INI?), habe ich das
    weggelassen.

    Gruß Elmar






    • Als Antwort markiert Giftzwockel Freitag, 31. Juli 2009 06:30
    Sonntag, 26. Juli 2009 16:01
    Beantworter
  • Prima, danke. Ich schaue mir das am Wochenende mal an.
    Mit der Lösung dieses Problems wäre mein erstes größeres Projekt tatsächlich in allen Punkten abgehandelt.
    Liebe Grüße Stefan
    • Als Antwort markiert Giftzwockel Montag, 10. August 2009 15:23
    Freitag, 31. Juli 2009 11:25

Alle Antworten

  • Hallo Stefan,

    Deinen Ansatz solltest Du dringend überdenken.

    So kann das mit Deiner Schleife so nicht funktionieren.
    Die Aussage
    Label1.Text= O1L1 erhalte ich die korrekte Anzeige: C:\Programme\Stefan\Probe1\Test.txt
    lässt mich vermuten das Du derzeit einzelne Variablen O1L1, O1L2, ..., O60L300 hast.

    Nicht nur das 18000 Variablen jedes Programm verunstalten ;-),
    darauf kannst Du nicht einfach mit einer Schleife zurückgreifen, die einen Variablen-Namen bildet.
    (Es gäbe zwar einen Weg via Reflection, aber den werde ich zunächst nicht weiterverfolgen).

    Sinnvoller ist es für die Ordner / Ablagennamen eine Auflistung in Form von List(Of T)
    oder wenn Du über Schlüssel zurückgreifen willst, via Dictionary(Of K, V) .
    Davon gibt es diverse Abwandlungen für speziellere Zwecke, etwas allgemeiner
    beschreibt dies: Verwalten von Objekten mit Auflistungen

    Damit reduziert sich die Zahl der globalen Variablen auf eine - oder zwei,
    wenn Du Ordner und Ablagen getrennt halten und später zusammenfügen willst.

    Eher am Rande:
    Du solltest die Ausgabe der Überprüfung überdenken. Denn niemand wird 18.000 Zeilen im Protokoll lesen -
    wo vielleicht nur einmal "nicht gefunden" drinsteht - da wäre die Reduktion auf die fehlenden sinnvoller,
    und wenn ein Verzeichnis nicht vorhanden ist, so gilt das auch für untergeordnete Dateien.

    Anstatt den Weg über eine INI-Datei, die Du als LOG tarnst solltest Du sie direkt
    als Datei via StreamWriter ausgeben. Anleitungen dazu findest Du unter: Allgemeine E/A-Aufgaben

    Das war jetzt nur sehr grob, was mir beim Lesen aufgefallen ist.
    Einen konkreteren Lösungsvorschlag liefere ich gerne nach,
    wenn Du mehr über die Zusammenhänge von Ordnern/Ablagen
    und der Verwendung im Programm (abseits der Prüfung) erzählst.

    Gruß Elmar
    Sonntag, 26. Juli 2009 10:51
    Beantworter
  • Hallo Elmar,

    in allem was du schreibst kann ich dir nur zustimmen.
    Es macht weder Sinn noch Spaß im Extremfall 18.000 Variablen zuverwalten und dies nicht zuletzt, weil die Variablen in meinem Programm einzelnen Dateien entsprechen, die später innerhalb des Programm augerufen werden können müssen.
    Leider wusste ich zu Beginn meines Programms nocht nicht das, was ich inzwischen weiß. Ich war der Ansicht, dass ich die Variabeln u.a. auch zur Installation benötige.

    Gestern habe ich mich dann aber mit dem Inno Setup Compiler etwas auseinander gesetzt und festgestellt, dass ich zur Installation die Variablen nicht brauche, da reichen mir die eigentlichen Vorlagen innerhalb der Verzeichnisse.

    Die zweite Idee war es, die Vorlagen als Variable innerhalb einer Liste zur Verfügung zu stellen.
    Auch das ist Schnee von gestern, denn inzwischen habe ich gelernt, wie man Verzeichnisse und Files innerhalb eines Verzeichnisses in einer Listbox darstellt und aufrufen kann. Das ist in jedem Fall realistischer als dies mit Varibeln zu machen, da sich der Inhalt eines Verzeichnisses ja auch durch einen Eintrag ändern kann, der nicht durch einen mittels Variable verwalteten Eintrag verwaltet wird. Somit ist das reale auslesen eines Verzeichnisses (ähnlich dem Explorer) immer zuverlässiger und genauer als zu prüfen was sollte vorhanden sein und was ist vorhanden.

    Streng genommen fehlt mir jetzt der Grund, wozu ich diese 18000 Variablen überhaupt benötige. Das ist ein "Wasserkopf" ohne Sinn.

    Ursprünglich war es angedacht, dass verschiedene Vorlagen (meist Textvorlagen) in verschiedenen Ordnern hinterlegt sind. Über die Variable konnte für jede einzelne Vorlage ein solcher "Prüfort" definiert werden. Es erschein mir deshalb als wichtig, weil das Programm modular arbeiten soll, das heißt, der eine Verein benennt Ordner1 als "Mitglieder", ein anderer vielleicht "Rundenwettkämpfe" ....
    Insgesamt habe ich mal für 60 Ordner vorgearbeitet was nichts anderes bedeutet, als das alle Ordner angelegt werde (60 Tabs), jedoch die unverwendeten über Remove wieder entfernt werden. So werden nur die tatsächlich definierten Registerkarten angezeigt.

    Da ich mir vorstellen kann, dass es innerhalb verschiedener Vereine (z.B. Schützenverein) Vorlagen gibt, die man schon wegen Datenschutz und beispielsweise Waffenrecht an Dritte herausgibt, dachte ich mir, kann ich die Namen bzw. den kompletten Pfad der Vorlagen in der Variablen definieren und später über die als Log-Datei getarnte Ini-Datei überprüfen, ob die Datei tatsächlich vorhanden ist. Um beim Beispiel Schützenverein zu bleiben, würde kein Verein die Liste der Mitglieder an Dritte aushändigen noch dazu wo solche Listen hier noch zusätzlich Angaben wie beispielsweise Waffenbestand, Zusatzausbildung wie Sprengstofferlaubnis, Wiederlader, Munitionserwerb etc. beinhalten würde.

    Natürlich merkt man es auch so, wenn eine gesuchte Datei nicht da ist. Aber genau das soll ja mein kleines Programm verhindern. Sinn der Überprüfung war es eben sicherzustellen bzw. zu püfen, ob alle Vorlagen die vorhanden sein sollten, tatsächlich vorhanden sind.

    Wenn man nun davon ausgeht, dass es der Normalfall sein sollte, dass die Dateien dann auch vorhanden sind, macht es sicher Sinn, ggf. die 10 - 15 fehlenden Dateien aufzulisten anstelle 17.985 vorhandene Dateien als vorhanden darzustellen.

    Hier wäre es sicher sinnvoller und aussagefähiger, wenn es eine Möglichkeit gäbe, die aussagefähig ist und folgende Angaben hat:

    1. Datum und Uhrzeit der Prüfung
    2. Aufstellung der fehlenden Dateien
    3. Angabe wieviele Dateien gesucht wurden.

    Aus 2 und 3 könnte man so was machen wie:

    y Dateien geprüft
    x Dateien nicht gefunden

    und dann den Pfad wo diese sein sollten.

    Nur hierzu fehlt mir der Ansatz und das Wissen.




    Liebe Grüße Stefan
    Sonntag, 26. Juli 2009 15:04
  • Hallo Stefan,

    der folgende Codeabschnitt ins Unreine runtergetippt:

    Imports System.Collections.Generic
    Imports System.IO
    Imports System.Text
    
    Public Class DateiAblage
        Private _verzeichnisse As SortedList(Of String, String)
        Private _vorlagen As SortedList(Of String, String)
    
        Public ReadOnly Property Verzeichnisse() As SortedList(Of String, String)
            Get
                If Me._verzeichnisse Is Nothing Then
                    Me._verzeichnisse = New SortedList(Of String, String)(StringComparer.OrdinalIgnoreCase)
                End If
                Return Me._verzeichnisse
            End Get
        End Property
    
        Public ReadOnly Property Vorlagen() As SortedList(Of String, String)
            Get
                If Me._vorlagen Is Nothing Then
                    Me._vorlagen = New SortedList(Of String, String)(StringComparer.OrdinalIgnoreCase)
                End If
                Return Me._vorlagen
            End Get
        End Property
    
        Public Function GetDateiname(ByVal verzeichnisKey As String, ByVal vorlageKey As String) As String
            Return Path.Combine(Me.Verzeichnisse(verzeichnisKey), Me.Vorlagen(vorlageKey))
        End Function
    
        Public Sub Verify(ByVal fileName As String, ByVal verbose As Boolean)
            Dim verzeichnisAnzahl As Integer
            Dim verzeichnisFehlt As Integer
            Dim vorlageAnzahl As Integer
            Dim vorlageFehlt As Integer
    
            Using logWriter As New StreamWriter(fileName, False, Encoding.Default)
                ' Verzeichnisse prüfen
                For Each verzeichnisKey As String In Me.Verzeichnisse.Keys
                    verzeichnisAnzahl += 1
    
                    Dim verzeichnisName As String = Me.Verzeichnisse(verzeichnisKey)
                    If Not Directory.Exists(Me.Verzeichnisse(verzeichnisKey)) Then
                        verzeichnisFehlt += 1
    
                        If verbose Then
                            logWriter.WriteLine( _
                                "Verzeichnis '{0}' = '{1} nicht vorhanden.", _
                                verzeichnisKey, verzeichnisName)
                        End If
                    Else
                        ' Vorlagen im Verzeichnis prüfen
                        For Each vorlageKey As String In Me.Vorlagen.Keys
                            vorlageAnzahl += 1
    
                            Dim vorlageName As String = Me.Vorlagen(vorlageKey)
                            Dim dateiName As String = GetDateiname(verzeichnisKey, vorlageKey)
                            If Not File.Exists(dateiName) Then
                                vorlageFehlt += 1
    
                                If verbose Then
                                    logWriter.WriteLine( _
                                        "Verzeichnis '{0}' Vorlage '{1}' nicht vorhanden.", _
                                        verzeichnisKey, vorlageKey)
                                End If
                            End If
                        Next
                    End If
                Next
    
                logWriter.WriteLine()
                logWriter.WriteLine("Zusammenfassung")
                logWriter.WriteLine("{0} Verzeichnisse", verzeichnisAnzahl)
                logWriter.WriteLine("{0} Verzeichnisse fehlen", verzeichnisFehlt)
                logWriter.WriteLine("{0} Vorlagen", vorlageAnzahl)
                logWriter.WriteLine("{0} Vorlagen fehlen", vorlageFehlt)
            End Using
        End Sub
    
        <Conditional("Debug")> _
        Friend Shared Sub Test()
            Dim Ablage As New DateiAblage()
    
            Ablage.Verzeichnisse.Add("O1", "C:\TEMP\Verzeichnis1")
            Ablage.Verzeichnisse.Add("O2", "C:\TEMP\Verzeichnis2")
            Ablage.Verzeichnisse.Add("O3", "C:\TEMP\Verzeichnis3")
    
            Ablage.Vorlagen.Add("A1", "Vorlage1.doc")
            Ablage.Vorlagen.Add("A2", "Vorlage2.bmp")
            Ablage.Vorlagen.Add("A3", "Vorlage3.xls")
    
            Const Protokoll As String = "C:\TEMP\Ablage.log"
            Ablage.Verify(Protokoll, True)
            Dim ausgabe As String = File.ReadAllText(Protokoll, Encoding.Default)
            Console.WriteLine(ausgabe)
        End Sub
    End Class
    
    Die Verzeichnisse, Vorlagen werden über zwei Auflistungen angesprochen.
    Zur Addressierung dienen hier Zeichenketten als Schlüssel, dass können
    aber auch Integer sein, wenn das für Dein jetziges Programm günstiger ist.
    Die Methode Verify prüft die Zusammenhänge und gibt entweder eine kurze
    oder lange Liste aus.
    Idealerweise würde man dort auch das Speichern und Laden der Einstellungen
    vornehmen. Da ich nicht weiss wie Du das bisher machst (INI?), habe ich das
    weggelassen.

    Gruß Elmar






    • Als Antwort markiert Giftzwockel Freitag, 31. Juli 2009 06:30
    Sonntag, 26. Juli 2009 16:01
    Beantworter
  • Ui, das sieht aber kompliziert aus. Damit hatse mich die Woche auf eis gelegt. ;-)

    Vielen Dank.
    Liebe Grüße Stefan
    Montag, 27. Juli 2009 13:09
  • Hallo Elmar,

    jetzt habe ich gerade versucht den Code soweit zu interpretieren und Fragen zu stellen und dann verabschiedt sich der PC.
    Ich versuchs nochmal aber diesmal kürzer, da ich durch das Aufarbeiten selbst schon etwas merh verstanden habe.

    Also ich glaube verstanden zu haben, dass ich in der
    Public Class DateiAblage zwei Listen anlegen muss?
    In Private _verzeichnisse kommen die Variablen der Verzeichnisse und
    in Private _ Vorlagen die Variablen der Dateien

    Wenn das noch stimmt hier meine erste Frage:
    Wenn ich die vorab in Form 1 als Modul Module1 als Public deklariert habe, soll ich die dann besser in Form1 rausnehmen (brauche die dort nach Umstellung der Auswertung dort nicht mehr) und hier parken?

    Als nächstes kommt das Lesen dieser Anagaben. Das Programm prüft also was vorhanden sein soll und erstellt eine Liste für Verzeichnisse und Dateien?
    Noch richtig?

    Bevor die Auswertung erfolgt werden Variablen deklariert jeweils für die Anzahl der Verzeichnisse/Dateien (Soll) und Anzahl der fehlenden Verzeichnisse/Vorlagen.

    Danach folgt die Auswertung:
    Hier wird zunächst gezählt wie viele Verzeichnisse/Dateien in der Klasse Dateiablage deklariert sind und werden durchnummeriert.
    Im nächsten Schritt wird geprüft, ob das Verzeichnis/Datei real existiert.
    Wenn nein, wird pro fehlender Datei/Verzeichnis der Zähler um 1 erhöht und der Name der fehlenden Datei/Verzeichnis  über den StreamWriter, der nun logWriter heißt,  geschrieben. (In eine Console??)

    Am Ende gibt es eine Auswertung als Zusammenfassung.
    Gesamtzahl Verzeichnisse
    ANzahl der fehlednen Verzeichnisse
    Dto mit Dateien

    Zum Schluss wird aus der Liste der Dateien die da sein sollten (DateiAblage) beim Start eine neue  die als
    Dim Ablage As New DateiABlage deklariert wird?

    Dieser Ablage werden dann die Verzeichnisse/Vorlagen hinzugefügt wobei mir die Bezeichnungen als "01" bzw. "A1" ... noch nicht ganz klar ist. Das ist vermutlich ein Unterscheidungsmerkmal für Verzeichnisse (O 1 - x) und Dateien (A könnte aber auch D heißen? von 1 - x).

    Danach Wird das Protokoll hier nach C:\TEMP\Balage.log geschrieben. Das könnte sicher auch eine Test.log oder Test.ini im Verzeichis D:\Test\ sein?

    Nun zur Console. Mein Programm hat aktuell keine Konsole. Macht es Sinn oder ist es üblich, solche Prozesse in einer Konsole darzustellen? Da sieht der Anwender wenigstens, das noch was am laufen ist?
    Sicher kann ich den Text auch an ein Label ausgeben? Dann gibt es aber sicher kein "WriteLine"

    Finally meine alles entscheidende Frage.
    Ich wollte die Funktion eigentlich mittels ButtonClick auslösen
    Für mch stellt sich das komplette Werk jedoch als eine mächtige Klasse dar. (Ausnahme die drei Imports ..)
    Kann man den Quelltext auseinanderdröseln dass mein Ereignis auf ButtonClick läuft?
    Und habe ich deinen Code wenigstens annähernd verstanden??


    Liebe Grüße Stefan
    Montag, 27. Juli 2009 22:06
  • Hallo Stefan,

    leider hatte ich keine Benachrichtigung für Deinen zweite Beitrag erhalten
    und sehe Deinen ausführlichen Beitrag erst jetzt, nach dem Du das Antwort-Häkchen gesetzt hast.

    Ich beschränke mich meiner Antwort, da ich nicht beurteilen kann, wie weit Du alles hast nutzen können.
    Aber Deine Analyse war schon ziemlich gut!

    Zu Public Class DateiAblage zwei Listen anlegen muss?
    Das kann sich je nach Zusammenhang zwischen Verzeichnissen und Vorlage mehrstufig gestalten.
    Grundsätzlich solltest Du nicht über Variablen zugreifen, sondern über die Eigenschaften, wie ich
    auch gezeigt hatte, siehe Die Prinzipien des objektorientierten Entwurfs
    Damit erhälst Du mehr Flexibilität für spätere Änderungen und Anpassungen.

    Zu Dieser Ablage werden dann die Verzeichnisse/Vorlagen hinzugefügt wobei mir die Bezeichnungen als "01" bzw. "A1" ... noch nicht ganz klar ist.
    Die Bezeichnungen O1 A1 stehen für einen beliebigen (eindeutigen) Schlüssel,
    über den Du  die Verzeichnis bzw. Ablage im Programm addressieren kannst.
    Wenn Du sie je Formular verwaltest, könnte da auch "Form1".. "FormNN" verwendet werden.
    Verwendest Du durchgängig Ganzzahlen, könntest Du anstatt SortedList(Of String, String)
    auch SortedList(Of Integer, String) verwenden - wobei Zeichenketten variabler sind.

    Zu Nun zur Console. Mein Programm hat aktuell keine Konsole.
    das war, wie die ganze Test-Methode nur für den Test (deshalb der Name ;-).
    Du kannst anstatt dessen auch die Ausgabe von
    Dim
     ausgabe As
     String
     = File.ReadAllText(Protokoll, Encoding.Default
    )
    z. B. an Label/Textbox.Text zuweisen, die Du in Deinem Protokollformular anzeigst.

    Zu: Ich wollte die Funktion eigentlich mittels ButtonClick auslösen
    Das darfst (und sollst) Du auch: Rufe die Methode für Deine DateiAblage im Click-Handler auf.
    Nur den Code solltest Du dort lassen, wo er ist, das gehört auch zu den oben erwähnten Prinzipien.
    Denn so verteilt sich der Code nicht auf unterschiedlichste Formulare, sondern bleibt zentral
    an der Stelle, die damit am besten umgehen kann.

    Wenn noch weitere Details zu klären sind, mache einen neuen Beitrag auf.

    Gruß Elmar

    Freitag, 31. Juli 2009 09:38
    Beantworter
  • Prima, danke. Ich schaue mir das am Wochenende mal an.
    Mit der Lösung dieses Problems wäre mein erstes größeres Projekt tatsächlich in allen Punkten abgehandelt.
    Liebe Grüße Stefan
    • Als Antwort markiert Giftzwockel Montag, 10. August 2009 15:23
    Freitag, 31. Juli 2009 11:25