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: Kamera blockiert Scanner in Xamarin Forms - UWP App
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo Urza,

da ich selbiges Szenario habe aber die Kombination unter UWP so noch nicht getestet habe, hier meine Ergebnisse:

  • Barcodescan mit der Webcam: OK
  • Kamera Aufnahme mit der Webcam: OK
  • Barcodescan mit der Webcam: OK
  • Kamera Aufnahme mit der Haupt-Kamera: OK
  • Barcodescan mit der Webcam: OK

Über eine Einrichtung in einer Datenbank kann ich den Barcodescan ebenfalls mit der Hauptkamera tätigen. Das hat aber unter UWP nach wie vor die Webcam geöffnet. Ohne erst die Hauptkamera zu starten.
Unter Android wechselt die Webcam und Hauptkamera freudig hin und her, je nach dem wie ich den Haken setze.

Surfacebook 1
Xamarin Forms 3.6.0.539721
ZXing: 2.4.1
Xam.Plugin.Media: 4.0.1.5

Und ja, ich weiß: Die Forms Version ist veraltet. Sobald ich diese hochziehe, läuft die Anwendung aber nicht mehr unter Android 4.0.3. Bzw. sie startet, man kann sie aber nicht mehr bedienen, da Pop & Push nix mehr machen.

Thema: String in Enum Convertieren - Funktioniert im Debug aber nicht im Release Modus.
Am im Forum: Grundlagen von C#

Das Problem liegt offenbar nicht an der Umwandlung des Enums.
Wie T-Virus schon schreibt, würde das nie funktionieren!

Im Umkehrschluss bedeutet das aber:

Im Debug-Modus füllt der Konstruktor die Dictionary´s mit Werten. Deshalb läuft der Code gar nicht erst an diese Stelle.
In Release nicht, weshalb der cast fehlschlägt!

Die Frage wäre jetzt nach wie vor: Warum?

Anstelle des Cast auf Color habe ich nun

Color.FromName(colorName)
verwendet.
Funktioniert sofort und kann nach wie vor einfach mit einer Kompileranweisung (#if WindowsCE) für Windows CE kompilliert werden.

Das Problem ist also gelöst, danke an Euch beide! Interessieren würde mich die Unterscheidung aber trotzdem :)

[EDIT]
Kopiert man den Code aus dem Xamarin-Projekt in eine Konsolenanwendung funktioniert er sowohl als Debug, als auch per Release.
Hängt also definitiv mit Xamarin zusammen, wo ich den Beitrag ursprünglich eingestellt habe.

Thema: String in Enum Convertieren - Funktioniert im Debug aber nicht im Release Modus.
Am im Forum: Grundlagen von C#

Hallo zusammen,

ich übergebe eine Farbe als string an meine App.
Dort wird aus dem Enum System.Drawing.Color die passende Farbe herausgesucht und gesetzt.
Das funktioniert, sofern die App als Debug bereitgestellt wird.
Wird sie als Release kompiliert, erhalte ich folgende Meldung:

Fehler
Type provided must be an Enum. Parameter name: enumType

Der entsprechende Code:
(Es handelt sich dabei noch um ein Relikt, welches Win CE kompatibel ist. Es gibt sicherlich mittlerweile elegantere Umsetzungen)

    public static class Colors
    {
        public static readonly Dictionary<Color, string> ColorNames = new Dictionary<Color, string>();
        public static readonly Dictionary<string, Color> ColorValues = new Dictionary<string, Color>();

        static Colors()
        {
            var fi = typeof(Color).GetFields(BindingFlags.Static | BindingFlags.Public);
            for (var iEnum = 0; iEnum < fi.Length; iEnum++)
            {
                AddColor(fi[iEnum].Name, (Color)fi[iEnum].GetValue(null));
            }
            var pi = typeof(Color).GetProperties(BindingFlags.Static | BindingFlags.Public);
            for (var iEnum = 0; iEnum < pi.Length; iEnum++)
            {
                if (pi[iEnum].PropertyType == typeof(Color))
                {
                    AddColor(pi[iEnum].Name, (Color)pi[iEnum].GetValue(null, null));
                }
            }
            pi = typeof(SystemColors).GetProperties(BindingFlags.Static | BindingFlags.Public);
            for (var iEnum = 0; iEnum < pi.Length; iEnum++)
            {
                if (pi[iEnum].PropertyType == typeof(Color))
                {
                    AddColor(pi[iEnum].Name,(Color)pi[iEnum].GetValue(null, null));
                }
            }
        }

        private static void AddColor(string name, Color color)
        {
            if (ColorNames.ContainsKey(color))
                return;
            //Not supported:
            if (color == Color.Transparent)
                return;
            ColorNames.Add(color, name);
            ColorValues.Add(name, color);
        }

        public static string ColorToString(Color color)
        {
            string name;
            if (!ColorNames.TryGetValue(color, out name))
            {
                name = "Empty";
            }
            return name;
        }

        public static Color StringToColor(string colorName)
        {
            Color color;
            if (ColorValues.TryGetValue(colorName, out color))
                return color;
            if (ColorValues.TryGetValue(string.Format("Color [{0}]", colorName), out color))
                return color;
            try
            {
                color = (Color)Enum.Parse(typeof(Color), colorName, true);
            }
            catch (Exception ex)
            {
                MessageMgt.CaptureError(ex.Message, "Color " + colorName);
                color = Color.Empty;
            }
            return color;
        }
    }

