Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von trib
Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo jannemann13 ,

vorab: Getestet und für gut befunden :)
Du bist dran!

Zum Code:
Der sieht für mich vollkommen in Ordnung aus. Mir ist nur aufgefallen, dass ich mit einem Array weniger ausgekommen bin. "_magnitude1" ist ja quasi bis auf ein/eins in "_lessThan20" enthalten.

Meine Lösung:
Die Arrays:

        static string [] upTo20 = new string[]{"Null", "ein", "zwei", "drei", "vier", "fünf",
              "sechs", "sieben", "acht", "neun", "zehn", "elf",
              "zwölf", "dreizehn", "vierzehn", "fünfzehn",
              "sechzehn", "siebzehn", "achtzehn", "neunzehn"};

        static string[] ten = new string[]{"Null", "zehn", "zwanzig", "dreissig", "vierzig",
                "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig"};

        static string[] singular = new string[]{"s", "tausend", "e Million", "e Milliarde",
                    "e Billion", "e Billiarde", "e Trillion", "e Trilliarde",
                    "e Quadrillion", "e Quadrilliarde"};

        static string[] plural = new string[]{" ", "tausend", " Millionen", " Milliarden",
                    " Billionen", " Billiarden", " Trillionen", " Trilliarden",
                    " Quadrillionen", " Quadrilliarden"};
Dreier-Pakete schnüren:

        private static string Speak(long number)
        {
            string result = string.Empty;
            double maxNo = Math.Pow(10, (3 * singular.Length)); //10*3*10
            if(number ≥ maxNo)
		        return "Nummer ist zu groß!!!";

            if (number == 0)
                return "null";

           //number in Dreiergruppen aufspalten:
	        int[] group = new int[(number.ToString().Length / 3)+1];
	        int i = 0;
	        while( number > 0)
            {			        
		        group[i++] = Convert.ToInt32(number % 1000);
                number = number / 1000;
	        }

            //Dreiergruppen von links nach rechts aussprechen:	        
            i = group.Length -1;
	        while(i ≥ 0)
            {
                result += SpeakTrifurcator(group[i], i) + "\n";
                i--;
	        }
            return result;
        }
Dreier-Zahlen aussprechen:


        private static string SpeakTrifurcator(int number, int position)
        {
            string result = string.Empty;
            
            if(number == 0)                
                return string.Empty;
            if (number == 1)
                return upTo20[number] + singular[position];
            
            int hundred = number / 100;
            int rest = number % 100;
            int tenth = rest / 10;
            int first = number % 10;

            //Make it speak
            if (hundred > 0)
                result += upTo20[hundred] + "hundert";
	
            //Do the rest
            if (rest > 0)
            {                
                // Sonderfall: number endet auf 01,
                // ist aber ungleich 1
                if (rest == 1)
                    result += "eins";
                else
                    if (rest < 20)
                        result += upTo20[rest];
                    else
                    {
                        if (first > 0)
                            result += upTo20[first];
                        // sage "und", wenn es Einer-
                        // und Zehneranteile vorhanden
                        if (tenth > 0 & first > 0)
                            result += "und";
                        // Zehneranteil aussprechen:
                        if (tenth > 0)
                            result += ten[tenth];
                    }
            }
            return result + plural[position];
        }

Thema: Echte Client/Server-Applikation vs. Remote Desktop
Am im Forum: Smalltalk

Zitat von gfoidl
Vermutlich handelt es sich aber um eine Lösung wie z.B. von Citrix und dann passt das schon wieder.

Das muss es aber nicht. Per RDP kann ich mittlerweile ebenfalls nur Applikationen freigeben und als Verknüpfung bereitstellen.
Der Name Remote Desktop Protokoll hinkt etwas ;)

Darin sehe ich aber keine Schwierigkeit, sondern den Vorteil, dass ich im Zuge eines Updates nur zentral ein Server die neue Software ausgeliefert bekommt. Weiterhin werden Komplikationen ausgeschlossen ("Bei mir geht aber das & das nicht"). Ist doch prima!

Auf der anderen Seite steht nun die Software. Mir ist aktuell keine bekannt, wo ich gleichzeitig einen Datensatz mit mehreren Personen bearbeiten kann. Dabei muss es doch schon aus rein logischen Gründen zu Redundanzen oder Überschneidungen kommen. (Bei Transaktionen werden immer die Ganzen Datensätze übermittelt. Nicht nur einzelne Felder)
Access geht z.B. nach dem Prinzip vor, wer zu Letzt kommt mahlt zu erst und speichert immer die Daten des letzten Bearbeiters. Alternativ dazu werfen andere Programme Fehlermeldungen "Ein anderer Anwender bearbeitet diesen Datensatz". (Dabei trifft es im Gegensatz zu Access den, der zu Letzt kommt).

