tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
1068
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    gott_ad gott_ad ist offline Mitglied
    Registriert seit
    Jul 2004
    Ort
    Rostock (MV)
    Beiträge
    16
    Hi,

    ich hab da mehr ein konzeptionelles Problem. Also ich habe ein Programm gebaut, dass ein Fenster anzeigt, dass fast leer ist. Links in diesem Fenster ist ne ToolBar mit 3 Buttons. Deren Beschriftung ist "Rot", "Gruen", "Blau". Wenn ich einen der Buttons drücke und dann auf den Hintergrund, zeichnet mir das Programm ein Kästchen in angegebener Farbe.
    So weit, so gut (also das Programm ist natürlich viel viel komplizierter, aber ich hab es jetzt mal vereinfacht).

    Jetzt hab ich mir überlegt, hätte ich auch gerne zusätzlich eine Steuerung über Console. D.h. ich habe nicht nur die Möglichkeit mit Maus zu aggieren, sondern es soll auch alles über Console gehen. In die schreibe ich dann: "add gruen 120 200" -> d.h. er würde einen grünen kasten an die Stelle 120, 200 auf dem Fenster setzen.

    Die Frage ist jetzt, wie man das schlau realisiert? Ich könnte jetzt einfach einen Befehlssatz erstellen, aber das find ich langweilig. Wie wäre es mit Reflection? Also eine Klasse durchsucht sich selbst und gibt seine Funktionsnamen aus oder ich versuch die Befehle direkt auf eine Funktion anzuwenden? Dann könnte er allerdings auch JEDE Funktion starten (was ja nicht sinnvoll wäre). Außerdem muss man ja vor dem nutzen von Invoke etc. erst ein Objekt dieser Klasse erstellen. Da weiß ich auch nicht wie das dann läuft, denn die eigentliche Instanz existiert ja schon.

    Also, falls jemand sowas schon mal gemacht hat oder mir einen Tip geben möchte, oder weitere Fargen hat, wäre ich sehr dankbar.

    gruß Gott_aD
     

  2. #2
    gott_ad gott_ad ist offline Mitglied
    Registriert seit
    Jul 2004
    Ort
    Rostock (MV)
    Beiträge
    16
    Hi,

    ich bins wieder. Hab mal selbst ein paar Experimente gestartet. Befehle einer Klasse per Refelction aufzurufen funktioniert tadellos. Hier mal das Beispiel dazu:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    
    using System;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Text;
     
    namespace Console_reflection_test {
                  class einstieg {
            static void Main(string[] args) {
                new Program();
            }
        }
     
     
        public class Program {
            private bool ErwarteEingabe;
     
            public void init() {
                Console.WriteLine("Funktion INIT");
            }
     
            public void help() {
                Console.WriteLine("Liste von Befehlen:");
                Type dieseKlasse = this.GetType();
                object dummy = new object();
                Type dummyKlasse = dummy.GetType();
                foreach (MemberInfo mi in dieseKlasse.GetMethods()) {
                    bool gleich = false;
                    foreach (MethodInfo mi_dummy in dummyKlasse.GetMethods()) {
                        if (mi.Name == mi_dummy.Name) { gleich = true; }
                    }
                    if ((!gleich)) { Console.WriteLine("\t" + mi.Name); }
                }
            }
     
            public Program() {
                ErwarteEingabe = true;
                Console.Title = "Konsolen Test";
                help();
                konsole();
            }
     
            private void konsole() {
                string zeile;
                Type dieseKlasse = this.GetType();
                while (ErwarteEingabe) {
                    Console.Write(">");
                    zeile = Console.ReadLine();
                    string[] teile = zeile.Split(' ');
                    object[] uebergabe = new object[teile.Length-1];
                    int count = -1;
                    foreach(string s in teile){
                        if (count >= 0) {
                            uebergabe[count] = s;
                        }
                        count++;
                    }
                    MethodInfo mi = null;
                    mi = this.GetType().GetMethod(teile[0]);
                    if (mi == null) {
                        Console.WriteLine("FEHLER: Funktion nicht gefunden!");
                    } else {
                        try {
                            mi.Invoke(this, uebergabe);
                        }catch (Exception ex2) {
                            Console.WriteLine("FEHLER: Uebergabeparameter sind falsch! (" + ex2.Message + ")");
                        }
                    }
                }
            }
     
            public void cu() {
                ErwarteEingabe = false;
            }
     
            public void add(string a, string b) {
                Console.WriteLine(Convert.ToInt32(a) + Convert.ToInt32(b));
            }
        }
    }
    Alle "public" Funktionen werden zu Anfang selbstständig ausgelesen (bzw. bei Eingabe von "help") und dann auch aufgerufen (wenn der Funktionsname in der konsole eingeben wurde). Einziger Nachteil ist, dass alle Parameter als strings ankommen, aber damit kann man leben (z.b. bei "add 5 3")

    Jetzt gibt es aber Probleme mit der GUI. Diese läuft ja in einem eigenen Thread (Application.Run). Wenn ich also jeweils eins der beiden sachen (GUI oder Konsole) in einen extra Thread packe (oder beide in einen extra Thread) dann laufen sie parallel (sonst läuft immer nur eine Sache und die andere erst nachdem die erste beendet wurde). Ich kann dann auch über die Konsole das Fenster ein bzw. ausblenden (ohne Probleme). Rufe ich aber über die Konsole eine Funktion der GUI auf, die der Form einen Button hinzufügt, ist das Fenster nicht mehr ansprechbar. Hat da jemand eine Lösung für mich?

    thx
     

  3. #3
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hallo gott_ad!

    Zitat Zitat von gott_ad
    Rufe ich aber über die Konsole eine Funktion der GUI auf, die der Form einen Button hinzufügt, ist das Fenster nicht mehr ansprechbar
    Controls dürfen nur von dem Thread angesprochen werden von dem sie erstellt wurden.
    Im Framework 2.0 wird jetzt sogar sowas wie eine IllegalThreadCrossException geworfen.
    Der Name ist mir jetzt nicht mehr so geläufig.
    Du musst also mit delegates arbeiten.
    Zitat Zitat von MSDN
    MethodBase.Invoke Method (Object, Object[])

    obj
    - The instance that created this method. ( Also dein Form, wenn static null )
    parameters
    - An argument list for the invoked method or constructor.
    @Kommunikation:
    Du hast doch alles fest vorgegeben, dann bietet sich für die Kommunikation zwischen
    deiner Console und deinem Form ein Interface bestens an.
    Du spaarst dir so das Suchen der Methoden und Funktionen, das dieses meines Erachtens
    nur für Diagnosezwecke von Modularisierten Programmen vorgesehen ist.
    Vor allem wird der Code übersichtlicher. Übergib es deiner Konsolen-Klasse einfach im Konstruktor.

    MfG, cosmo
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  4. #4
    gott_ad gott_ad ist offline Mitglied
    Registriert seit
    Jul 2004
    Ort
    Rostock (MV)
    Beiträge
    16
    Vielen Dank für die Antwort.
    Auf delegates bin ich noch nicht gekommen, so ganz hab ich die auch noch nicht durchschaut
    Aber das mit dem Interface ist ja auch ne schlaue Idee! War ja auch mehr zu testzwecken gedacht. Wahrscheinlich wird es statt einer richtigen Console auch einfach nur ein Windows-Textfenster geben, dass die Eingaben analysiert, damit sind dann beide auch im selben Thread.

    Thx!
     

Ähnliche Themen

  1. cmd über Java steuern
    Von pokke im Forum Java
    Antworten: 7
    Letzter Beitrag: 09.01.11, 15:04
  2. Download über php Steuern
    Von FlashMX im Forum PHP
    Antworten: 4
    Letzter Beitrag: 13.02.07, 03:05
  3. Interessanter IBM Artikel über die Eclipse OSGi Console
    Von Thomas Darimont im Forum Java Technology News
    Antworten: 0
    Letzter Beitrag: 30.01.07, 10:25
  4. [C#]: Methodeaufruf über XML steuern
    Von JKruse im Forum .NET Application und Service Design
    Antworten: 11
    Letzter Beitrag: 03.08.06, 11:45
  5. VPN über Webinterface steuern
    Von Ceppi im Forum Netzwerke
    Antworten: 3
    Letzter Beitrag: 15.05.06, 18:40