Der Fehler tritt bei
Enum.Parse(typeof(Color), colorName, true);
auf. Z.B. wenn man "Green" oder "AliceBlue" übergibt.

Der Debugger hilft mir dabei leider nicht weiter, da der Fehler schließlich nur auftritt, wenn ich ohne Debug-Informationen kompiliere.

Hätte jemand eine Idee woran das liegen könnte?
Oder wie ich es selbst herausfinden kann?

Thema: RDLC - Anzeigen / Ausblenden bestimmter Werte
Am im Forum: Rund um die Programmierung

Hi,

das Problem mit der Seitenanzahl ist, dass diese erst beim Rendern feststeht. Das kann zu unterschiedlichen Verhalten führen und ist nicht verlässlich.
Was Du machen kannst ist, die Rechnung und den Text in verschiedenen Containern darzustellen.
Die Rechnungsdaten in einer Tabelle und den Text in einer DetailView oder wie das Teil heißt. (Habe gerade kein VS mit Reporting zur Hand) Dort kannst Du über die Properties steuern, ob Du pro Datensatz eine neue Seite haben möchtest.
Ggf. musst Du den Text dann filtern oder per First() einschränken, damit dieser nicht genauso oft angezeigt wird, wie es Rechnungszeilen gibt.

Thema: Wie funktioniert der Bitweiser Operator &
Am im Forum: Grundlagen von C#

Hallo Rafael,

ein & liefert nur dann eine 1, wenn beide eingehenden bits ebenfalls 1 entsprechen.
Leider rückt Dein Programm die binäre Darstellung nicht ein.

60: 00111100
13: 00001101
____________


Nun kannst Du wie bei einer Addition die Spalten untereinander übernehmen, wo in beiden eine 1 drin steht. Der Rest bleibt 0.
Das ergibt die binäre Darstellung von 12. Eine 1 bei 4 und eine weitere bei 8.

Thema: Webservice liefert sporadisch erfolgreiche Antwort, manchmal auch nicht
Am im Forum: Web-Technologien

Hi Abt,

danke für Deine Rückmeldung!
Der Webservice lief ja grundsätzlich ohne Proxy. Bis gestern Abend, dann bekam ich auch auf einmal auch ohne die Meldung.
Habe den Server neugestartet und seit dem geht es!

Bin gerade dabei an das Log von gestern Abend zu kommen. Ist nicht so einfach per Powershell den tausenden Einträgen in der Konsole Herr zu werden.

Parallel teste ich weiter mit dem Proxy und schaue ob die Meldung überhaupt nochmal auftritt.

Thema: Webservice liefert sporadisch erfolgreiche Antwort, manchmal auch nicht
Am im Forum: Web-Technologien

Hallo zusammen,

ich habe ein seltsames Verhalten.
Eine Android App verbindet sich mit einem Webservice.
Der Contenttype wird dort hinterlegt:

var httpContent = new StringContent(soapEnvelop.ToString(), Encoding.UTF8, "text/xml");
httpContent.Headers.Add("SOAPAction", soapAction);
Das funktioniert verlässlich!

Route ich nun den Webservice über einen WCF-Proxy, erhalte ich regelmäßig die Meldung
Fehler
Client found response content type of '', but expected 'text/xml'
Fehler
Der vom Client gefundene Anforderungsinhaltstyp ist '', erwartet wurde 'text/xml'.

Schaue ich dort in das Webservice_Binding Objekt (Wurde klassisch als Webservice referenziert), ist der Content-Type auch dort korrekt als "text/xml" enthalten.

Es klappt zwei mal, dann wieder nicht. Dann bekomme ich 3-4 mal den Fehler und auf einmal geht es wieder.

Am Ende hängt ein Webservice einer Cloud-Anwendung, die ich leider nicht debuggen kann.
WireShark zeigt mir sauber die Anfrage der Android-App zum Proxy und die Antwort vom Proxy zurück an.
Die Anfrage an den WS in der Cloud ist nicht per http, sondern per TLS, somit ist der ContentType "Application Data" und die Daten sind natürlich verschlüsselt.