Daher ist das nicht sonderlich ungewöhnlich. Die Fragen dich sich mir stellen:
  • Was passiert, wenn man sich nicht abspricht und einen DS bearbeitet?
  • Welche Software unter Mac kennst du denn, die die o.g. Probleme nicht hat?

Thema: RS232: HM28 Digital Manometer: Alle gesendeten Befehle außer "Remote" liefern einen Fehler
Am im Forum: Rund um die Programmierung

Hallo msmike68,

es gibt etliche (sehr gute) Klassen, die dir einen Teil der Arbeit abnehmen und auch etwas "eleganter" programmiert sind. z.B. ohne diesem ganzen Byte gecaste :)
Template Serial Com Port

Nun aber zu dem eigentlichen Problem:
Auf den Ersten Blick sollten die Einstellungen soweit korrekt sein. Du sendest die Prüfsumme und abschließend das CR. Aus meiner Erfahrung reicht das aber oft nicht aus. Versuch einfach mal den Befehl zusätzlich mit einem LineFeed abzuschließen. (Der Com-Controller hat manchmal die Eigenschaft was zu cachen, bis der Befehl fertig zusammengebaut ist. Das erledigt alternativ der Befehl ComPort.WriteLine() )
Weiterhin solltest du mal das Property "DtrEnable" ausprobieren. Das wirkt oftmals Wunder :D
Bedeutet "Data Terminal Ready" und prüft ob das Gerät bereit ist eine Abfrage zu empfangen.

Was sich sonst immer empfiehlt ist ein Tool, was im Hintergrund die Daten mitschneidet. Damit kann man sofort erkennen ob ggf. das Gerät antwortet, aber das Programm nicht reagiert o.ä.

Zu guter Letzt: Bau dir eine GUI mit allen Einrichtungsparametern und probier alles mögliche aus. Das ist bei manchen Geräten der Einzige Weg :(

Thema: [erledigt] MDIChild ohne Icon im maximierten Zustand
Am im Forum: GUI: Windows-Forms

Hi,

es gibt noch eine andere Lösung, die ich immer verwende.
Im MDIChild_Activated weise ich einfach eine Kopie des Icons zu:


           // Fixes bug where loading form maximised in MDI window shows incorrect icon.
            this.Icon = Icon.Clone() as Icon;

Ob das die eleganteste Lösung ist, weiß ich nicht. Sie funktioniert aber

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Da sich bisher noch niemand gemeldet hat, gebe ich noch schnell zwei entscheidende Tipps:
(Wer sich dessen schon angenommen hat, sollte hier ggf. nicht weiterlesen )

  • Die Hunderter, Tausender, usw. habe ich absichtlich weggelassen, da diese optimaler Weise auf zwei Arrays aufgeteilt werden müssen. Und zwar in singular & plural.
  • Die Eingabe wird in Dreiergruppen aufgespaltet und verarbeitet!

Ansonsten: Kritik oder Anregungen?
Zu einfach, zu langweilig, gibt es schon 100fach im Internet?

Thema: Cloud-Speicher? Skydrive, Dropbox, Google Drive & Co - Wer nutzt was?
Am im Forum: Smalltalk

Das klappt aber dementsprechend nicht auf mobilen Geräten, oder?
Zum Austausch zwischen 2 Rechnern auf jeden Fall eine adäquates Sicherheitsfeature :)

Wahrscheinlich geht der Trend dahin, eine Lösung pro Anwendungsfall zu nutzen. Normalerweise benötige ich auf dem Handy nur einen Bruchteil der Daten, die ich zwischen den Rechnern austausche...

Thema: Starten einer Exe mit einem Windows Dienst mit einem passenden Benutzer
Am im Forum: Rund um die Programmierung

Hallo omega90,

ich benutze immer den Root-Pfad des Webservices (z.B. "127.0.0.1/myWebservice/WS/Services") und kann dann auf die verschiedenen Elemente zugreifen.
Der Hintergrund dazu: Ich habe nicht für jedes Webservice Element eine Referenz in Visual Studio, sondern nur eine einzige und initialisiere diese dann mit dem entsprechenden Ziel.

Hast du in Visual Studio unter den WebReferences schon den kompletten Webservice-Pfad angegeben, kannst du dir diesen Schritt natürlich sparen und einfach "myWebServices" durch den von dir vergebenen Namen austauschen.

Das sind aber imho Grundlagen.

Thema: Cloud-Speicher? Skydrive, Dropbox, Google Drive & Co - Wer nutzt was?
Am im Forum: Smalltalk

Da ich ebenfalls einen Androiden habe, hat sich mein Google-Docs automatisch zu Google-Drive gewandelt. Das nutze ich aber weiterhin nur für Dokumente und auf Desktop-Ebene ausschließlich per Browser. Die Explorer-Integration habe ich nicht installiert.

