none
RichTextBox von anderer Klasse editieren RRS feed

  • Frage

  • Hallo zusammen,

    ich habe (mal wieder...) zwei Fragen.

    1. ich versuche mich gerade an einer Form die eine Art "Debugconsole" darstellt. Dort werden auf einer RichTextBox verschiedene Dinge ausgegeben. 

    Dies funktioniert auch gut, so lange die Einträge die ich per AppendText("") einfüge in derselben Klasse sind in der ich Form.Show() aufrufe.

    Wenn ich nun in einer anderen Klasse versuche einen Eintrag hinzuzufügen passiert allerdings nichts. Ich hole mir die Form mit showDebug debug = new showDebug(); in die zweite Klasse. Daraufhin versuche ich mit debug.rtbConsoleDebug.AppendText(""); einen Text anzuhängen. Allerdings passiert daraufhin einfach nichts.
    Es wird keine Fehlermeldung oder ähnliches ausgegeben, es passiert nur einfach nichts.

    Irgendeine Idee was ich machen muss damit ich die RichTextBox in meiner anderen Klasse verändern kann?

    showDebug ist die Debug Form
    rtbConsoleDebug ist die RichTextBox

    2. Mein Programm führt eine Java Anwendung aus, bisher allerdings mit der java.exe.
    Mein Ziel ist es allerdings das ich dies über die Console starte und der Output der Anwendung dann automatisch in die RichTextBox geschrieben wird. Derzeit führe ich nach dem process.Start(); ein process.WaitForExit(); aus da nach beenden der Java Anwendung noch etwas erledigt werden soll.

    Falls ich etwas vergessen haben sollte, sagt es mir bitte.

    Gruß 

    Christian


    Viele Grüszlig;e aus Stuttgart
    Christian Holzwarth

    Mittwoch, 12. März 2014 22:10

Antworten

  • Hallo,

    zu 1.
    Wenn du new XYZ() aufrufst, wird eine neue Instanz von XYZ erstellt. Diese ist vollkommen unabhängig von der zuvor erstellten Instanz. Du musst also auf die selbe Form zugreifen.
    Ich nehme mal an, das du in Main die Debug-Konsole erstellst und anzeigst. Dann kannst du dir dort den Verweis auf die Form-Instanz in einer statischen Klasse ablegen. Da statische Klassen überall die selben Daten enthalten, erscheinen die Texte dann auch in der Debug-Form:

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
    //Nachfolgende 2 Zeilen nur hier aufrufen. Sonst nicht mehr! CommonData.Debug = new DebugForm();//Form erzeugen CommonData.Debug.Show();//Form anzeigen CommonData.Debug.Append("Debug-Form angezeigt");//Deine Methode zum ausgeben einer Nachricht aufrufen, diese Zeile funktioniert nun überall im Projekt. Application.Run(new Form1()); } } public static class CommonData { public static DebugForm Debug { get; set; }//Instanz der Debugform, die wärend der Laufzeit immer die gleiche ist }

    zu 2.
    Ich kenne mich nicht wirklich mit Java aus, deswegen kann ich da auch nicht viel zu sagen. Wenn Java-Konsolen über das Konsolensystem von Windows funktionieren, dürfte dieser Weg funktionieren. Sonst kann ich dir bei diesem Problem leider nicht weiter helfen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 12. März 2014 22:25
    Moderator

Alle Antworten

  • Hallo,

    zu 1.
    Wenn du new XYZ() aufrufst, wird eine neue Instanz von XYZ erstellt. Diese ist vollkommen unabhängig von der zuvor erstellten Instanz. Du musst also auf die selbe Form zugreifen.
    Ich nehme mal an, das du in Main die Debug-Konsole erstellst und anzeigst. Dann kannst du dir dort den Verweis auf die Form-Instanz in einer statischen Klasse ablegen. Da statische Klassen überall die selben Daten enthalten, erscheinen die Texte dann auch in der Debug-Form:

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
    //Nachfolgende 2 Zeilen nur hier aufrufen. Sonst nicht mehr! CommonData.Debug = new DebugForm();//Form erzeugen CommonData.Debug.Show();//Form anzeigen CommonData.Debug.Append("Debug-Form angezeigt");//Deine Methode zum ausgeben einer Nachricht aufrufen, diese Zeile funktioniert nun überall im Projekt. Application.Run(new Form1()); } } public static class CommonData { public static DebugForm Debug { get; set; }//Instanz der Debugform, die wärend der Laufzeit immer die gleiche ist }

    zu 2.
    Ich kenne mich nicht wirklich mit Java aus, deswegen kann ich da auch nicht viel zu sagen. Wenn Java-Konsolen über das Konsolensystem von Windows funktionieren, dürfte dieser Weg funktionieren. Sonst kann ich dir bei diesem Problem leider nicht weiter helfen.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 12. März 2014 22:25
    Moderator
  • Hi,

    Hat Dir die Antwort von Tom geholfen ? Wenn ja - bitte markiere diese "als Antwort".

    Danke und Gruß,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Hi,

    sorry komme erst jetzt zum Antworten :/

    Und ja. Bei 1. hat er mir (mal wieder) geholfen, das läuft jetzt. Danke dafür schonmal.

    An meinem Punkt 2 verzweifle ich allerdings... Ich bekomme es nicht fertig das der Output der Java Console (ja wird ganz normal auf der Windows CMD ausgegeben) direkt an die RichTextBox übergeben wird.

    Habe es jetzt einmal so versucht, die Anwendung startet auch, die Console bleibt wie gewünscht im Hintergrund (unsichtbar). Aber der Output der Console wird nicht in meiner RichTextBox ausgegeben:

    start.StartInfo.CreateNoWindow = true; start.StartInfo.RedirectStandardOutput = true; start.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler); start.Start(); start.BeginOutputReadLine(); while (!start.HasExited) { Application.DoEvents(); // This keeps your form responsive by processing events } // und so lautet der Eventhandler private static void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { if (!String.IsNullOrEmpty(outLine.Data))
    {

    string newLine = outLine.Data.Trim() + Environment.NewLine; MethodInvoker append = () => CommonData.debug.rtbDebugConsole.AppendText(newLine); CommonData.debug.rtbDebugConsole.BeginInvoke(append); } }

    Allerdings passiert so genau gar nichts... und ich weis grad nicht so wirklich was ich falsch mache.

    Gruß

    Christian


    Viele Grüszlig;e aus Stuttgart
    Christian Holzwarth

    Donnerstag, 13. März 2014 21:05
  • Ok, moment mein Fehler.

    Die Java Consolenausgabe scheint doch anders zu sein... habe es soeben mit einem normalen Ping versucht und dieser wird ohne Probleme ausgegeben.

    Dachte zuerst dies würde wie eine normale Console gehandhabt... wohl nicht.

    Hat jemand eine Idee wie ich eine Java Consolen Ausgabe so abfangen kann wie wenn ich einen normalen Konsolenbefehl ausführe?

    Gruß

    Christian


    Viele Grüße aus Stuttgart
    Christian Holzwarth



    Donnerstag, 13. März 2014 21:30