Funktioniert die Anfrage, so sieht man vorab den Handshake. Schlägt sie fehl, fehlt der Handshake. Bei einer Keepalive-Nachricht eigentlich auch nichts ungewöhnliches.

Habe gerade keine Ahnung wie ich das weiter analysieren kann.
Vielleicht hat jemand von Euch eine Idee :)

Thema: Xamarin Android - Text von Eingabe auf gleicher Ebene mit dem Label
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo zusammen,

ich habe nun endlich mein "Problem" ausfindig gemacht!
Meine Controls füge ich per Code hinzu. Mache ich es wie Urza (Danke dafür!) im XAML, klappt es natürlich.

Also freudig alles auskommentiert, was keine Miete zahlt und Label + Entry sind nach wie vor nicht auf einer Y-Achse...

Nun habe ich die entscheidende Stelle endlich gefunden:
Es lag am HeightRequest!

Da ich meine Canvas pixelgenau in einem anderen Tool generiere, füge ich alle Controls untereinander ein und setze den Heigth- & Width-Request + ein Margin für den Abstand.
Bei Controls auf der selben Y-Achse verwende ich ein zusätzliches StackLayout.

Nun setze ich den HeightRequest im StackLayout und das Label nur auf "Center". Klappt solang ich keine Hintergrundfarbe setze. Dann fällt nämlich auf, dass das Edit-Control die volle Höhe einnimmt und das Label nur die des anzuzeigenden Textes.


Lange Rede kurzer Sinn: Ist das Label zentriert und die Höhe errechnet sich selbst, funktioniert es.
Übergibt man eine gewünschte Höhe oder stretcht diese, funktioniert es nicht mehr.

Thema: Xamarin Android - Text von Eingabe auf gleicher Ebene mit dem Label
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hmm, das ist seltsam. Bei mir nicht!

Beides auf Center und der Label-Text ist am oberen Rand orientiert. Also etwas höher als "STÜCK".
Setze ich beim Label nun VerticalTextAlignment = TextAlignment.Center kommt es zu dem Verhalten auf meinem Screenshot.

Schnell mal eine Test-View mit einem Grid zusammengeschustert und es sieht gut aus!
Also muss es wohl an meinem Stacklayout liegen. Dort alle Eigenschaften außer Horizontal und LeftToRight auskommentiert. Immer noch das selbe :-/
Werde mich morgen nochmal von null an vorankämpfen. Muss ja irgendwo dran liegen!

Thema: Xamarin Android - Text von Eingabe auf gleicher Ebene mit dem Label
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo zusammen,

ich versuche ein Label und ein Entry nebeneinander darzustellen.
Das Problem ist aber, dass der Text nicht auf der selben Höhe ist und es deshalb ziemlich bescheiden aussieht.

Beim Label kann ich mit dem VerticalTextAlignment zwar zwischen Start, Center & End unterscheiden, aber nichts davon befindet sich auf Höhe des Entry-Textes.
Bei dem Entry selbst gibt es kein Property um das Alignment des Textes zu definieren.
Natürlich kann man nun mit einem Custom Renderer das Entry individualisieren. Aber das kann doch nicht Sinn und Zweck sein, oder?

Unter UWP ist das Entry umrahmt. Da ist der Text zwar ebenfalls nicht auf der Höhe, jedoch fällt es nicht mehr ganz so ins Auge, da das Label wenigstens zentriert zur Textbox ist.

Die Controls liegen beide auf einem StackLayout mit horizontaler Orientierung. Beide haben die identische Höhe und die VerticalOptions stehen auf StartAndExpand.

Thema: mycsharp.de ist nun auf Azure umgezogen
Am im Forum: Ankündigungen

Da kommt man nichts ahnend aus dem Urlaub zurück und stellt fest:
Nix!

So muss ein Umzug laufen! Klasse Arbeit & Danke :)

Thema: Nnach Windows 10 Update wird die Polyline nicht mehr angezeigt.
Am im Forum: GUI: WPF und XAML

Selbiges Verhalten ist bei einem Kollegen auch aufgetreten. Neuaufsatz eines Win10 Rechners mit letztem Build und seine WPF Anwendung funktionierte nicht mehr.
Auf allen anderen Win10 PC´s lief sie weiterhin.

Seine Rückmeldung:

Zitat
Nach einer langen Google-Recherche kam heraus, dass es ein DirectX Problem bei Windows 10 gibt.
Abhilfe ist in der Regel den Grafikarten Treiber nachzuinstallieren, und auf einmal geht alles wieder!

Vielleicht hilft´s ja.

Thema: Welche Methode zum synchronisieren von Datenbanken hat sich bewährt?
Am im Forum: Datentechnologien

[offtopic]

Zitat von Abt
D.h. wenn Dein Kunde pauschal eine Anforderung hat, die Du selbst als unsicher einstufst, dann machst Du das? Du bückst Dich also immer, weil der Kunde das will?