Die Dropbox war nach einem Firmware-Update mit an Bord und hat sich durch einen kleinen Trick um 20GB erweitert. Daher nutze ich diese jetzt um meine Fotos automatisch zu sichern, sobald ich im WLAN bin. Das funktioniert hervorragend!
Weiterhin tausche ich damit zwischen dem Firmen PC und dem Privat-Rechner Dateien aus, die ich als nicht "High Confidential" einstufe.
Unter "Favoriten" findet sich im Explorer nun ein Ordner, der die DB abbildet.
Ein Webinterface gibt es auch. Öffentliche Freigaben können auch nur dort vorgenommen werden.

Für private Dateien habe ich eine Netzwerkfestplatte mit FTP-Funktion. Die ist aber ziemlich lahm.

Thema: Das Programmier-Spiel: nette Übungsaufgaben für zwischendurch
Am im Forum: Smalltalk

Hallo "Spieler"

da sich noch keiner erbarmt hat und Alf Ator es freigestellt hat sich dazwischen zu drängeln, hier eine Aufgabe aus dem Alltag.

Letzte Woche stand ich vor folgendem Problem:

Eine Erinnerungsfunktion sollte um eine Sprachausgabe erweitert werden und mir ein paar Informationen nennen.
Darunter die aktuelle Uhrzeit und die Dauer zum nächsten Termin.

Wie spreche ich nun also nach allen Regeln der deutschen Sprache korrekt ganze Zahlen aus?

Ganz klar, folgende Wörter sind obligatorisch:

string [] bis20 = new string[]{"Null", "ein", "zwei", "drei", "vier", "fünf",
              "sechs", "sieben", "acht", "neun", "zehn", "elf",
              "zwölf", "dreizehn", "vierzehn", "fünfzehn",
              "sechzehn", "siebzehn", "achtzehn", "neunzehn"};

string[] zehner = new string[]{"Null", "zehn", "zwanzig", "dreissig", "vierzig",
                "fünfzig", "sechzig", "siebzig", "achtzig", "neunzig"};
Um es noch etwas schwieriger zu machen, brauchen wir auch noch Hunderter, Tausender, bis zur einer Milliarde (Zahlennamen).
(Es hat einen speziellen Grund, weshalb ich diese nicht als string[] oben mit eingefügt habe)

Nun kann man schon fleißig los programmieren und schnell wird klar, dass noch ein und her muss. Die Ausgaben scheinen auch schon zu funktionieren:
Fünfhundertsechsundzwanzig
Zweihundertsieben ("und" bei einer Null an der Zehnerstelle nicht unbedingt notwendig)
Hundertein => Fehler!
Also noch eine Unterscheidung mehr und wir sind am Ende angekommen.

Oder?

[EDIT] Auf Anraten von herbivore möchte ich die Aufgabe auf folgenden Zahlenbereich deckeln:
0 bis 1 000 000 000 (eine Millarde).
Den Bereich noch weiter zu erhöhen ist schließlich nur Fleißarbeit.

Thema: Software prüfen, ob auf Windows CE lauffähig
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hi,

es ist für CE und Windows Mobile (Welches CE mit den Telefonfunktionalitäten ist) zwingend notwendig Visual Studio 2008 oder älter zu nutzen.
Dann kann man sich die entsprechende SDK runterladen und ein CE Gerät emulieren.

Du kannst z.B. "Windows Mobile 6.5 Professional Developer Tool Kit (GER)" installieren und hast dann CE & Win Mobile Emulatoren zur Verfügung.

Thema: GUI API für embedded Systeme
Am im Forum: Rund um die Programmierung

Zitat von Osirisbob2406
Hintergrundbilder für Buttons etc. selber zu erstellen dürfte aber das kleinste Problem sein, oder was meint ihr?
Das Design an sich meine ich nicht. Sondern, dass CE keine Möglichkeit für Hintergrundbilder von Buttons bietet. Das Compact Framework sieht dies einfach nicht vor.
Natürlich kann man "einfach" vom Standard Button ableiten und das OnPaint überschreiben. Da hätte ich auch schon was fertig...

Worauf ich aber hinaus wollte, ist dass es mehrere Stellen gibt wo sich CE anders verhält als das die Desktopversion vom Framework. Das DataGrid im Gegensatz zum DataGridView ist z.B. ein weiteres Beispiel.
Man muss sich dort einfach mal reinarbeiten. Nur eine 1:1 Portierung einer Desktopanwendung ist nicht möglich.
Das ist auch was winSharp93 mein. Persönlich sehe ich das ähnlich, würde es aber je Anwendungsfall differenzieren. Benötigst du wirklich nur ein paar Button und ein paar Eingabefelder, so tendiere zu CE. Möchtest du wirklich mit WPF ein schickes Programm designen, musst du wohl 1 Minute Startzeit in Kauf nehmen müssen.

Bzgl. Linux:
Dort fehlen dir natürlich die umfangreichen Funktionalitäten des Frameworks. Dazu der o.g. Tipp mit Mono.

