Announcement

Collapse
No announcement yet.

Listview Eintrag aus anderer Form ..

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Listview Eintrag aus anderer Form ..

    Hallo Liebe Forengemeinde.

    Ich benötige einmal eure Hilfe !

    Ich habe 2 Forms Eins davon beinhaltet ein Listview ( view=Details ) welches mir als Console bzw. LogFenster dienen soll ( Consolen Form ) . Auf dem 2 Form werden Diverse Operationen ausgeführt ( Arbeits Form ).

    Wenn ich jetzt von der Arbeitsform einen Eintrag ins Consolenform machen möchte ist es alles Kein Problem solange ich im GUI Thread Bin starte ich jetzt aber einen neuen Thread in der Arbeitsform dann bekomme ich keinen Eintrag mehr zustande.
    Zunächst dachte ich das ich das per invoke + Delegaten machen muss, aber leider vergebens ! Es klappt nicht ....

    Hier mein Testcode mit dem ich es versuche !


    ARBEITS FORM:

    Code:
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    
            For i As Integer = 0 To 100
    
                Threading.Thread.Sleep(3000)
    
                pt_console.LOGGING("MEINE MESSAGE ......", Color.Yellow)
    
            Next
    
    
        End Sub

    CONSOLEN FORM:

    Code:
    Public Delegate Sub eventlog_delegate(ByVal messagetext As String, ByVal messagecolor As Color)
    
        Public Sub LOGGING(ByVal messagetext As String, ByVal messagecolor As Color)
    
            If eventlog.InvokeRequired = True Then
                eventlog.Invoke(New eventlog_delegate(AddressOf entry_message), "DELEGATE:" & messagetext, messagecolor)
            Else
                entry_message(messagetext, messagecolor)
            End If
    
        End Sub
    
    
        Sub entry_message(ByVal messagetext As String, ByVal messagecolor As Color)
    
            eventlog.Items.Add(messagetext).ForeColor = messagecolor
            eventlog.EnsureVisible(eventlog.Items.Count - 1)
    
        End Sub
    
        Private Sub eventlog_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles eventlog.DrawItem
    
            e.DrawText()
    
        End Sub

    PS: Mir ist klar das ich as mit dem Backgroundworker auch per ProgressChanged changed machen kann, dann klappt es auch !

    Ziel der Sache soll aber sein das ich egal aus welchem Thread heraus eine message auf der Console ausgeben möchte, und nicht erst aus dem ProgressChanged nochmals einen Funktionsaufruf machen möchte. Zumal ich nicht jedes Mal mit einem BGW Arbeiten möchte sondern auch einfach so Threads Starten muss.

    Inderessant ist auch die Tatsache das wenn ich im Backgroundworker eine Nachricht an die Consolen Form schicke, kommt diese auch Problemlos dort an. Aber dort wiederum wird von meiner Prüfroutine
    Code:
    If eventlog.InvokeRequired = True Then
    Nicht erkannt das es sich um eine Anforderung aus einem Fremden Thread handelt.

    Ich wäre euch super Dankbar für eine Hilfestellung zu diesem Problem.

    Mfg: Lordnicon

  • #2
    Solltest du nicht den Aufruf der pt_console.LOGGING() Methode synchronisieren und nicht erst den Zugriff auf eventlog? Den die Form(?) hinter pt_console wird doch wohl zum Hauptthread gehören und nicht zu deinem Backgroundthread.

    Comment


    • #3
      Das hört sich Plausibel an, kannst du mir einen Tip geben wie die Syncronisation mit einer Methode gemacht wird ?

      Irgendwie sehe ich den Wald vor Bäumen nichtmer ...

      Wie müsste ich den Code korrekt ausführen?

      PS: Ja die Consolenform gehört mit zum Hauptthread und wird von der Arbeitsform direkt aufgerufen.

      Comment


      • #4
        Wie müsste ich den Code korrekt ausführen?
        Äh Genauso wie du es für eventlog gemacht hast. Nur eben jetzt für
        pt_console in deinem DoWork EventHandler?

        Code:
        pt_console.Invoke(pt_console.LOGGING, New Object() {"MEINE MESSAGE ......", Color.Yellow})

        Comment


        • #5
          Hi

          Ja sowasin der Art habe ich schon gemacht, dabei bekomme ich aber eine Exeption.
          Hier der Code mit dem ich aus dem Arbeitsform heraus aufgerufen habe

          Code:
          pt_console.Invoke(New pt_console.eventlog_delegate(AddressOf pt_console.entry_message), "MEINE MESSAGE", Color.Yellow)

          folgende Exeption lacht mich dann an ....

          Code:
          Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.

          Comment


          • #6
            folgende Exeption lacht mich dann an ....
            Das deutet daruf hin das du die Form noch nie angezeigt hast (weder mit Show noch ShowModal) solange hat die Form keinen gültigen Handle und du kannst noch nicht auf sie zugreifen(zumindest nicht so).
            Du solltest direkt nach dem erzeugen der Form einfach mal auf die Handle Property zugreifen. Das zwingt die Form einen Handle zu erzeugen.

            Code:
            Dim dummy As IntPtr = pt_console.Handle
            Irgendwie so. Dort wo du die Form erzeugst heißt die Variable wahrscheinlich nicht pt_console. Aber du wirst schon wissen durch durch welchen Namen du denn im Code ersetzen mußt

            Comment


            • #7
              Hallo

              So heute mit Frischen Gedanken hat alles geklappt...
              Ich habe das ganze Hadling der Console in eine Extra Klasse gepackt, und nun kann ich alles so machen wie ich möchte...

              Vielen Dank für deine Hilfe...

              PS: Heute erschien mir alles Logisch, ist schon manchmal komisch wie man so denkt wenn mansich mal festgefahren hat ...

              Mfg:

              Comment

              Working...
              X