Das ist natürlich arg pauschalisiert.
Weder springe ich von der Brücke, noch erfinde ich das Rad neu 8)

Ist man in der komfortablen Situation Interessenten ablehnen zu können, sollte man das durchaus tun, wenn man selbst keinen Nutzen daraus zieht. In einem Angestelltenverhältnis geht das jedoch nicht immer.

Manches muss man auch einfach als Herausforderung ansehen

Natürlich habe ich schon potentiell unsichere Umsetzungen abgelehnt, aber auch (für teilweise viel Geld) vollkommen sinnlose/überflüssige Dinge umgesetzt.
Dabei agiere ich transparent und weise den Kunden auf meine Bedenken hin. Mehrfach. Möchte er das trotzdem, gibt es selten Gründe das abzulehnen und ihn zum Mitbewerbern zu schicken.


Bin mir aber sicher, dass wir uns da im Großen und Ganzen ohnehin recht einig sind
[/offtopic]

Thema: Welche Methode zum synchronisieren von Datenbanken hat sich bewährt?
Am im Forum: Datentechnologien

Zitat von Abt
Auch das ist - wie zB bei Maschinenbauern und Automobilkonzernen - ein rein politsches Thema.
Das spielt doch überhaupt keine Rolle.
Wenn Dein (potentieller) Kunde sagt, Du darfst das nicht, dann hältst Du Dich daran oder suchst Dir einen anderen Kunden (Bzw. der Kunde einen anderen Dienstleister).

Und ob ein Unternehmen sich noch im Dornröschenschlaf befindet, ändert ebenfalls nichts an der Tatsache, dass er nun mal am längeren Hebel sitzt.
Die allermeisten Spendenorganisationen haben in der Satzung stehen, dass die Daten im eigenen Haus verbleiben müssen. Also keine Cloud, teilweise keine Remote-Zugänge, niemals externe Datensicherungen, usw.
Ob das sinnvoll ist, steht auf einem anderen Blatt. Aber wenn Du nur Cloud aus dem Homeoffice anbietest, bist Du als Dienstleister raus.

Zitat von Davaaron
Obwohl man davon ausgehen kann, dass ein Ausfall nicht oft vorkommt, sind die Schäden jedoch zu hoch, um auf ein Fallback zu verzichten.
Kommt alles auf den Prozess an!

Wir haben Lösungen, die nur die essenziellen Daten offline vorhalten, bis die Software wieder online ist. Z.B. einen Verkauf. Wenn der Kunde den Artikel in der Hand hält, ist dieser per se lagerhaltungstechnisch auch verfügbar. Ist man wieder online, wird die Entnahme verbucht.
Alles andere geht eben für diese Zeit nicht oder muss auf Papier erfasst und nachgepflegt werden.
Ist ja auch eine Sache des Aufwandes, die der Kunde zu zahlen hat.

Der "große wirtschaftlicher Schaden" kann immer und überall entstehen, wie man schon häufiger mal an Tankstellen gesehen hat. Da verwechselt der Fallback mal eben einen Punkt mit einem Komma und der Sprit kostet nur noch 1,49 Cent

Ist aber auch alles sehr theoretisch, da wir/ich nicht weiß was das System letztendlich können soll.

Thema: Welche Methode zum synchronisieren von Datenbanken hat sich bewährt?
Am im Forum: Datentechnologien

Die Problematik kenne ich zur genüge!

Die Frage ist aber: Wird diese Offline-Fähigkeit wirklich benötigt oder ist das nur ein theoretischer Fallback, den der Kunde gerne hätte?

Denn, wie häufig fällt die Internetverbindung tatsächlich aus?
Sind die Geschäftsprozesse wirklich nicht temporär offline durchführbar? (Lagerentnahme mit Entnahmeschein [so wie früher auch]).

Kritisches Thema sind meist Abrechnungssysteme (Kassen). Was kostet ein USB-UMTS-Stick? Oder einen Hotspot mit dem Handy aufzumachen?

Eine Sache gibt es, die mir AdHoc einfällt, wo es wirklich nicht anders geht:
Wartung bei Großkonzernen, die in der Forschung tätig sind. Neben jeglicher Art von Kameras (also Smartphones) ist auch meist keine Netzwerk-/Internetverbindung erlaubt.
Dort sucht der Mitarbeiter den Wartungsauftrag raus, macht ihn offline verfügbar und sperrt diesen im online-System.
Kommt er vom Kunden zurück, kann er problemlos diesen Auftrag aufgrund seiner Sperre wieder zurücksynchronisieren.

Thema: MSSQL-DB nach Wiederherstellung: "auto_increment" nicht gesetzt und Primary Key fehlt
Am im Forum: Datentechnologien