Thema: GUI API für embedded Systeme
Am im Forum: Rund um die Programmierung

Hallo zusammen,

Um mal kurz auf die grafischen Möglichkeiten von CE einzugehen:
Es gibt ein (verrücktes) Entwicklerteam, was die Oberfläche von WindowsPhone 7 nachempfunden hat.
Leider finde ich den Link gerade aufs verderben nicht :(
Allerdings gibt es auch eine iPod Touch UI. Das ist nur halb so beeindruckend, aber besser als nichts:
iPhone-UI-in-Windows-Mobile

Wie aber schon genannt wurde, ist es schon etwas ganz anderes für CE zu programmieren als für die Desktopversion. Angefangen bei Hintergrundbildern für Buttons, die sicherlich für deinen Anwendungsfall unabdingbar sein werden. Die darf man sich nämlich auch schon selbst erstellen...

Windows Embedded Standard 8 kommt ja nun auch bald...

Thema: Starten einer Exe mit einem Windows Dienst mit einem passenden Benutzer
Am im Forum: Rund um die Programmierung

Genau, der Windowsdienst muss den Webservice und dessen Anmeldung kennen.

Dazu baue ich mir immer eine Helfer-Klasse, die mir zentral ermöglicht zwischen dem Windowsuser und hinterlegten Daten zu wechseln.

Aufruf:


            myWebServices = new WebServices.MyMainService_Binding();
            myWebServices.UseDefaultCredentials = Webservice.UseDefaultCredentials;
            if (!Webservice.UseDefaultCredentials)
            {
                myWebServices.Credentials = Webservice.Credential;
            }
            if (Webservice.UseProxy)
                myWebServices.Proxy = Webservice.Proxy;
Webservice.cs:


 public static class Webservice
    {
        /// <summary>
        /// Das Event wird angesprochen, wenn die Credentials verwendet werden,
        /// aber kein Passwort hinterlegt wurde.
        /// </summary>
        public static event EventHandler CredentialsRead = delegate { };        
                
        private static string path = string.Empty;
        /// <summary>
        /// Der Pfad des Webservices z.B.:
        /// http://Server:7047/ServiceName/WS/Mandant/Services
        /// </summary>
        public static string Path
        {
            get { return path; }
            set { path = value; }
        }
                
        private static bool useStandardWS = true;
        /// <summary>
        /// Übersteuert die Einstellungen, den in den Resourcen hinterlegten Webservicepfad zu nutzen.
        /// </summary>
        public static bool UseStandardWS
        {
            get { return Webservice.useStandardWS; }
            set { Webservice.useStandardWS = value; }
        }

        public static string ProxyPath = string.Empty;
        /// <summary>
        /// WebProxy Klasse
        /// </summary>
        public static IWebProxy Proxy
        {            
            get;
            set;
        }

        private static bool useProxy = false;
        /// <summary>
        /// Legt fest, ob der hinterlegte Proxyserver genutzt werden soll
        /// </summary>
        public static bool UseProxy
        {
            get { return Webservice.useProxy; }
            set { Webservice.useProxy = value; }
        }
                
        private static bool useDefaultCredentials = true;
        /// <summary>
        /// Legt fest, ob die hinterlegten Credentials genutzt werden sollen
        /// </summary>
        public static bool UseDefaultCredentials
        {
            get
            { CheckCredentials();
                return Webservice.useDefaultCredentials; }
            set { Webservice.useDefaultCredentials = value; }
        }

        private static NetworkCredential credential;
        public static NetworkCredential Credential
        {            
            get
            {                
                return credential;}
            set { credential = value; }
        }
    }

        private static void CheckCredentials()
        {
            if (!useDefaultCredentials)
                if(credential.Password == string.Empty || credential.UserName == string.Empty || credential.Domain == string.Empty)
                {
                    if (CredentialsRead != null)
                    {                        
                        CredentialsRead("", EventArgs.Empty);
                    }
                }
        }

Zur Erklärung: Um das Passwort nicht speichern zu müssen, prüfe ich beim Zugriff auf die Credentials (System.Net.NetworkCredential) ob Benutzername oder das Passwort eingetragen sind und zwinge den Benutzer ggf. zur Eingabe dieser Informationen. Bei UseDefaultCredentials wird dies natürlich ignoriert. Ist für deinen Anwendungsfall natürlich nicht nötig.

Thema: Starten einer Exe mit einem Windows Dienst mit einem passenden Benutzer
Am im Forum: Rund um die Programmierung

Zitat von omega90
Aber der Dienst muss local system bleiben!

Hallo omega90,

mit der o.g. Einschränkung wirst du das nicht erreichen.
Entweder muss der Dienst mit einem anderen (dem WS bekannten) Konto gestartet werden oder du musst die Anmeldeinformationen für den Webservice in dem Programm hinterlegen. (UseDefaultCredentials = False, usw.)

Gruß,
trib

Thema: Wie realisiert Ihr eure Anwendungs Oberfläche bei viel Content ?
Am im Forum: GUI: Windows-Forms

Zitat von elTorito
Meine GUI ist ein schlechter Clone von Dynamics Nav (also MDI Anwendung) (bzw. soll mal einer werden) ;-)
Ich verfluche schon den Tag an dem wir auf RoleTailored Client umstellen werden, was sich Microsoft dabei gedacht hat kann ich nicht verstehen...

