Editor aus VB öffnen und string reinschreiben

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von greece57.

    Editor aus VB öffnen und string reinschreiben

    Hallo @ all :)
    Ich habe ein Frage - wen wunderts^^

    ich möchte von meinem Programm aus eine Liste von Fehlern ausgeben.
    Wenn ich das in einer MsgBox mache habe ich das Problem, dass der Benutzer später das ganze sich nicht rauskopieren kann falls er z.B. später in einem Txtdokument nach einer Fehlerhaften ID suchen will.
    Jetzt möchte ich das ganze so lösen, dass ich eine MsgBox mit dem Errorstring ausgeben und am Ende der MsgBox frage ob der User die Errorliste nochmal im Notepad angezeigt haben will (damit er sie rauskopieren kann)
    Falls der User ja andrückt soll sich eine neue (noch nirgendwo abgespeicherte (er wird den quatsch meistens nicht speichern wollen sonder nur für Copy-Paste verwenden wollen)) Txtdatei im Editor öffnen.
    Ist es verständlich was ich meine?

    Wie ich das mit der Ja/Nein MsgBox mache schaff ich :) Nur das mit dem Editor macht mir Probleme..

    Falls jmd eine bessere Lösung hat nur her damit! :)

    Grüße und danke im Vorraus
    Niko

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

    Du könntest doch die Fehlerausgabe in eine Datei schreiben, welche im Temp-Ordner erstellt wird, diese dann im Editor öffnen lassen und nachdem der Benutzer Notepad geschlossen hat die Datei löschen.
    Beispiel:

    VB.NET-Quellcode

    1. Sub test()
    2. Dim t As String, t2 As String, tmp As String
    3. Dim x As Long
    4. t = "***** Fehler Fehler Fehler Fehler Fehler Fehler Fehler *****"
    5. t2 = vbCrLf + vbCrLf + "--- Fehlermeldung in Notepad anzeigen? ---"
    6. tmp = "c:\greeze.txt"
    7. x = MsgBox(t + t2, vbYesNo + vbInformation, "Info")
    8. If x = vbYes Then
    9. Open tmp For Output As #1
    10. Print #1, t
    11. Close
    12. Shell ("notepad.exe " + tmp)
    13. Kill tmp
    14. Else
    15. MsgBox ("Nein gedrückt")
    16. End If
    17. End Sub

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

    Ich weiß nicht mehr aber hab das glaub ich entweder vb-archiv oder hier gefunden...
    Also das sendet dann deinen Fehler an ein Editor:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As IntPtr) As Integer
    3. Private Declare Function GetForegroundWindow Lib "user32" () As Integer
    4. Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer
    5. Private Const WM_SETFOCUS As Int32 = &H7
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Process.Start("Notepad.exe")
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. Dim p As Process = Process.GetProcessesByName("Notepad")(0)
    11. Clipboard.SetText(Me.TextBox1.Text)
    12. Me.Text = "in den vordergrundbringen"
    13. SetForegroundWindowEx(p.MainWindowHandle)
    14. Me.Text = "text senden"
    15. SendKeys.SendWait("^v")
    16. End Sub
    17. 'quelle: http://www.microsoft.com/germany/msdn/library/visualtools/vb6/FensterInDenDesktopVordergrundBringen.mspx?mfr=true
    18. ' Verwenden Sie die Funktion SetForegroundWindowEx statt der
    19. ' API Funktion SetForegroundWindow ausschließlich, wenn das
    20. ' betroffene Fenster tatsächlich in den Vordergrund gebracht
    21. ' werden muss.
    22. Private Function SetForegroundWindowEx(ByVal hWndWindow As Long) As Boolean
    23. ' Dient dem Setzen des Vordergrundfensters mit der Funktion
    24. ' SetForegroundWindow, die sich unter neueren Windows-Versionen
    25. ' anders verhält als unter Windows 95 und Windows NT 4.0.
    26. ' Der Rückgabewert ist True, wenn das Fenster erfolgreich in den
    27. ' Vordergrund gebracht werden konnte.
    28. Dim lThreadForeWin As Long ' Thread-ID für das aktuelle Vordergrundfenster
    29. Dim lThreadWindow As Long ' Thread-ID für das in hWndWindow spezifizierte
    30. ' Fenster, das in den Vordergrund des Desktops
    31. ' gebracht werden soll.
    32. ' Falls das Fenster dem gleichen Thread wie das aktuelle
    33. ' Vordergrundfenster angehört, ist kein Workaround erforderlich:
    34. lThreadWindow = GetWindowThreadProcessId(hWndWindow, 0)
    35. lThreadForeWin = GetWindowThreadProcessId(GetForegroundWindow(), 0)
    36. If lThreadWindow = lThreadForeWin Then
    37. ' Vordergrundfenster und zu aktivierendes Fenster gehören zum
    38. ' gleichen Thread. SteForegroundWindow allein reicht aus:
    39. SetForegroundWindowEx = CBool(SetForegroundWindow(hWndWindow))
    40. Else
    41. ' Das Vordergrundfenster gehört zu einem anderen Thread als das
    42. ' Fenster, das neues Vordergrundfenster werden soll. Mittels
    43. ' AttachThreadInput erhaten wir kurzzeitig Zugriff auf die
    44. ' Eingabeverarbeitung des Threads des Vordergrundfensters,
    45. ' so dass SetForegroundWindow wie erwartet arbeitet:
    46. SetForegroundWindowEx = CBool(SetForegroundWindow(hWndWindow))
    47. End If
    48. End Function
    49. End Class


    Ich habs also so verstanden ^^+
    Ich hab jetzt mal selber n bissl was probiert:

    VB.NET-Quellcode

    1. Shared Sub OpenStringInNotepad(Message As String)
    2. Dim p As New Process()
    3. p.StartInfo.RedirectStandardInput = True
    4. p.StartInfo.FileName = "Notepad.exe"
    5. p.StartInfo.UseShellExecute = False
    6. p.Start()
    7. p.StandardInput.AutoFlush = True
    8. For Each line As String In Message.Split(vbNewLine)
    9. p.StandardInput.WriteLine(line)
    10. 'p.StandardInput.Flush() - braucht man doch bei autoflush eig nicht oder?
    11. Next
    12. p.StandardInput.Close()
    13. End Sub


    Wäre das an sich ein Ansatz?
    Es funktioniert leider nicht - die Methode läuft zwar durch aber leider schreibt er nix rein :(

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

    Also ich habs jetzt Eierleins u. DeltaForce's Schema gemacht.
    Allerdings wusst ich nicht wie ich die Datei löschen soll wenn der User das Notepad geschlossen hat - das müsst ich dann ja in nem sepperaten Thread laufen lassen oder?

    VB.NET-Quellcode

    1. Shared Sub OpenStringInNotepad(Message As String)
    2. Dim p As New Process()
    3. Dim t As String, tmp As String
    4. t = Message
    5. tmp = "C:\Temp\___ErrorMessage.txt"
    6. My.Computer.FileSystem.WriteAllText(tmp, Message, False)
    7. p = Process.Start("notepad.exe", tmp)
    8. 'Weil sonst notepad noch nicht offen ist, bis notepad offen ist
    9. System.Threading.Thread.Sleep(500)
    10. Kill(tmp)
    11. End Sub


    Ist halt nicht totensicher die Methode, da wenn der PC es nicht schafft innerhalb von na halben Sekunde das Notepad mit der Datei zu öffnen die Message verloren ist.
    Jmd ne Idee wie ich das umgehen könnte? :/

    Und ich versteh nicht wieso das mit den Streams nicht funktioniert hat
    Kann mir das jmd erklären ?(

    Aber sonst danke für eure Hilfe! :)
    Gruß
    Niko

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

    erneut die frage, mit welchem Visual Basic PRogrammierst du?

    Visual Basic 2006 (/2005) oder VB.NET
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    In VB.NET! Sry dass ichs ausversehen falsch angegeben hatte!

    Hab übrigens jetzt auch das Problem mit dem Timer umgangen:

    VB.NET-Quellcode

    1. Public Class ToolsForms
    2. Shared WithEvents BGW As New System.ComponentModel.BackgroundWorker
    3. Shared Sub OpenStringInNotepad(Message As String)
    4. BGW.RunWorkerAsync(Message)
    5. End Sub
    6. Private Shared Sub BGW_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BGW.DoWork
    7. Dim p As New Process()
    8. Dim t As String, tmp As String
    9. t = e.Argument
    10. tmp = "C:\Temp\___ErrorMessage.txt"
    11. My.Computer.FileSystem.WriteAllText(tmp, e.Argument, False)
    12. p = Process.Start("notepad.exe", tmp)
    13. While Not p.HasExited
    14. Application.DoEvents()
    15. End While
    16. Kill(tmp)
    17. End Sub
    18. End Class


    Warum die Inputstreams nicht funktioniert haben versteh ich allerdings immer noch nicht
    @greece57: Es ist nicht nötig, wegen der Notepad-Anzeige einen BWG zu bemühen.
    Wenn sich das Notepad im InputIdle befindet, kann das File unten drunter gelöscht werden. :D
    Und er fragt beim Schließen nicht mal nach.
    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!
    Mit 'SCHELL' funktioniert auch das löschen.

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim t As String, tmp As String
    4. t = "***** Fehler Fehler Fehler Fehler Fehler Fehler Fehler *****"
    5. tmp = "d:\##\___ErrorMessage.txt"
    6. My.Computer.FileSystem.WriteAllText(tmp, t, False)
    7. Shell("notepad.exe " & tmp)
    8. Kill(tmp)
    9. End Sub
    10. End Module
    @ErfinderDesRades:
    Ou danke^^ Das wusst ich echt nicht 8|

    @RodFromGermany:
    Na toll xD Egal jetzt is auch schön :D

    @Eierlein:
    Was mich an der Shell Methode die ich anfangs auch hatte gestört hat, war dass Notepad oft im Hintergrund war und nicht nach vorne gepoppt ist ;)
    @greece57
    Was mich an der Shell Methode die ich anfangs auch hatte gestört hat, war dass Notepad oft im Hintergrund war und nicht nach vorne gepoppt ist


    Mit einer kleinen Änderung sollte es klappen:

    VB.NET-Quellcode

    1. ...
    2. Shell("notepad.exe " & tmp, 1)
    3. ...


    @FuFu^^
    Shell ist veraltet.


    Dann zeig' doch ein funktionierendes Beispiel mit Process.Start.
    einfach keine beschissenen VB6-HurrDurr-Clusterfuck-Methoden verwenden!


    Kill() ?( Wer benutzt so eine *#'§$%?! Nehmt System.IO :!:

    VB.NET-Quellcode

    1. Dim t As String, tmp As String
    2. t = "***** Fehler Fehler Fehler Fehler Fehler Fehler Fehler *****"
    3. tmp = "d:\___ErrorMessage.txt"
    4. System.IO.File.WriteAllText(tmp, t)
    5. Dim prcInfo As New ProcessStartInfo
    6. prcInfo.Arguments = Chr(34) & tmp & Chr(34)
    7. prcInfo.FileName = "notepad.exe"
    8. Process.Start(prcInfo)
    9. Threading.Thread.Sleep(300)
    10. System.IO.File.Delete(tmp)


    übrigens ginge es noch einfacher: mit

    VB.NET-Quellcode

    1. Process.Start(tmp)
    wird die Textdatei einfach mit dem Programm geöffnet, mit dem die Dateiendung verknüpft ist. Das ist auf fast allen Windowssystemen Notepad.