Danke für den Test emuuu. Da habe ich (zumindest in der Vergangenheit) andere Erfahrungen gemacht.
Da hatte ich entweder eine andere Konstellation oder ggf. eine andere SQL Version im Einsatz.

Zitat von T-Virus
Wir nutzen für eindeutige IDs, was der ursprungszwecke von auto increment ist, nur Guid.
Der Horror einer jeden Tabelle: 32 stellige Primärschlüssel!
Die Sortierung passiert willkürlich, es müssen die Datensätze also laufend "dazwischen" eingefügt werden, was ebenfalls extrem schlecht für die Performance und Festplatte ist.
Mit dieser Sortierung kann niemand etwas anfangen. Daher braucht es mindestens einen Sekundärschlüssel, der die Daten nach einer sinnvollen Reihenfolge ausgeben kann.
Jede Applikation, die die Daten bereitstellen möchte, muss die Sortierung auf den SK ändern, wenn die Daten linear angezeigt werden sollen.

Bin mir ziemlich sicher, dass es performanter wäre, mit LOCK den letzten Datensatz zu holen und den Wert zu inkrementieren (also ein "händisches" autoincrement aber mit LOCK) als eine GUID für den PK zu verwenden.

Thema: MSSQL-DB nach Wiederherstellung: "auto_increment" nicht gesetzt und Primary Key fehlt
Am im Forum: Datentechnologien

Da bin ich ganz anderer Meinung.
AutoIncrement basiert auf einem Feld in einer Shadow-Tabelle. Dieses wird hochgezählt und damit sehr performant der PK für die Tabelle erstellt. Diese schert sich nicht um Daten innerhalb der Tabelle. Deshalb werden Datensätze dann einfach überschrieben, bzw. ruft jeder Insert einen Fehler hervor, dass der Datensatz bereits existiert.

Also ja, setze nach einer Datenübernahme den AutoIncrement Wert auf den PK Deiner Tabelle. Da der PK noch nicht existiert, kannst Du das eigentlich mit
IDENTITY(X,1) machen. Wobei X für den Startwert und die 1 für die Erhöhung steht.

Thema: Was benutzt man am besten für CrossPlatform als C#/Java Entwickler?
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Zitat von Abt
Das funktioniert vor allem in der Theorie.
In der Praxis ist bei Xamarin trotzdem noch (oft) plattformspezifischer Code im Sinne von Java oder Swift notwendig.

Das kommt letztendlich, so wie Deine anderen genannten Argumente, auf den Anwendungsfall an.
Bei meinem Projekt komme ich zu 99% mit einem Basiscode aus und das restliche Prozent verteilt sich auf die Android, iOS & UWP spezifischen Dinge in Xamarin.
Bisher KeyDown-Events & Versions/Build-nummer beziehen. Finde ich verschmerzbar.

Meine Anwendung verwaltet aber auch nur ein paar Verbindungsdaten und erzeugt die GUI dynamisch.
Der erste Prototyp stand nach 2 Tagen für alle drei Betriebssysteme. Kann mir schwer vorstellen, dass es ein anderes System ähnlich einfach macht*.

Sobald es in Richtung grafisch aufwendiger Apps geht, oder gar Spiele, reicht Xamarin sicherlich nicht aus. Aber für ein bisschen Webservices und Daten austauschen, allemale.


*Einfach bedeutet im Umkehrschluss auch immer eingeschränkt. Mit PowerApps kann ich sogar in 2 Minuten eine App für Android, iOS, UWP & alle gängigen Browser bauen. Dafür ist die Einschränkung immens!
Dennoch gibt es viele Anwendungsfälle, wo das ausreicht. Der Topf muss eben zum Deckel passen :)

Thema: Was benutzt man am besten für CrossPlatform als C#/Java Entwickler?
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Xamarin ist der Weg.
MS hat Mono übernommen und mehr oder weniger mit dem .Net Standard Framework ersetzt/ergänzt.
Du kannst mit einem Code iOS, Android und UWP Apps erstellen. Das funktioniert ganz gut, erfordert aber (wie so oft) einiges an Zeit zum einarbeiten und verstehen.

Zu der RAM Auslastung kann ich gerade nicht viel sagen, da mein vorsteinzeitliches Demo-Gerät Android 4.1 installiert hat und ich nur die Gesamtauslastung (360mb) und ein paar System-Apps (~180mb) sehe. Stoppe ich die App, bleiben 340mb über. Spricht also für 20mb im USB Debug-Modus. Wird in der Realität als Release dann wohl nochmal weniger werden. Verlässlich ist der Wert jetzt aber nicht gerade.

Thema: GetProperties / Serialisierung ändert die Reihenfolge der Properties
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Guten Morgen,
danke für Eure Antworten.