Grundsätzlich ist das imho kein schlechtes Design um viele Forms sortiert bereitzustellen.
(Wer Navision nicht kennt: Es ist das aus Outlook bekannte Menü mit einer Explorerartigen Treeview oben, die durch große Buttons darunter [Hauptmenüpunkte] gesteuert werden kann)

Geht es aber über eine große Menge an Forms hinaus, so ist man schnell am Ende. Nehmen wir mal die klassischen Einstellungen der Grafikkarte. Dort gab es ca. 20 Tab-Reiter + im Falle von Nvidia noch so eine Leiste auf der Linken Seite. Bis heute habe ich nicht begriffen, in welcher Reihenfolge ein 2 reihiges Tab funktioniert ;-)
Oder ein Mini-Tool, welches vorerst nur ein paar Einstellungen beherbergt. Dann aber auf Kollegenwunsch (Worst Case: jeder einen eigenen) das Ganze endlos Erweitert wird. Das gibt dann eine Form, die die Größe des eigentlichen Programmes übersteigt.

Was ich damit sagen möchte:
Es muss schon für jeden Einzelfall eine Entscheidung getroffen werden. Meist sehe ich etwas und übernehme es dann. Wenn ich ein Einstellungsfenster designe, dann mache ich das meist schon so vorausschauend dass es dynamisch anwachsen kann. z.B. die Optionen aus Visual Studio.

Es bieten sich auch, wo elTorito schon den RTC anspricht, sog. FastTabs an. Die gibt es in vielen Programmen und sehen dazu noch schick aus.
Das sind untereinander angeordnete Container, die auf und zugeklappt werden können und die anderen dann nachrücken oder sich vergrößern.

Thema: Handschriftlich ausgefüllte Vorlage + OCR
Am im Forum: Grafik und Sound

Hallo zusammen,

wirf doch mal einen Blick auf den EasyPen.
Dort kauft man Papier, welches im Hintergrund mit einem nahezu unsichtbaren Raster versehen ist. Darauf wird das Formular gedruckt.
Der Stift, mit dem geschrieben wird, ist mit einer Kamera versehen, der die exakte Position auf dem Formular und das Formular selbst kennt.
Macht man an einer Stelle einen Haken, so ist das Formular abgeschlossen und wird per Bluetooth an das Handy und dann einen Server übermittelt, der die Übersetzung vornimmt. Die Qualität liegt wohl jenseits der 90%.

Es handelt sich dabei dann natürlich um ein Bezahlmodell...

Thema: Wer wird Europameister 2012? (Auswahl unter den Halbfinalisten)
Am im Forum: Smalltalk

Da kann ich talla nur beipflichten!
Wir bieten sicherlich das meiste Potential in der Mannschaft. Die Spiele der anderen Teams waren eher mäßig und nicht in der Form der Vorjahre.
Trotzdem sollten wir keinesfalls die Italiener unterschätzen. Bestimmt haben wir die Chancen auf unserer Seite, wir müssen sie nur nutzen und nicht zu viel Angst mit ins Spiel bringen. Die Statistik spielt gegen unsere Elf, Zeit das zu ändern!

Thema: Gyration AirMouse: Sondertasten erkennen/auswerten
Am im Forum: Rund um die Programmierung

Hallo visionmaster,

die allermeisten Mäuse & Tastaturen halten sich an Standard Keys. Sie schicken also einfach eine Tastenkombination, wenn man auf eine der Spezialtasten drückt.
(Mit meiner Logitec Maus kann ich auch vorspulen ohne Installation)
Sollte das bei der Maus ebenfalls so sein, kannst du dir eine Form bauen und z.B. des KeyDown und das MouseDown abonnieren.
Dort steht in den EventArgs e die entsprechende Taste drin. Gib die einfach in einem Textfeld o.ä. aus und drücke auf der Maus herum :)

Wenn das Event der Maus als Tastatureingabe kommt, solltest du zusätzlich noch prüfen ob z.B. die ALT oder STRG Taste gedrückt ist.

Gruß,
trib

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Zitat von ujr
Wie löst Du denn KeyDown aus?

Ganz klassisch per txtInput.Text = MyInputDlg() damit der User aus sieht was dort eingescannt wurde.
Im KeyDown wird dann auf den e.KeyCode == Return geprüft.
Zitat von ujr
Dann deaktivierst Du den Scanner aus seiner Ereignisbehandlung heraus? Auch nicht schick.

