Kassenwerte bearbeiten in Verbindung mit Byref

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    Kassenwerte bearbeiten in Verbindung mit Byref

    Moin!

    ich habe da noch eine etwas kompliziertere Sache.

    Es gibt eine Klasse für die Bearbeitung von Parametern "Properties"

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Reflection
    2. Imports System.Windows.Forms
    3. Imports System.IO
    4. Public Class Properties
    5. Private _objDoc As Word.Document
    6. Private _KeyWords As New Dictionary(Of String, String)
    7. Public Sub New(objDoc As Word.Document)
    8. _objDoc = objDoc
    9. _KeyWords = GetKeywords
    10. End Sub
    11. ''' <summary>
    12. ''' Auslesen der FID für das JOURNAL
    13. ''' </summary>
    14. ''' <returns>FID Journal</returns>
    15. Public ReadOnly Property FID_Journal() As Long
    16. Get
    17. If _KeyWords.Count = 0 Then Return -1
    18. If _KeyWords.ContainsKey("FID_JOURNAL") = False Then Return -1
    19. Return CLng(_KeyWords("FID_JOURNAL"))
    20. End Get
    21. End Property
    22. ''' <summary>
    23. ''' Auslesen der FID für das GENEHMIGUNG
    24. ''' </summary>
    25. ''' <returns>FID_Genehmigung</returns>
    26. Public ReadOnly Property FID_Genehmigung() As Long
    27. Get
    28. If _KeyWords.Count = 0 Then Return -1
    29. If _KeyWords.ContainsKey("FID_GENEHMIGUNG") = False Then Return -1
    30. Return CLng(_KeyWords("FID_GENEHMIGUNG"))
    31. End Get
    32. End Property
    33. ''' <summary>
    34. ''' Auslesen der FID für den Sachbearbeiter
    35. ''' </summary>
    36. ''' <returns>FID_Sachbearbeiter</returns>
    37. Public ReadOnly Property FID_Sachbearbeiter() As Long
    38. Get
    39. If _KeyWords.Count = 0 Then Return -1
    40. If _KeyWords.ContainsKey("FID_SACHBEARBEITER") = False Then Return -1
    41. Return CLng(_KeyWords("FID_SACHBEARBEITER"))
    42. End Get
    43. End Property
    44. ''' <summary>
    45. ''' Auslesen des Projektnamens
    46. ''' </summary>
    47. ''' <returns>Projektname und wenn keiner übergeben dann wird zur Sicherheit der Entwicklungsname übergeben</returns>
    48. Public ReadOnly Property Project() As String
    49. Get
    50. If _KeyWords.Count = 0 Then Return "ENTWICKLUNG_2020_06"
    51. If _KeyWords.ContainsKey("PROJEKT") = False Then Return "ENTWICKLUNG_2020_06"
    52. Return _KeyWords("PROJEKT")
    53. End Get
    54. End Property
    55. ''' <summary>
    56. ''' Key vorhanden?
    57. ''' </summary>
    58. ''' <param name="Key">zu prüfender Key</param>
    59. ''' <returns>true .. vorhanden / false ... nicht vorhanden</returns>
    60. Public ReadOnly Property ContainsKey(Key As String) As String
    61. Get
    62. Return _KeyWords.ContainsKey(Key)
    63. End Get
    64. End Property
    65. ''' <summary>
    66. ''' Wert auslesen
    67. ''' </summary>
    68. ''' <param name="Key">auszulesender Wert</param>
    69. ''' <returns>Wert oder Leerstring</returns>
    70. Public ReadOnly Property Item(Key As String) As String
    71. Get
    72. If _KeyWords.ContainsKey(Key) Then Return _KeyWords(Key)
    73. Return ""
    74. End Get
    75. End Property
    76. ''' <summary>
    77. ''' Key hinzufügen, wenn nicht vorhanden
    78. ''' </summary>
    79. ''' <param name="Key">zu verwendender Key</param>
    80. ''' <param name="Value">zu setzender Wert</param>
    81. ''' <param name="Overwrite">optional überschreiben (default:=false)</param>
    82. Public Sub Add(Key As String, Value As String, Optional Overwrite As Boolean = False)
    83. If _KeyWords.ContainsKey(Key) = True Then
    84. If Overwrite = True Then
    85. _KeyWords(Key) = Value
    86. End If
    87. Else
    88. _KeyWords.Add(Key, Value)
    89. End If
    90. End Sub
    91. End Class



    Nun bin ich im Hauptprogramm und rufe eine Funktion in einer anderen Klasse auf:

    VB.NET-Quellcode

    1. Private Sub bt_GsewReplaceTags1_Click(sender As Object, e As RibbonControlEventArgs) Handles bt_GsewReplaceTags1.Click
    2. _objDoc = Globals.ThisAddIn.Application.ActiveDocument
    3. Dim fProp As New EBL.WordAddin.Properties(_objDoc)
    4. fTxtAnaly.AnalyseZAndrohungFestsetzung(fProp) ' Schreibenanalyse
    5. End Sub


    Hier geht es um die Zeile 6.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Handelt es sich um Zwangsgeldandrohungsbescheid/Zwangsgeldfestsetzungsbescheid
    3. ''' </summary>
    4. ''' <param name="fKeyword">Klasse mit den docEigenschaften (Keywords)</param>
    5. ''' <param name="Refresh">optional den Text neulesen</param>
    6. Public Sub AnalyseZAndrohungFestsetzung(ByRef fKeyword As EBL.WordAddin.Properties, Optional Refresh As Boolean = False)
    7. If Refresh = True Then ReadWordText()
    8. Dim Data2Analyze As String = ""
    9. If fKeyword.ContainsKey("DatumVorbescheid") = True Then Exit Sub ' damit das nicht mehrfach abgefragt wird
    10. Dim Pattern As New Text.RegularExpressions.Regex("{Zwangsgeldandrohungsbescheid\/Zwangsgeldfestsetzungsbescheid}", RegexOptions.Singleline)
    11. Try
    12. For Each m As Text.RegularExpressions.Match In Pattern.Matches(_TextOfDoc)
    13. ' hier liegt der Platzhalter vor
    14. Dim sDate_Androhung As String = "./."
    15. Dim sDate_Festsetzung As String = "./."
    16. If fKeyword.ContainsKey("DatumAndrohung") Then sDate_Androhung = fKeyword.Item("DatumAndrohung")
    17. If fKeyword.ContainsKey("DatumZwang") Then sDate_Festsetzung = fKeyword.Item("DatumZwang")
    18. Dim f As New frm_GsewGenehmigung_ZAndroh_ZFestsetz(sDate_Androhung, sDate_Festsetzung)
    19. With f
    20. If .ShowDialog = DialogResult.OK Then
    21. If .rb_Androhung.Checked = True Then
    22. If fKeyword.ContainsKey("Zwangsgeldandrohungsbescheid/Zwangsgeldfestsetzungsbescheid") = False Then fKeyword.Add("Zwangsgeldandrohungsbescheid/Zwangsgeldfestsetzungsbescheid", "Zwangsgeldandrohungsbescheid")
    23. Else 'Festsetzung
    24. If fKeyword.ContainsKey("Zwangsgeldandrohungsbescheid/Zwangsgeldfestsetzungsbescheid") = False Then fKeyword.Add("Zwangsgeldandrohungsbescheid/Zwangsgeldfestsetzungsbescheid", "Zwangsgeldfestsetzungsbescheid")
    25. End If
    26. Dim sDatumVorbescheid As String = .txt_DatumVorbescheid.Text
    27. If Not sDatumVorbescheid = "./." Then
    28. If fKeyword.ContainsKey("DatumVorbescheid") = False Then fKeyword.Add("DaumVorbescheid", sDatumVorbescheid)
    29. End If
    30. End If
    31. End With
    32. Exit For
    33. Next
    34. Catch ex As Exception
    35. MessageBox.Show("Fehler bei der Suche nach {}-Platzhaltern!" & Environment.NewLine & Environment.NewLine & ex.ToString, "Fehler", buttons:=MessageBoxButtons.OK, icon:=MessageBoxIcon.Warning)
    36. End Try
    37. End Sub



    Im weiteren Verlauf geht es um die Zeile 38.

    VB.NET-Quellcode

    1. If fKeyword.ContainsKey("DatumVorbescheid") = False Then fKeyword.Add("DaumVorbescheid", sDatumVorbescheid)


    Im Bereich der If-Abfrage ist der Key "DatumVorbescheid" noch nicht enthalten. Verfolge ich im Debugger die Add-Funktion, dann ist dort, wo der Wert zugewiesen wird dieser auch in dem Dictionary enthalten.

    Kehrt der Debugger wieder in "AnalyseZAndrohungFestsetzung" zurück, dann fehlt der Key "DatumVorbescheid" wieder.

    Ich dachte aber in der Zeile mit der Übergabe an die Funktion

    VB.NET-Quellcode

    1. ​Public Sub AnalyseZAndrohungFestsetzung(ByRef fKeyword As EBL.WordAddin.Properties, Optional Refresh As Boolean = False)


    alles richtig gemacht zu haben.

    Aber irgendwie funktioniert das nicht. Hmmmmm

    Kann mir einer weiterhelfen?

    Gruß Jan
    Hallo,
    Was mir sofort auffällt, deine Funktion ContainsKey gibt einen String anstelle eines Booleans zurück. Und in meinem einfachen Test mit deiner Klasse funktioniert das so wie von dir erwartet.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub Main
    2. Dim p As New Properties
    3. DoSomething(p)
    4. Console.WriteLine(p.Project) ' Gibt MyValue aus
    5. End Sub
    6. ' Define other methods and classes here
    7. Public Sub DoSomething(ByRef p As Properties)
    8. If Not p.ContainsKey("PROJEKT") Then
    9. p.Add("PROJEKT", "MyValue")
    10. End If
    11. End Sub
    Moin!

    erst einmal allen ein Danke für die Hilfe.

    Ich hatte einen Teil zunächst eine "Ebene" höher umgebaut - ohne Erfolg.

    Dann habe ich mir die Properties nochmal angesehen und etwas umgebaut.

    Jetzt funktionert das. Dann auch die Ebenenverschiebung rückgäng gemacht und auch das hat dann funktioniert.

    Jetzt kann ich feierabend machen!

    Jan