Zitat von Papst
warum erstellst du dir da nicht einen eigenen Converter für JSON.NET ?
Da ich erstens verstehen möchte weshalb der selbe Code nacheinander ein anderes Verhalten zeigt und zweitens wollte ich gerne vermeiden, dass ich die Properties der Klasse kennen muss. Sprich das Feld "Id".
Am Converter wird aber letztendlich wohl wenig vorbeiführen.
Zitat von Papst
Wenn du unbedingt mit Reflection arbeiten willst, dann kannst du die Properties doch einfach sortieren, bevor du den Json String zusammenbaust (Abgesehen davon, dass strings mit += zusammensetzen gerade in schleifen problematisch ist).
Wo kommt diese These her? Dachte eigentlich die Stelle "Der Code stark vereinfacht:" und die auskommentierten Zeilen, die auf JSON.Net hinweisen, reichen aus um darzustellen, dass es hierbei nur um das Prinzip, um Beispielcode geht.

Aber auch LaTinos Aussage lässt darauf schließen, dass dem offenbar nicht so ist.

@gfoidl: Danke, dass sind exakt die Info´s die ich gesucht habe, bzw. die aus der MSDN für GetProperties() nicht hervorgegangen sind.

Thema: GetProperties / Serialisierung ändert die Reihenfolge der Properties
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

ich habe gerade ein Phänomen, welches ich nicht so recht nachvollziehen kann.

Eine Klasse erbt von einer Anderen und wird serialisiert.
Beim ersten Durchlauf werden zuerst die Eigenschaften der Basisklasse und dann die der abgeleiteten Klasse verarbeitet.
Ab dem folgenden Durchlauf genau andersherum.

Dass obj.GetType().GetProperties() weder Alphabetisch, noch in der Reihenfolge der Initialisierung durchlaufen wird, sagt ja schon die MSDN.
Dennoch bin ich verwundert, dass es unterschiedlich passiert.

Hintergrund ist, dass leider die Seite, die mein serialisiertes Json entgegen nimmt, auf das allererste Element angewiesen ist.

Der Code stark vereinfacht:


using System;
using System.Reflection;
using System.Xml.Serialization;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var t = new Test();
            Console.ReadKey();
        }
    }

    public class Test
    {
        private DerivedClass derivedClass;
        public Test()
        {
            RunFirstTest();
            RunSecondTest();
            RunThirdTest();
            RunFourthTest();
        }

        public void RunFirstTest()
        {
            derivedClass = new DerivedClass();
            derivedClass.TestValue = "Test1";
            var baseClass = new BaseClass(derivedClass);
            baseClass.Id = "1";
            Console.WriteLine(Json.Serialize(baseClass));
        }

        public void RunSecondTest()
        {
            derivedClass.TestValue = "Test2";
            var baseClass = new BaseClass(derivedClass);
            baseClass.Id = "2";
            Console.WriteLine(Json.Serialize(baseClass));
        }

        public void RunThirdTest()
        {
            derivedClass = new DerivedClass();
            derivedClass.TestValue = "Test3";
            var baseClass = new BaseClass(derivedClass);
            baseClass.Id = "3";
            Console.WriteLine(Json.Serialize(baseClass));
        }

        public void RunFourthTest()
        {
            var derivedClass2 = new DerivedClass();
            derivedClass2.TestValue = "Test3";
            var baseClass = new BaseClass(derivedClass2);
            baseClass.Id = "3";
            Console.WriteLine(Json.Serialize(baseClass));
        }
    }

    public class DerivedClass
    {
        private string _testValue = string.Empty;
        public string TestValue
        {
            get { return _testValue; }
            set { _testValue = value; }
        }
    }

    public class BaseClass : DerivedClass
    {
        public BaseClass()
        {
        }

        public BaseClass(DerivedClass derivedClass)
        {
            foreach (PropertyInfo sourcePropertyInfo in derivedClass.GetType().GetProperties())
            {
                var destPropertyInfo = GetType().GetProperty(sourcePropertyInfo.Name);
                if (destPropertyInfo != null && destPropertyInfo.CanWrite)
                    destPropertyInfo.SetValue(
                        this,
                        sourcePropertyInfo.GetValue(derivedClass, null),
                        null);

            }
        }
        private string _id = string.Empty;
        public string Id
        {
            get { return _id; }
            set { _id = value; }
        }
    }

    public static class Json
    {
        public static string Serialize(object obj)
        {
            //var jObject = new JObject();
            var json = string.Empty;
            foreach (var propertyInfo in obj.GetType().GetProperties())
            {
                if (propertyInfo.IsDefined(typeof(XmlIgnoreAttribute), false))
                    continue;

                var value = propertyInfo.GetValue(obj);
                var name = propertyInfo.Name;
                //jObject.Add(name, JToken.FromObject(value));
                json += $"{name}\t{value}" + Environment.NewLine;
            }

            //var json = jObject.ToString();
            return json;
        }
    }
}

