Dialog mit Processbar (Grafik wird nicht nachgeführt)

  • VB.NET

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

    Dialog mit Processbar (Grafik wird nicht nachgeführt)

    Moin!

    ich habe mir eine Form erstellt in der zweoi Processbar-Elemente sich befinden und eine Zahleninfo.

    Hier zunächst etwas Code:

    Form

    VB.NET-Quellcode

    1. Public Class frm_Processbar_Serienbrief
    2. Private _Count_Main As Integer = 0
    3. Private _Count_Sub As Integer = 0
    4. Private _Count_Total As Integer = 0
    5. Public Property Count_Total() As Integer
    6. Get
    7. Return _Count_Total
    8. End Get
    9. Set(ByVal Wert As Integer)
    10. _Count_Total = Wert
    11. End Set
    12. End Property
    13. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    14. lb_anzahl_sb.Text = _Count_Total.ToString
    15. pb_main.Maximum = _Count_Total
    16. pb_main.Value = 0
    17. pb_sub.Maximum = _Count_Total
    18. pb_sub.Value = 0
    19. End Sub
    20. Public Sub MainAdd()
    21. _Count_Main += 1
    22. UpdateProcessbar()
    23. End Sub
    24. Public Sub SubAdd()
    25. _Count_Sub += 1
    26. UpdateProcessbar()
    27. End Sub
    28. Public Sub UpdateProcessbar()
    29. pb_main.Value = _Count_Main
    30. pb_sub.Value = _Count_Sub
    31. tb_main.Text = _Count_Main.ToString
    32. tb_sub.Text = _Count_Sub.ToString
    33. End Sub
    34. End Class


    … und dann der Aufruf

    VB.NET-Quellcode

    1. .DataSource.ActiveRecord = 1
    2. _f = New frm_Processbar_Serienbrief
    3. _f.Count_Total = .DataSource.RecordCount
    4. _f.Show()
    5. Do
    6. .Destination = Word.WdMailMergeDestination.wdSendToNewDocument
    7. .SuppressBlankLines = True
    8. With .DataSource
    9. .FirstRecord = .ActiveRecord
    10. .LastRecord = .ActiveRecord
    11. End With
    12. .Execute(Pause:=False)
    13. CreateLetter(Print2Paper:=Print2Paper)
    14. If .DataSource.ActiveRecord < .DataSource.RecordCount Then
    15. .DataSource.ActiveRecord = Word.WdMailMergeActiveRecord.wdNextRecord
    16. Else
    17. Exit Do
    18. End If
    19. Loop
    20. _f.Close()
    21. _f.Dispose()


    Die Gesamtzahl vom Beginn wird angezeigt.

    Die Processbar und die Anzahlfelder werden nicht nachgeführt.



    Kann mir einer sagen, wie man das hinbekommt, dass die Grafik richtig nachgeführt wird?

    Gruß Jan
    Soweit ich das hier richtig sehe, hast du also eine Form erstellt, mit den 2 Progressbars. Diesee Form möchtest du aus einer eigenen Klasse heraus aufrufen, bevor eine Funktion ausgeführt wird (2ter Code-Teil) um darauf dann den progress von deiner Funktion anzuzeigen ?

    Wenn ja, sehe ich nirgends Code welcher den Progressbars sagt, hey ich wurde verändert, aktualisiere mal den Wert den du anzeigst. Mal abgesehen davon das ich gar nicht sicher bin, ob dies einfach so auf ein anderes Fenster umgemünzt werden kann, ohne das mit Delegaten und Co regeln zu müssen.

    Evtl. als Denkanstoß :

    Form mit der Schweren Aufgabe:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. HardSub()
    4. End Sub
    5. Sub HardSub()
    6. Dim f As New Form2(100, 100) 'Die 100er stellen das gewünschte Maximum der Progressbar´s dar kannst natürlich beliebig machen
    7. f.Show(Me)
    8. For i As Integer = 0 To 99
    9. f.pb1Step()
    10. Threading.Thread.Sleep(100)
    11. For o As Integer = 0 To 99
    12. f.pb2Step()
    13. Threading.Thread.Sleep(100)
    14. Next
    15. Next
    16. End Sub
    17. End Class



    Form mit nur 2 Progressbars
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form2
    2. Public Sub New(ByVal Progressbar1Maximum As Integer, Progressbar2Maximum As Integer)
    3. InitializeComponent()
    4. pb_1.Maximum = Progressbar1Maximum
    5. pb_2.Maximum = Progressbar2Maximum
    6. End Sub
    7. Public Sub pb1Step()
    8. pb_1.PerformStep()
    9. pb_1.Refresh()
    10. End Sub
    11. Public Sub pb2Step()
    12. pb_2.PerformStep()
    13. pb_2.Refresh()
    14. End Sub
    15. End Class


    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

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

    @jan99 WSenn die beiden Formen in einem Thread laufen, hakt es, wenn die eine massiv rechnet und die andere anzeigt.
    Vielleicht stellst Du die Progress-Form in einem andeen Thread in einer eigenen MessageLoop dar.
    Leider gibt es da für VB außer dem VisualBasic.SplashScreen kein ordentliches Beispiel, da pack ich Dir mal das C#-Beispiel rein.
    SplashScreen.zip
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Moin!

    ich habe mir das von dem SplashScreen einmal durch den Konverter gejagt und da gibt es eine Zeile

    VB.NET-Quellcode

    1. Private SplashThread As Thread


    Aber mit dem Variablen Typ "Thread" kann VS2019 nichts anfangen.

    Vorüber wird das definiert?

    Gruß Jan

    jan99 schrieb:

    Aber mit dem Variablen Typ "Thread" kann VS2019 nichts anfangen.
    nach 768 Posts im Forum :?:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    jan99 schrieb:

    Was macht man dann statt Threads?
    Wenn Du meinst, dass es im 19eer Studio keine Threads gibt, nimm das 17er Studio.
    Ansonsten mach ein Maus-HOver über dem Keyword und die IDE schlägt Dir vor, was zu tun ist.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Moin!
    irgendwie war ich mit dem ganzen Thread-Zeugs nicht klar gekommen und dachte irgendwie muss es doch auch so einen einfachen Dialog mit Prozessbar schon vordefiniert geben.

    Durch das Ausprobieren habe ich dann plötzlich gesehen, dass ich meine Klasse irgendwie in eine Form verwandelt hat und da hat mich das "Fieber" des Ausprobierens wieder gepackt.

    Bin auch schon etwas soweit gekommen, dass ein Dialog vorübergehend angezeigt wird und …. nun kann man ja etwas weiterbauen. Vielleicht führt es zum Erfolg.

    Das Problem liegt nun vermutlich noch darin, dass ich irgendwie nicht auf die Elemente der Form (z.B. die Processbar-Elemente) zugreifen kann. Bei einem Zugriff bekomme ich die Meldung, dass das Objekt nicht initialisiert ist und es wird auch Nothing angezeigt.

    Hier mein Code - leider finde ich den Spoiler nicht in der Editorleiste. Ein Zugriff erfolgt in CreateLetter - habe den Code etwas ausgedünnt - funktioniert aber so nicht.

    VB.NET-Quellcode

    1. Imports Word = Microsoft.Office.Interop.Word
    2. Imports System.Windows.Forms
    3. Imports System.Reflection
    4. Imports System.IO
    5. Imports System.Threading
    6. Public Class CreateSerienBriefEntwurf1
    7. Inherits Form
    8. '...
    9. Public Sub Create()
    10. ' ...
    11. With _objDoc.MailMerge
    12. If PlotPDFUmfang = WinWord.Tools.PlotPDFUmfang.AktuelleSeite Then
    13. CreateLetter(Print2Paper)
    14. Else
    15. If MessageBox.Show("Serienbriefe werden exportiert. Dieser Vorgang kann einige Minuten dauern!" & Environment.NewLine &
    16. "Winword wird während dieser Zeit ausgeblendet", k_App_Serienbrief_Entwurf, MessageBoxButtons.OKCancel, MessageBoxIcon.Information) = DialogResult.Cancel Then
    17. Exit Sub
    18. End If
    19. .DataSource.ActiveRecord = 1
    20. _Count_Total = .DataSource.RecordCount
    21. Me.Show()
    22. For i As Integer = 1 To .DataSource.RecordCount ' nicht mit 0 beginnend wegen der Überschrift
    23. '.Destination = Word.WdMailMergeDestination.wdSendToNewDocument
    24. .SuppressBlankLines = True
    25. With .DataSource ' Bereich der ausgegeben werden soll in dieses Dokument - immer nur das eine aktuelle im virtuellen Durchblättern
    26. .FirstRecord = i
    27. .LastRecord = i
    28. End With
    29. CreateLetter(Print2Paper:=Print2Paper)
    30. Try
    31. .DataSource.ActiveRecord = Word.WdMailMergeActiveRecord.wdNextRecord
    32. Catch ex As Exception
    33. If ex.ToString.IndexOf("System.Runtime.InteropServices.COMException (0x800A16DD): Ungültiger Parameter") > -1 Then
    34. _Report += "*** INFO **** -> wechsel auf nächsten Datensatz (vermutlich leerer Datensatz)" & Environment.NewLine
    35. Else
    36. _Report += "*** FEHLER **** -> wechsel auf nächsten Datensatz" & Environment.NewLine & "Meldung:= " & ex.ToString & Environment.NewLine
    37. _CountError += 1
    38. End If
    39. End Try
    40. Next
    41. 'Loop
    42. Me.Hide()
    43. End If
    44. End With
    45. 'Report zur Serienbrieferstellung
    46. ' Hervorheben, wenn Fehler
    47. Dim MsgMain As String = _CountMainPath.ToString
    48. If _CountMainPath > 0 Then MsgMain += " <<<< ********"
    49. Dim MsgErr As String = _CountError.ToString
    50. If _CountError > 0 Then MsgErr += " <<<< ********"
    51. Dim MsgMissingGrundstück As String = _CountMissingGrundstück.ToString
    52. If _CountMissingGrundstück > 0 Then MsgMissingGrundstück += " <<<< ********"
    53. _Report += Environment.NewLine & Environment.NewLine & "--- Report-Ende"
    54. Dim Text4Report As String = String.Format(_Report, MsgMain.ToString, _CountSubPath.ToString, MsgErr, _CountWarnung, _CountInfo, MsgMissingGrundstück)
    55. Dim fs As FileStream = New FileStream(System.IO.Path.Combine(System.IO.Path.GetTempPath, "EBL_Serienbrief_Entwurf_" & Format(Now, "yyyy-MM-dd_HHmmss") & "_" _
    56. & _CurrentSubject & ".log"), FileMode.Create, FileAccess.Write)
    57. Dim w As StreamWriter = New StreamWriter(fs)
    58. w.Write(Text4Report)
    59. Dim f As New frm_Report(Text4Report)
    60. f.ShowDialog()
    61. End Sub
    62. Private Sub CreateLetter(Optional Print2Paper As Boolean = False, Optional WithProcessbar As Boolean = False)
    63. '...
    64. If System.IO.Directory.Exists(FolderNameSub) = True Then ' es gibt das Schriftverkehrsverzeichnis
    65. docFullPath = System.IO.Path.Combine(FolderNameSub, BriefFileName)
    66. _CountSubPath += 1
    67. Me.pb_sub.PerformStep()
    68. Else ' Ablage im Hauptverzeichnis
    69. docFullPath = System.IO.Path.Combine(LageBezeichnung, BriefFileName)
    70. _CountMainPath += 1
    71. ' If WithProcessbar = True Then _f.MainAdd()
    72. End If
    73. '...
    74. End Sub
    75. ''' <summary>
    76. ''' prüfen, ob erforderliche Datenfelder vorhanden
    77. ''' </summary>
    78. ''' <returns></returns>
    79. '....
    80. Private Sub InitializeComponent()
    81. Me.tb_sub = New System.Windows.Forms.TextBox()
    82. Me.pb_sub = New System.Windows.Forms.ProgressBar()
    83. Me.tb_main = New System.Windows.Forms.TextBox()
    84. Me.pb_main = New System.Windows.Forms.ProgressBar()
    85. Me.SuspendLayout()
    86. '
    87. 'tb_sub
    88. '
    89. Me.tb_sub.Enabled = False
    90. Me.tb_sub.Location = New System.Drawing.Point(633, 62)
    91. Me.tb_sub.Name = "tb_sub"
    92. Me.tb_sub.Size = New System.Drawing.Size(57, 20)
    93. Me.tb_sub.TabIndex = 7
    94. '
    95. 'pb_sub
    96. '
    97. Me.pb_sub.Location = New System.Drawing.Point(12, 62)
    98. Me.pb_sub.Name = "pb_sub"
    99. Me.pb_sub.Size = New System.Drawing.Size(615, 29)
    100. Me.pb_sub.TabIndex = 6
    101. '
    102. 'tb_main
    103. '
    104. Me.tb_main.Enabled = False
    105. Me.tb_main.Location = New System.Drawing.Point(633, 21)
    106. Me.tb_main.Name = "tb_main"
    107. Me.tb_main.Size = New System.Drawing.Size(57, 20)
    108. Me.tb_main.TabIndex = 5
    109. '
    110. 'pb_main
    111. '
    112. Me.pb_main.Location = New System.Drawing.Point(12, 21)
    113. Me.pb_main.Name = "pb_main"
    114. Me.pb_main.Size = New System.Drawing.Size(615, 29)
    115. Me.pb_main.TabIndex = 6
    116. '
    117. 'CreateSerienBriefEntwurf1
    118. '
    119. Me.ClientSize = New System.Drawing.Size(1148, 261)
    120. Me.Controls.Add(Me.tb_sub)
    121. Me.Controls.Add(Me.pb_sub)
    122. Me.Controls.Add(Me.tb_main)
    123. Me.Controls.Add(Me.pb_main)
    124. Me.MaximizeBox = False
    125. Me.MinimizeBox = False
    126. Me.Name = "CreateSerienBriefEntwurf1"
    127. Me.ResumeLayout(False)
    128. Me.PerformLayout()
    129. End Sub
    130. Private Sub CreateSerienBriefEntwurf1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    131. 'lb_anzahl_sb.Text = _Count_Total.ToString
    132. Me.pb_main.Maximum = _Count_Total
    133. Me.pb_main.Value = 0
    134. Me.pb_sub.Maximum = _Count_Total
    135. Me.pb_sub.Value = 0
    136. End Sub
    137. End Class


    Kann mir einer sagen, wo ich die Controls initialisieren muss und wie??

    Gruß Jan
    hmm - sorry, bei dem Programmierstil ("Ausprobier-Fieber") glaub ich nicht, dass du das Problem lösen kannst.
    Allenfalls könntest du eine lauffähige Solution anhängen, die dein Problem reproduziert.
    Sodass jmd. anders es für dich lösen kann.



    Zu

    jan99 schrieb:

    leider finde ich den Spoiler nicht in der Editorleiste


    Vlt hilft
    Ups - nee, hilft vmtl auch net, weil den Spoiler habich da garnet besprochen.
    Also hier wie obiger Spoiler gemacht ist:

    Quellcode

    1. [spoiler='Forum-Funktionalität – Klick mich!'][media]http://www.youtube.com/watch?v=4E-ClVQJHrY&feature=youtu.be[/media][/spoiler]

    Den Tag [spoiler] gibts bei mir allerdings in der Editor-Leiste.

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

    jan99 schrieb:

    so einen einfachen Dialog mit Prozessbar
    Eigentlich nicht.
    Und mein Post ist ein Dialog, der in einem anderen Thread in einer eigenen MessageLoop läuft.
    Das garantiert, dass da nix hängt und dieser Dialog bei hängendem Hauptfenster eben nicht hängt.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!