Du könntest mal versuchen, bspw. KeyDown über MainForm.BeginInvoke aufzurufen - und wenn's nur zum Test ist.
Ja, ich weiß. Und dann Initialisiere ich das Ganze jedes Mal wieder. Auch totaler Mist!
Deshalb hatte ich ja die Singelton Methode gewählt und mir erhofft, dass ich so mit dem Programmstart die externe DLL instanziere, den RFID-Leser aktiviere, das Event abgreife und überall abonniere wo es nötig ist.

Das ist eine gute Idee, das werde ich mal ausprobieren wenn ich den MDE morgen wieder in der Hand hab. In dem Fall dass ich da in einem anderen Thread bin, hätte ich aber schon erwartet, dass das Programm beim zuweisen von txtInput.Text eine Exception schmeißt...

@herbivore: So werde ich es dann auch machen und mich langsam bis zu dem KeyDown vorarbeiten.

Vielen Dank für Eure Ideen!

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Ist aber trotzdem etwas verrückt, da ich zum einen das Event vom Scanner bekomme und dann dadurch das Event vom KeyDown auslöse.
Damit hätte ich gedacht wieder im Main-Thread zu sein. Sonst hätte es ja auch zwingend ein Invoke benötigt um mein DataGrid zu aktualisieren.

Dann wird es aber auch keinen besseren Workaround geben, als den Scanner immer zu aktivieren und wieder zu deaktivieren, da ich das sonst nie synchron bekomme :-/

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Zitat von ujr
wodurch wird eigentlich "Aktion()" aufgerufen? Wie sieht der Call-Stack aus?
Hi urj,
habe heute leider keinen MDE hier. Also manuell beschrieben:

Es gibt eine Hauptform mit ein paar Buttons. Diese starten dann z.B. die Form für Lagerentnahmen.
Im Init dieser Form muss ich dann schon wissen vor welchem Regal der Mitarbeiter steht und hole mir per Dialog einen Wert vom Scanner.
  • Daten füllen, DataGrid hübsch machen, usw.
  • Nun gibt es eine Textbox auf der Form die wieder vom Scanner gefüllt wird. (ArtikelNr.)
    Der Mitarbeiter scannt einen Artikel Code, die Textbox gefüllt (txtInput_KeyDown aufgerufen) und nun wird entschieden ob der Artikel eine Chargen Nummer benötigt oder nicht (per Webservice).
  • Ja: Action() wird aufgerufen (Dialog geht auf, Scanner aktiviert)
  • Nein: Nix passiert, Charge bleibt leer
  • Artikel wird per Webservice entnommen, DataGrid aktualisiert, Focus auf die Textbox.

Das sind prinzipiell die Abläufe. Jetzt wo ich es so schreibe wird klar, dass ich ja aus dem Event des Scanners wieder den Scanner aufrufe... Das könnte natürlich der Knackpunkt sein oO

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Hallo zusammen,

bisher habe ich noch keine adäquate Lösung gefunden um die bestehende Programmlogik größtenteils weiter nutzen zu können. (Alle Programmteile benötigen noch das Modale-Eingabefenster um den Ablauf kurzzeitig zu unterbrechen.)
Der Versuch die Singleton-Klasse mit dem Scanner Event in einem anderen Thread zu starten ist darin geendet, dass der Garbage-Collector diese nach exakt einer Ausführung gekillt hat.

Mein aktueller Workaround sieht nun so aus, dass ich den Scanner nicht mehr zentral aktiviere und überall dort wo es nötig ist das Event abonniere, sondern nur pro Eingabe.
Das bedeutet, ich rufe
RFIDScanner.Instance.Dispose() auf, öffne mein MyInputDlg() und starte danach wieder den Scanner mit RFIDScanner.Instance.Init().
Wobei MyInputDlg() den Init und das Dispose ebenfalls ausführt. Blöd den Scanner jetzt nicht dauerhaft im Hintergrund aktiv zu halten, aber irgendwie scheint das Initialisieren der Singleton-Klasse, das Event trotzdem nur an die Haupform zu binden und mit dem ShowDialog zu unterbrechen.

Danke für eure Unterstützung! Werde am Ball bleiben und nach einer "schöneren" Lösung suchen.

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Zitat von ujr
wo und wie erzeugst Du die Klasse RFIDScanner (bzw. in dieser die Hardwareanbindung)? Was ist RFIDScanner?

Hi ujr,

das ist eine Singleton Klasse, die eine DLL von Motorola instanziert, die Einrichtung übergibt und das Event abonniert.
(Wie nun diese DLL die Hardware genau ansteuert, steht in den Sternen.)
Darin habe ich dann ein eigenes Event erstellt, da die EventArgs aus der DLL immer eine Referenzierung auf diese Motorola-DLL notwendig gemacht haben. So reiche ich einfach den Text durch, sofern der Lesevorgang erfolgreich war.