Ausgabe:
Test 1: ID, TestValue
Test 2: TestValue, ID
Test 3: TestValue, ID
Test 4: TestValue, ID

Dass ich die "DerivedClass" global vorhalte, könnte das erklären. Dann hätte aber Test4 wieder identisch zu Test1 laufen müssen?!?

Bonus Info: Unter Xamarin Android startet die Ausgabe immer mit ID, in einer Console oder Xamarin UWP kommt es zu o.g. Verhalten.

Über die Implementierung der Gegenseite müssen wir nicht sprechen. Da habe ich leider keinen Einfluss drauf :(

Thema: Vom Seriellen Port empfangene Daten in eine Textbox schreiben
Am im Forum: Grundlagen von C#

Pre-Post: panicJonny war schneller, aber ich denke ich bin eine Idee ausführlicher ;)

Zitat von Janiiix3
Wo schmeiße ich denn den Inhalt weg?

Hier:

  private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            /*  Puffer anlegen..
            */
            byte[] buffer = new byte[ 50 ];
Du erstellst den Puffer innerhalb des Datenempfangs.

Wenn Du nun erwartest, dass "Test123" eingeht, der Port aber schnell genug reagiert, kommt nur "Tes" an und in dem nächsten ausgelösten Event "t123".
Beides ist von der Länge her kleiner als Deine erwarteten Daten. Also springst Du aus der Methode und die Daten sind futsch.

Eine mögliche Lösung ist es einen Empfangspuffer außerhalb Deiner Methode anzulegen und solange zusammensetzen, bis Deine Länge erreicht ist. Dann kannst Du diesen auswerten und wieder löschen.

Zum Aufbau:
Verwende eine eigene Klasse, die sich genau um das o.g. kümmert. Lerne wie man selbst Events erstellt und nutze es, wenn Deine Daten komplett sind.
Erstelle Dir eine Daten-Klasse, die Deine Werte beinhaltet und verknüpfe diese per Databinding an die Controls.
Nun füllst/änderst Du den Wert in Deiner Datenklasse aus dem Event aus Deiner SerialPort-Klasse mit der Pufferungs-Logik.

Thema: Daten von mehreren USB Barcode Lesern auslesen
Am im Forum: Rund um die Programmierung

Hallo schuppsl,

i.d.R. können QR-Code Leser konfiguriert werden.
In der Bedienungsanleitung stehen bestimmte Codes, mit denen das Gerät "programmiert" werden kann. So z.B. auch Start- & Endzeichen oder feste Prefixe/Suffixe.
Das könnte Dir helfen, dass Du die Scanner eindeutig identifizierbar machen kannst.

Ein Programm kann per globalen KeyHooks (Dein Stichwort für die Recherche) auf Tastatureingaben lauschen, auch ohne dass das Programm ein Eingabefeld hat oder gar im Vordergrund ist.
Ein Dienstprogramm kann imho per se nicht auf die Tastatureingaben zugreifen. Daher müsstest Du eine normale Applikation erstellen und diese dann minimiert starten (bzw. mithilfe des NotifyIcon).

Thema: Windows Embedded Compact 2013 und .NET Core
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Windows CE als auch Embedded ist zu 2020 abgekündigt.
Bzw. ist daran in der Vergangenheit ja ohnehin nicht mehr viel passiert und die Geräte teilweise immer noch langsamer als ein handelsüblicher Taschenrechner.

Stand aber auch vor selbigem Problem und habe eine Serverseitige Anwendung geschaffen, die dem CE/Embedded/Mobile Gerät die Oberfläche komplett zur Verfügung stellt.
Also alle Labels und Textboxen mit Werten und Positionsangaben übermittelt werden. Auf dem Gerät werden dann die Eingaben gemacht und bestimmte Controls können als "Sender" definiert werden. Dann wird alles wieder zusammengepackt und an den Server zurück übermittelt werden.
Ohne Performance-Optimierung und zahlreichen Verbesserungen für Look&Feel und kleineren Prüfungen, damit nur valide Daten übermittelt werden, machste sowas in 2 Tagen.

Jetzt portiere ich das gerade nach Xamarin. An der Serveranwendung muss ich dafür nullkommanix machen.

Thema: VB-Code in C# umwandeln
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Für kurze Snippets nutze ich gerne:
https://www.developerfusion.com/tools/convert/vb-to-csharp/
oder
http://converter.telerik.com/

Thema: Framework, das beim Kunden ein Produkt freischalten kann - auch ohne Internetzugang
Am im Forum: Smalltalk

Zitat von Chevy77
@Abt: Dein Style gefällt mir nicht. Wenn sich das nicht ändert, werde ich da nicht drauf eingehen.
Vielleicht gehst Du vorher nochmal in Dich und hinterfragst, wer hier versucht wem zu helfen.

