Laden...
*
Benutzerbeschreibung

Forenbeiträge von *Andreas* Ingesamt 15 Beiträge

13.02.2018 - 20:10 Uhr

Nur kann XmlSerialization nur public properties serialisieren. Außer natürlich ich implementiere erst recht die Schnittstelle.

Zu deinem Kommentar: Ja, allerdings habe ich hierdurch keine sonderlich gute Kapselung. Das wäre mit Events weit besser. Trotzdem bin ich dankbar, wenn solche Kommentare kommen, denn ich bin dann doch Chemiker, der sich seine Tools programmiert.

Daraus folgt aber auch, dass es weit bessere Programmierer hier gibt. 😉

13.02.2018 - 20:02 Uhr

Hallo,

danke für eure Tipps. Die Xml-Serialization fand ich immer mühsam und wenig anpassbar.

Aber ich habe es jetzt so gelöst (sollte jemand anders noch so ein ähnliches Problem haben):

    using (XmlReader xmlRdr = new XmlTextReader(deviceConfigPath))
            {
                XDocument xmlDoc = XDocument.Load(xmlRdr);
                // All the mks247 devices.
                var mks247devices = from d in xmlDoc.Descendants().Where(n => n.Name == "device" && (string)n.Attribute("type") == "mks247") select d;

                foreach (var device in mks247devices)
                {
                    // That's the device:
                    mks247Device dev = new mks247Device((string)device.Attribute("ip"), (string)device.Attribute("name"), (string)device.Attribute("id"));
                    // Now the calibrations:
                    IEnumerable<mks247VolumetricConverter> volumetricConverters = from v in device.Descendants("calibration")
                                                                                  select new mks247VolumetricConverter((decimal)v.Attribute("a"), (decimal)v.Attribute("b"), (string)v.Attribute("unit"))
                                                                                  {
                                                                                      Name = (string)v.Attribute("name"),
                                                                                  };

                    dev.Calibrations = new List<mks247VolumetricConverter>(volumetricConverters);

                    // TODO: Do that more OOP-way by registering via events:
                    vm.RegisterDevice(dev);

                    if ((bool)device.Attribute("autoconnect"))
                    {
                        if (await dev.ConnectAsync())
                            dev.BeginPolling();
                    }
                    // Add to our list.
                    deviceList.Add(dev as SmartCatDeviceBase);
                }
            } 

Danke noch einmal und danke für hilfreichen Tipps!

LG,
Andreas

13.02.2018 - 11:14 Uhr

Hallo,

danke für deine Antwort. D.h. du meinst gar nicht mit LINQ to XML, sondern mit einer "ganz normalen" foreach-Schleife?

Stimmt, das ginge so relativ simpel: Bin da eventuell Opfer meines Drangs geworden, alles möglichst elegant zu machen...

Danke!

LG,
Andreas

13.02.2018 - 08:41 Uhr

Hallo,

ich verwende folgenden Code um eine Liste von Objekten zu erhalten:

var getmks247Task = (from deviceElem in XDocument.Load(xmlRdr).Element("devices").Elements("device")
                                     where (string)deviceElem.Attribute("type") == "mks247"
                                     select new // => see the new keyword for the object declaration
                                     {
                                         mks247dev = CreateAndConnectTomks247Async(
                                             (string)deviceElem.Attribute("ip"),
                                             (string)deviceElem.Attribute("name"),
                                             (string)deviceElem.Attribute("id"),
                                             (bool)deviceElem.Attribute("autoconnect")),
                                         Calibrations = (from calibrationElem in deviceElem.Descendants("calibration")
                                                         select new mks247VolumetricConverter((decimal)calibrationElem.Attribute("a"), (decimal)calibrationElem.Attribute("b"))
                                                         {
                                                             Name = (string)calibrationElem.Attribute("name"),
                                                             //Unit = (string)calibrationElem.Attribute("name"),
                                                         }).ToList<mks247VolumetricConverter>(),
                                     });

                var mks247s = await Task.WhenAll(getmks247Task.Select(x => x.mks247dev).ToArray());

Mein Problem ist: Calibrations ist eigentlich eine Eigenschaft von mks247dev. D.h. ich hätte eigentlich gerne sowas wie mks247dev.Calibrations = ... Das erlaubt er mir aber (aus nachvollziehbaren Gründen) nicht.

Der Vollständigkeit halber Code der CreateAndConnectTomks247Async:

 private async Task<mks247Device> CreateAndConnectTomks247Async(string host, string name, string id, bool autoconnect = true)
        {
            mks247Device dev = new mks247Device(host, name, id);
            // Register it with View Model.
            // TODO: Handle that better OOP-like using events.
            vm.RegisterDevice(dev);

            if (autoconnect)
            {
                if (await dev.ConnectAsync())
                    dev.BeginPolling();
            }

            return dev;
        }

Herzlichen Dank für eure Hilfe!

LG,
Andreas

17.11.2014 - 13:27 Uhr

Sorry für die späte Antwort: Zwar zwischendurch auf Urlaub. 😉