Bei Beendigung des Programmes schieße ich die Singleton-Klasse per Dispose ab, wo ich noch den Scanner deaktiviere und ein paar Ressourcen aufräume (Sonst gibt es viel geblinke am Scanner).
Zitat von herbivore
sehr merkwürdig. Eigentlich führt ShowDialog die Nachrichtenschleife während der Anzeige des Dialogs weiter. Es sollten also alle Nachrichten ganz normal verarbeitet werden und damit auch die Scanner-Events. Aber irgendwas wird wohl doch anders sein.
Darauf habe ich mich auch verlassen. Es funktioniert ja auch, sofern ich (noch)nicht in der Hauptform das Event registriert habe.

Das Modale Dialoge verhindert werden sollen habe ich schon oft gelesen und kann das gerade bei MDE-Scannern gut nachvollziehen. In diesem Fall arbeite ich aber Zeilenbasiert in einem DataGrid. Das bedeutet, ich muss pro Zeile reagieren und nicht erst am Schluss. Sonst ist der Arbeiter schon am Ende des Lagers und soll nochmal die Charge des 1. Artikels holen...

Dann bliebe noch die letzte Variante mit this.Enabled = false; Da sehe ich nur die Gefahr, dass der gemeine Lagermitarbeiter das Eingabefenster irgendwie in den Hintergrund "getoucht" bekommt. Das werde ich aber jetzt erstmal testen.

Vielen Dank schonmal!

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Hallo Abt,

Zitat von Abt
Habs nur grob überflogen, aber Dein ShowDialog blockiert an dieser Stelle meines Wissens.

Das scheint mir leider genauso. Allerdings gibt es eine Form, die beim Initialisieren eine Nummer MyInputDlg() abfragt. Modal natürlich und es funktioniert. Danach erfolgt die normale Eingabe in Textfelder. Wenn ich jetzt wieder mein MyInputDlg() starte funktioniert es nicht mehr :-/

Ohne Dialog kann ich den Benutzer schlecht "zwingen" eine Eingabe vorzunehmen. Vorallem, da dort z.B. nur Zahlen eingegeben werden dürfen und sich der Dialog sonst nicht schließen lässt.

Hallo herbivore,
Zitat von herbivore
mal abgesehen davon, dass ich persönlich sowieso kein Freund davon bin, EventHandler zwischenzeitliche zu deregistrieren, sondern es vorziehe, über eine boolsche Variable zu steuern, was der aufgerufene EventHandler tun soll bzw. ob er überhaupt was tun soll, siehe [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung, sollte es schon so funktionieren.
Das klingt schon deutlich stimmiger! Das Event wird nun nicht deregistriert, sondern per Variable die Verarbeitung übersprungen.
Ergebnis ist leider nahezu unverändert. Der Dialog steht & nix passiert. Fenster wird geschlossen und das Event aufgerufen. Dank der Variablen wir die Eingabe in der Hauptform ignoriert und es geht unverändert weiter im Code.
Zitat von herbivore
Es wäre eigentlich auch unwahrscheinlich, dass der Scanner schaut, welcher EventHandler bei ihm zuerst registriert wurde und die Events anschließend nur an diesen EventHander ausliefert, obwohl das technisch machbar wäre.

Lass doch einfach den bzw. beide EventHandler registriert. Werden die dann (beide) aufgerufen?

Das Event des Scanners habe ich zentral abonniert und stelle ein eigenes Event mit den nötigen Rückgabeinformationen bereit. Da habe ich definitiv keine Priorisierung integriert.
Auch dieses zentrale Event wird erst aufgerufen, wenn der Dialog bestätigt wurde.

Es wird immer nur das Event in der Hauptform aufgerufen. Das aber auch erst nach Ende des ShowDialog´s.
Kann ja schlecht das Fenster in einem anderen Thread Modal aufrufen. Oder ist das etwa die dreckige Lösung?

Thema: Event-Behandlung zwischen 2 Forms verschieben/austauschen
Am im Forum: Rund um die Programmierung

Hallo zusammen,

in einem Projekt für Windows CE muss ich einen RFID-Scanner per DLL ansprechen und nicht wie gewohnt als Tastatureingabe interpretieren.

Nun habe ich quasi 2 Eingabearten:
Einmal die klassische Textbox & ein modales Eingabefenster welches aus dem Code heraus geöffnet werden kann.

Der Ablauf ist aktuell so:

private void Form1_Load()
{
     RFIDScanner.Scanned += new EventHandler<RFIDScanner.RfidScanEventArgs>(MainForm_RfidScanned);
}

private void Form1_Closing(object sender, CancelEventArgs e)
{
     RFIDScanner.Scanned -= new EventHandler<RFIDScanner.RfidScanEventArgs>(MainForm_RfidScanned);
}

private void Aktion()
{
    if(somethingSpecial)
    {
          RFIDScanner.Scanned -= new EventHandler<RFIDScanner.RfidScanEventArgs>(MainForm_RfidScanned);
          MyInputDlg dlg = new MyInputDlg("Bitte Menge hinterlegen");
          dlg.ShowDialog();
          ProcessInput(dlg.ConvertedOutput);
          RFIDScanner.Scanned += new EventHandler<RFIDScanner.RfidScanEventArgs>(MainForm_RfidScanned);
    }
}

Die MyInputDlg() Klasse beinhaltet dieselbe Logik das Event zu abbonieren und die Eingabe auszuwerten. (Im Init Abbonieren, beim schließen die Registrierung aufheben)

Nun ist das Verhalten folgendes:
Die Form startet und ich kann meine Textfelder per RFID füllen.
Die Businesslogik entscheidet, dass noch eine weitere Eingabe zwingend notwenig ist, entfernt das Event und startet modal meine Eingabeform. (Mal eben plakativ "Aktion()" genannt)
Diese Abboniert das Event wieder. Allerdings passiert nichts bis ich das Fenster manuell fülle und schließe. Dann registriert sich wieder die Hauptform und bekommt das Event für das Eingabefenster ab.

Warum? :)
Starte ich diesen InputDialog im INIT der Form, bevor die Form selbst das Event registriert, funktioniert es hervorragend.