Thema: UWP & Android Bluetooth - Forms .Net Standard
Am im Forum: Cross Platform Entwicklung - Mobile und IoT

Hallo zusammen,

ich möchte gerne eine ziemlich simple Anwendung schreiben, die prinzipiell nur aus ein paar Buttons besteht und Befehle per Bluetooth versendet.
Das Empfangsgerät ist bereits (mit dem PC oder Handy) gepairt und muss nur einmalig ausgewählt werden.
Verwenden möchte ich daher gerne Xamarin Forms mit .NET Standard 2.0.
Dann hätte ich nur einen Basis-Code und Views.

Es gibt offenbar keine allgemeingültige Bluetooth-Schnittstelle und soweit ich recherchieren konnte, muss ich pro Betriebssystem eine separate Schnittstelle verwenden.
Das spräche ja eher für eine Shared Projektmappe.

Hat jemand von Euch bereits BT in Forms im Einsatz und wenn ja, wie gelöst?

Es gibt ein paar NuGet Pakete, die meisten sind aber shared und kombinieren nur Android und iOS.

Thema: [erledigt] String in DateTime umwandeln mit bestimmtem Format
Am im Forum: Grundlagen von C#

Vereinfacht ausgedrückt ist ein DateTime nichts anderes als ein Int64. Also eine einfache Ganzzahl.
Es beginnt bei 0, was dem 1.1.0001 00:00:00.0000 entspricht.

Ein Datum wir dann simpel in "Ticks" gespeichert. Eine Einheit, genauer als Millisekunden -Sollte aber prinzipiell keine Rolle spielen- Die laufend hochgezählt wird.

Erst wenn z.B. ToString aufgerufen wird, erweckst Du diese Zahl, abhängig der Zeitzone oder des Übergabeparameters zum Leben.

Übergibst Du die DateTime-Variable einem anderen Programm, muss Du Dich um nichts kümmern. Es wird der Integerwert übergeben. Exportierst Du sie in eine Datei, wird sie mit ToString (Oder ToShortDateTime, ect.) formatiert.

Thema: Amazon ermöglicht Live-Gesichtserkennung für ganze Städte
Am im Forum: Smalltalk

Gestern auf LinkedIn habe ich die zu erwartenden Ausbaustufe gefunden, die mit dem Wachstum der Technologien einhergeht.
Schockierend ist eine nette Untertreibung:
LinkedIn
YouTube

Die Schüler werden ganztägig überwacht, die Meldungen gezählt, sind sie müde, gelangweilt, aufmerksam... Theoretisch kann man das gesamte (mündliche) Notensystem einem Computer übergeben.

Thema: Amazon ermöglicht Live-Gesichtserkennung für ganze Städte
Am im Forum: Smalltalk

Die Diskussion driftet ja in mehrere Richtungen ab.
Unter anderem geht es hier nicht um die Videoaufzeichnung, sondern um die Live-Gesichtserkennung. (Abt war schneller mit dieser Erkenntnis)
Theoretisch kann jeder Mensch unerkannt an diesen Kameras vorbei laufen und wird nicht aufgezeichnet.
Nur wessen biometrische Daten in das System geladen wurden, wird erkannt und gemeldet. Unter genau dieser Prämisse finde ich diese Lösung gar nicht so schlecht.

Natürlich möchte auch ich nicht 24/7 überwacht und aufgezeichnet werden! Ein Generalverdacht ist immer der falsche Weg und eröffnet mehr negative als positive Aspekte. Man siehe die Vorratsdatenspeicherung.

Sollte das System aber "nur" den Abgleich mit einer fest definierten Liste von Personen, die richterlich angeordnet wurde abgleicht, ziehe ich solch eine "stille" Fahndung einer öffentlichen Fahndung vor. Gerade zu Zeiten wo jeder irgendwelche ominösen Bilder auf Facebook teilt, um vermeintliche Verbrecher aufzufinden.

Erinnern wir uns an die letzten Terroranschläge, so waren die meisten Personen polizeibekannt und sog. Gefährder. Diese konnten aber nicht lückenlos überwacht werden, da dies pro Tag bis zu 15 (!!!) Beamte erfordern würde.

Problematisch ist natürlich wie und von wem solche Systeme eingesetzt werden. Welche Grenzen und Gesetze existieren? Können diese künftig umgangen werden? Gibt es Interessen aus z.B. Wirtschaft, die sich lobbyistisch einmischen können?

Wie in erschreckend kurzer Zeit ein demokratisches System in einen totalitären Staat gewandelt werden kann, sehen wir in der Türkei. Würde dort ein solches System existieren, wäre Orwell´s Vision übertroffen worden. Ob das überall (auch in Deutschland) auszuschließen ist, wage ich zu bezweifeln. Momentan gibt es auch hier einen Politischen Ruck, den sich nach der NS-Zeit niemand mehr hätte vorstellen können.