Gegen das Kontext-Objekt spricht, dass dadurch eine bereits erreiche logische Kapselung (OOP) wieder aufgehoben wird. Und es wird unnötig kompliziert im Vergleich zu den anderen, bereits präsentierten Lösungen.

Aber dennoch danke für die Anregung: Bei anderen Problemen mag das ein hilfreicher Ansatz sein, den ich bish dato wenig vor Augen hatte!

LG,
Andreas

06.11.2014 - 19:28 Uhr

Hallo!

Ja, genau. Der einfachste Fall ist, dass Regel 2 gar nicht mehr zur Anwendung kommt (bzw. könnte gar nicht zur Anwendung kommen), wenn Regel 1 fehlschlägt. Und abhängig davon, was bei Regel 1 rauskommt, kann Regel 2 z.B. entfallen.

LG,
Andreas

06.11.2014 - 11:12 Uhr

Hallo,

ich stimme herbivore zu: Ich will möglichst ohne Magic Numbers auskommen.

Dein Vorschlag, Bart, gefällt mir sehr gut. Ob er auf meinen Fall (vernünftig) anwendbar ist, muss ich mir gründlich überlegen. In meinem Fall sind die Regeln zur Validierung nicht unabhängig. Das macht die Sache komplexer.

Herbivores Vorschlag hat den Vorteil, auch relativ simpel zu sein.

jeder Regeltyp "kennt" seine Meldungen und kann sie z.B. aus Resourcen laden

Das hingegen könnte ich wohl auch machen.

LG,
Andreas

05.11.2014 - 20:12 Uhr

Hallo herbivore,

danke für deine Antwort.

Das hat mir sehr geholfen, ich denke meine Frage ist beantwortet.

Sicher gibt es noch andere Möglichkeiten, aber ich wüsste nicht, was gegen diese spricht.

Wenn es bessere/elegantere Möglichkeiten sind, bin ich interessiert. Aber ich bin mit dem Outcome sehr zufrieden.

Sollte ich bei der Implementierung Schwierigkeiten bekommen, erlaube ich mir, mich wieder zu melden. 😉

Danke!

LG,
Andreas

04.11.2014 - 20:46 Uhr

Hallo herbivore,

danke für deine Antwort. Bzgl. Exceptions hast du Recht - Feedback angenommen.

Gute Frage, worum es mir eigentlich geht:

  1. Ursprünglich ging es mir um Folgendes: Habe ich in der Validator-Klasse einfach eine List<string> mit Meldungen, geht mir Information verloren. Z.B. lautet der String "Nicht genügend Daten.". Um beim Deserialisieren die Information (es sind zum Teil nicht einfach nur Meldungen "ohne Belang", sondern es gibt Auswirkungen auf die Business Logik) wieder zu bekommen, müsste ich den String (der außerdem lokalisiert ist) wieder mühsamst parsen.

Also muss ich die Informationen in einem Format speichern, das ich bequem im Code verstehen kann. Daher die Frage nach "Fehlercodes" oder Enums als Bitflags oder was auch immer da elegant und bewährt ist. Außerdem sollen diese Informationen auch als "Flags" für eine spätere Suche dienen (anfangs werden die Objekte einfach (de)serialisiert, später wandern sie aber dann in eine Datenbank).

Daher die Antwort auf deine Frage:

Oder geht es dir darum, dass du die Fehlerinformationen erst speichern und zu einem späteren Zeitpunkt lokalisieren musst? Ja.

  1. Als zweite Frage ist jetzt während der Diskussion bei mir aufgetaucht:

Fehlernummern (ob nun man die als kryptisch oder als Mittel zur eindeutigen Identifizierung ansieht, ist reine Geschmacksache)

Wie würdet ihr die Verbindung zwischen Fehler und lokalisiertem String am besten machen? Meine Idee wäre: Fehlercode, Fehler-Bitflag (oder worauf wir hier eben in der Diskussion kommen) an eine Klasse übergeben, welche dann den String aus der .resx (oder später weiß Gott woher, e.g. Datenbank) holt.

Auch hier, verwandt mit Frage 1: Wie sollte man die Verbindung zwischen Fehler-ID und String am besten machen? Ich meine, es hat schon einen Sinn, weshalb man bei der Programmierung wegging von Fehlercodes (-> Exceptions). Oder anders gesagt, das ist ja wohl der Horror zum Debuggen:

int myFehlerCode = 7;
GetLocalizedErrorstring(myFehlerCode);

Bitfields hätten da wieder Vorteile...

Hoffe ihr versteht mein Problem, bzw. meine Frage. Danke schön im Voraus!

LG,
Andreas

03.11.2014 - 22:33 Uhr

Hallo lechiffre,

danke für deine Antwort.

Nein, ich kannte log4net noch nicht. In der Tat kann das auch in eine Datenbank schreiben. Danke für den Tipp: Ich dachte gar nicht daran, ein Logging-System dafür zu nutzen (eigentlich naheliegend...).

Ich werde mir das genau ansehen. Bin natürlich für weitere Vorschläge offen, aber das klingt schon sehr gut!