Thema: Besondere Lernleistung in Informatik - Programm schreiben als Prüfungs-Ersatz
Am im Forum: Smalltalk

Hallo Palladin007,

alles eine Frage der Motivation
Wenn man ein Projekts selbst aussuchen, programmieren und dokumentiere darf, kannst du selbst steuern und planen wohin der Weg dich führt. Und vor allem, wie viel Zeit du investieren möchtest.
Dazu sei mal das wirtschaftliche Minimal- & Maximalprinzip genannt ;-)

Bei der Prüfung wird dir ein Thema vorgesetzt, wo diese Kontrollmöglichkeit wegfällt und du einzig auf den Moment angewiesen bist.

Meine persönliche Entscheidung wäre da bereits klar. Fraglich nur ob du so viel Zeit investieren kannst, da schließlich auch noch andere Prüfungen auf dich warten.


Als Projekt würde ich mir etwas suchen was du noch nicht in C# gemacht hast. Denn selten kann man sich so gut und schnell in neue Technologien einarbeiten, wie unter dem Druck einer Abschlussprüfung :tongue:

Thema: DatagridView Wert in Zelle ändern
Am im Forum: Datentechnologien

Hallo zerberos,

wie füllst du denn das dgv?
Wenn mit einem DataBinding, musst du dort (in den zugrinde liegenden Daten) natürlich den Wert ändern und nicht im Control selbst.

Thema: Suche RFID-Hand-Scanner als Wechseldatenträger
Am im Forum: Smalltalk

Zitat von Abt
Vielleicht hast Du hierzu auch Infos oder kriegst gar einen in die Hand ;)

Leider werde ich vorerst nur online Scanner nutzen. Allerdings habe ich mir sagen lassen, dass iaito sowas anbietet.
Zumindest steht dort auch was von:
Zitat
Data storing facility in USB flash drive.

[OFFTOPIC]
Die Alternative wäre natürlich selbst was zu bauen. Einen Arduino µC mit einem RFID Shield liegen bei etwa 25 + 15 €. Dann gibt es DataLogger Shields, (20€) die simpel Daten auf SD-Karten schieben können. Diese Shields kann man sogar ohne Löten aufeinanderstecken. Eine LED oder Speaker dran und (das schwierigste) ein Gehäuse drum.

Alles in Allem sehe ich da keine 100€ Kosten und das Gerät funktioniert so wie du es möchtest/programmierst.

Das aber mal nur als Idee am Rande.
[/OFFTOPIC]

Thema: Suche RFID-Hand-Scanner als Wechseldatenträger
Am im Forum: Smalltalk

Hallo Abt,

ich kenne einige RFID Scanner, die analog zu den Barcodescannern als Tastatur fungieren.
Diese kann man natürlich leicht mit einem Programm auslesen.
Ebenfalls wie bei einem Barcodeleser ist es dort möglich bestimmte Start und Endzeichen zu konfigurieren um eindeutig an sein Werte zu gelangen.

Keine Installation notwendig (Schon, aber wird ja als Tastatur erkannt) dafür müsstest du dir das XML selbst basteln. Preise zwischen 80-120€ für ein einigermaßen vernünftiges Gerät.

Kommende Woche werde ich wohl mit ein paar neuen Geräten arbeiten. Dazu geben ich gerne nochmal eine Info.

Gruß trib

Thema: Code-Schnipsel aus txt-Datei auslesen und ausführen
Am im Forum: Rund um die Programmierung

Guten Morgen,

oder vielleicht als Alternative den Code zur Laufzeit kompilieren.