LG,
Andreas

03.11.2014 - 17:26 Uhr

Liebe KollegInnen,

ich möchte durch meine Business Logik einen Validierungsprozess abbilden. Im Rahmen dessen durchlaufen die Daten einen Prozess, wo es dann am Ende einen Bericht gibt. Dazu bräuchte ich euren Rat (Danke schon jetzt fürs Lesen dieses etwas längeren Posts!).

Ich will dabei am Ende Fehler, Warnungen, Hinweise, Nachrichten, etc. anzeigen (im Prinzip ganz ähnlich wie beim Kompiliervorgang). Anschließend wir das Objekt (in dem das stattfindet) in eine DB geworfen, bzw. über ISerializable gespeichert (und natürlich auch wieder ausgelesen).

Die Frage ist nun, wie ich das am klügsten mache?

Fehler kann ich über Exceptions hervorragend behandeln. Dann ist die Validierung fehlgeschlagen. Simpel.

Aber wie verfahre ich mit Warnungen, Hinweise, Nachrichten?

Mein Gedankengang hierzu:1. Die Ausgabe von Strings (in meinem Fall aus einem .resx) ist natürlich leicht. Aber erstens will ich in meinem Objekt keine Strings speichern (die ja dann auch lokalisiert sind), zweitens geht die "Information" verloren, da ich die Bedeutung der Strings ja nicht so einfach weiß.

  1. Ich könnte Codes (ähnlich Fehlercodes) speichern. Die Zuordnung zu Strings in der Ausgabe wäre allerdings etwas mühsam (in der .resx ist ja nur: Name, Wert, Kommentar) und fehleranfällig.
  2. Natürlich kann ich für vieles einfach Properties machen. Wird nur bei einer großen Menge unübersichtlich und mühsam.
  3. Eine weitere (die bisher vielleicht eleganteste) Lösung: Verwendung von Enums als Bit field mittels "[FlagsAttribute]". Hier arbeite ich nicht mit kryptischen Codes, eine Zuordnung zu den lokalisierten Strings ist besser.

Habt ihr noch Ideen? Habe ich den "Königsweg" übersehen?

Dankeschön!

LG,
Andreas

29.04.2014 - 22:13 Uhr

Hat denn niemand eine Idee? Es wäre immer noch aktuell. Auch Tipps, wie und wo ich nach der Lösung suchen könnte, wären ein absoluter Hit...

25.08.2013 - 18:33 Uhr

Hallo,

ich möchte gerne, so wie im **Anhang **gezeigt, mehrere Spalten/Zellen mit verschiedenen Farben markieren: So wie beim Standard-Excel-Diagramm.

Auch die restliche Funktionalität, d.h. Resizing der einzelnen markierten Blöcke hätte ich gerne. Ich hoffe, ihr wisst, worauf ich hinaus will: Es ist ein bisschen schwierig zu erklären und auch die Suchfunktion (sowohl im Forum als auch Google) war wenig hilfreich, da ich nicht weiß, wie man dieses Feature am besten benennt.

Bei meinem Projekt handelt es sich um ein Add-In auf Anwendungsebene für Excel. Und ich muss genauso Daten auswählen wie für ein normales Diagramm (nur mache ich dann in meinem Add-In etwas anderes damit).

Auch Stichwörter zum Suchen wären hilfreich! Selbstverständlich erwarte ich kein fertiges Kochrezept!!

Herzlichen Dank!

LG,
Andreas

17.12.2012 - 14:51 Uhr

Hallo,

sorry wegen der späten Antwort. Klingt in der Tat so, als wäre es klug das Standard-Excel-Diagramm zu verwenden!

Danke!
Andreas

28.10.2012 - 22:04 Uhr

Hallo,

ich möchte ein Excel-Addin auf Anwendungsebene schreiben. Teil davon ist auch das Zeichnen eines Diagramms, das ich selbst zeichnen möchte - ich will also nicht das Chart-Steuerelement aus Microsoft.Office.Tools.Excel verwenden.

Ich möchte das Diagramm anschließend - aus Usersicht- genauso verwenden können wie ein normales Excel-Diagramm, d.h.: in ein Word Dokument (Word 2010) kopieren und mit einem Ribbon anpassen (so wie es bei den Excel-Diagrammen dann auch die "Diagrammtools" oder bei Word-Tabellen die "Tabellentools") gibt. Schon klar, dass ich das dann natürlich selbst implementieren muss.

Wie mache ich das am klügsten?*WPF-UserControl *WinForms *OLE oder sowas (Einfügbar mit Einfügen -> Objekt)?

Ich wäre sehr dankbar, wenn ihr mich da auf den richtigen Weg bringen könntet und mir die richtigen Schlagworte für weitere Recherchen nennen könntet - damit ich selbst weiß, wonach ich eigentlich suche. Zugegeben: Ich bin neu bei Office-Programmierung.

Ich verwende VS 2012 mit .net 4.5 und Office 2010 (Windows 7).

Dankesehr,
Andreas