Laden...

Forenbeiträge von MrSparkle Ingesamt 5.658 Beiträge

18.12.2019 - 14:18 Uhr

Hier werden sinnvolle Tips für ein solches Vorhaben gegeben: Strategy for implementing a complex curve editor with XAML/WPF

Vergiß die Idee mit den Events wieder. Verwende Thumb-Controls zum Verschieben der Punkte, DataBinding sowie MVVM für das Implementieren der Logik: [Artikel] MVVM und DataBinding

Ich habe so etwas ähnliches schon mal umgesetzt, allerdings nur zum Editieren von einfachen Bezier-Splines. Daher kann ich sagen, daß dein Vorhaben nicht ganz trivial ist. Kreisbögen kannst du auch durch Splines approximieren, oder du verwendest fertige Bibliotheken dafür, oder du schreibst die Berechnung selbst. Das komplizierte ist aber die Benutzerinteraktion.

18.12.2019 - 10:25 Uhr
  1. Bitte keine Fullquotes, siehe [Hinweis] Wie poste ich richtig?

  2. Wenn die Schichten sich gegenseitig kennen (Form kennt SerialPort und Serialport kennt Form), ist das in jedem Fall eine Schichtverletzung, siehe Bild in [Artikel] Drei-Schichten-Architektur. Da hilft es auch nicht, zusätzliche Schichten einzuführen. Wie willst du solchen Code testen?

16.12.2019 - 23:41 Uhr

Erstes Suchergebnis bei Google: How TO - Get Iframe Elements

Bitte beachte [Hinweis] Wie poste ich richtig?, Punkt 1.1: "Erst suchen und in die Doku schauen, dann posten"

12.12.2019 - 23:06 Uhr

Das ist nicht was ich meinte. Wenn du weißt, wie ein Klavier funktioniert, dann heißt das noch lange nicht, daß du es auch spielen kannst.

Versuch doch einfach mal, ein komplettes Projekt umzusetzen. Sowas wie eine einfache Todo-Liste oder ein Spiel wie MineSweeper. Das würde dir eine Menge praktischer Erfahrung einbringen. Das kannst du alles mit WPF und MVVM umsetzen, und alle Funktionien mit Unit-Tests abdecken. Mit einem solchen Projekt kannst du dich dann für einen Job bewerben.

Ich arbeite mit WPF seitdem es das gibt, und habe Anwendungen aus den unterschiedlichsten Bereichen damit umgesetzt. Und ich habe dafür nie ein Windows Chrome oder ein Attached Property erstellen müssen. Und wenn man es doch mal benötigt, kann man nachschauen, wie es geht. Viel wichtiger ist die Erfahrung, die man nur mit richtigen Projekten sammeln kann.

12.12.2019 - 19:31 Uhr

Ich glaube, du verrennst dich da in etwas. Das alles hat keinerlei praktische Relevanz. Lerne doch lieber Sachen, die man auch anwenden kann. Erfahrung mit MVVM bpsw. kann man in _jedem _WPF-Projekt gebrauchen.

12.12.2019 - 19:14 Uhr

Ich kann mir ehrlich gesagt keinen Anwendungsfall vorstellen, wo so etwas benötigt wird. Kannst du mal beschreiben, was du _eigentlich _vor hast?

12.12.2019 - 19:12 Uhr

Den Dateianhang habe ich entfernt. Bitte poste die relevanten Code-Zeilen in den Code-Tags im Beitrag. Niemand wird sich 2000 Zeilen Code anschauen und für dich debuggen.

Bitte beachte [Hinweis] Wie poste ich richtig?, Punkt 4, 5 und 6!

12.12.2019 - 17:36 Uhr

Der Namespace ist einmal als "Facetto" und einmal als "Fasetto" geschrieben. Schreibst du das alles mit der Hand?

12.12.2019 - 17:29 Uhr

zeigen sich nur leere Items mit den Checkboxen vorne dran.

Du gibst ja auch nirgendwo einen Text an. Was sollte da auch angezeigt werden?

Verwende den ListViewItem(String)-Constructor oder setze die Text-Eigenschaft entsprechend.

12.12.2019 - 17:24 Uhr

Du solltest erst einmal damit beginnen, dich in die Technologie einzuarbeiten, mit der du arbeiten möchtest. Es gibt unzählige Tutorials zu jedem einzelnen der von dir genannten Punkten.

Erstes Suchergebnis zum Hinzufügen und Entfernen von Listenelementen: How to: Add and Remove Items with the Windows Forms ListView Control

Zu den anderen Fragen bezüglich WinForms empfehle ich Getting Started with Windows Forms

Zum Speichern der Daten bietet sich XML oder eine Datenbank an. Auch dazu findet man unzählige Tutorials.

12.12.2019 - 17:10 Uhr

Siehe Doku zu Convert.ToDouble(String):

Exceptions
FormatException

value is not a number in a valid format.

Wenn keine Zahl in der Textbox steht, kann sie auch nicht umgewandelt werden. Verwende besser Double.TryParse, um zu testen, ob überhaupt konvertiert werden kann.

Für WPF kann man auch DataBinding verwenden, das ist wesentlich komfortabler: [Artikel] MVVM und DataBinding

12.12.2019 - 10:17 Uhr

Hi Anna85,

seit mehreren Monaten weisen wir dich darauf hin, daß wir hier keine Crossposts dulden. Deine letzten drei Beiträgen sind alle mit diesem Hinweis geschlossen worden. Und du hast vor zwei Wochen eine Nachricht mit dem Betreff "Letzte Verwarnung vor Kontosperrung" erhalten, in der dir das noch einmal erklärt wurde.

Ich habe daher deinen Benutzeraccount jetzt gesperrt. Wenn du irgendwann einmal verstanden hast, worum es geht, und dich an die Regeln halten möchtest, kannst du deinen Account gerne wieder aktivieren lassen.

11.12.2019 - 19:23 Uhr

Wenn du den Debugger verwendest, kannst du sehen, was dort passiert: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

08.12.2019 - 19:02 Uhr

Vom Assembler weiß ich, daß er der Schnellste ist. Von daher, da ein Vergleichswert zu bekommen, wäre auch ganz nett.

Wenn du es weißt, dann hast du doch einen Vergleichswert, oder? Ich verstehe deine Beiträge alle nicht wirklich...

Wie auch immer du den Inhalt des Bildschirmspeichers kopierst, die eigentliche Arbeit wird durch den Grafiktreiber durchgeführt. Es kommt also mehr darauf an, wie effizient der Treiber und die Hardware arbeiten, als wie du diese Funktionen aufrufst.

08.12.2019 - 18:52 Uhr

Das Travelling Salesman Problem zielt soweit ich weiß darauf ab, die kürzeste Route zum Erreichen aller Standorte zu finden. Das hilft mir hier leider nicht wirklich weiter.

Ist aber ein ähnliches Problem, da muß man halt ein wenig abstrahieren. Es diente vor allem zur Veranschaulichung, daß man hier Heuristiken einsetzen muß, und man nicht so ohne weiteres DIE eine Lösung finden kann. Der k-Means-Algorithmus ist aber tatsächlich näher an deinem Problem dran.

Da könnte es sich lohnen die Programmierzeit lieber für eine Überlegung zu investieren, wie man das selbst machen würde.

Wenn ich vor dem Problem stünde, würde ich auch lieber ein Tool erstellen, daß mir Vorschläge bereitstellt, und ich die Gruppen dann selbst zusammenklicken kann. Manchmal ist Ortskenntnis und ein bißchen gesunder Menschenverstand besser als eine exakte Lösung.

08.12.2019 - 17:12 Uhr

Im ersten Schritt würde ich einen Brute-Force-Algorithmus schreiben, der alle Kombinationen aller Kombinationen berechnet, und dann die beste auswählt. Da braucht man noch nichts zu optimieren, und da kann man auch nicht viel optimieren. Du mußt alle Entfernungen aller Punkte voneinander berechnen, und dann alle möglichen Gruppen-Kombinationen. Dann bewertest du die Ergebnisse und suchst das beste Ergebnis aus. Die Abstands-Berechnungen an sich sind ja trivial, und wenn die Berchnung aller Kombinationen ein paar Stunden (oder Tage?) dauert, und sie nicht oft neu berechnet werden müssen, reicht das vielleicht schon aus.

Evtl. kann man zumindest Teile der Berechnung auch parallel abarbeiten, um alle verfügbaren Prozessorkerne zu nutzen.

Eine darauf basierende Variante wäre, das initial berechnete Ergebnis aus Ausgangsbasis für eine Neuberechnung zu verwenden, sobald sich die Anzahl oder Lage der Vereine geändert haben. Möglicherweise kann man sich dadurch eine Menge Rechenzeit sparen, da man zumindest Teile der ursprünglichen Berechnung wiederverwenden kann.

Falls das zu lange dauert und deinen Anforderungen nicht genügt, dann brauchst du eine geeignete Heuristik. Schau dir mal die Ansätze zur Lösung des Problems des Handlungsreisenden an. Vielleicht kannst du dich davon inspirieren lassen.

07.12.2019 - 16:05 Uhr

Rechtecke kann man auch ohne zusätzliche Controls oder Container zeichnen: [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

07.12.2019 - 16:01 Uhr

Oder welches Control würdet ihr mir empfehlen?

MenuItem

Ich glaube, dass TreeView keine entsprechende Eigenschaft hat, oder?

Hier gibt es eine Lösung: Disable or grey out a node in the TreeNode Editor

03.12.2019 - 13:27 Uhr

Du kannst dafür eine CompositeCollection verwenden: How to: Implement a CompositeCollection

01.12.2019 - 16:12 Uhr

Für die erste grobe Übersicht bezüglich der Strukturierung ist evtl. dieser Artikel hilfreich:
[Artikel] Drei-Schichten-Architektur

Wenn du den Code schreibst, solltest du auch gleich Unit-Tests mit anlegen. Das hilft, weil du dadurch gezwungen bist, deinen Code richtig zu strukturieren, damit er überhaupt ohne größeren Aufwand testbar ist.
[Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio

Ansonsten, wie meine Vorredner sagen: Erfahrung. Man lernt immer aus den Fehlern des vorherigen Projektes, um dann neue Fehler im nächsten Projekt zu machen.

Und ich finde es auch wichtig, ein Projekt zu planen, bevor man anfängt zu programmieren. Man kann sich vorher überlegen, was schief gehen könnte, und dann eine Lösung dafür finden, bevor man tausende Zeilen Code geschrieben hat.

Trotzdem muß man hin und wieder bereits geschriebenen Code wegschmeißen und neu schreiben. Da hilft es, wenn er gut strukturiert ist, und man nur das neu schreiben muß, was nicht funktioniert, und nicht gleich den gesamten Code.

28.11.2019 - 20:09 Uhr

Die Aufgaben des ViewModels sind dort relativ ausführlich beschrieben. Da steht nicht, daß ein Model benötigt wird, oder wie viele ViewModels eine View hat. Das hängt ganz von den Anforderungen und der Umsetzung ab.

Das ViewModel hat dabei folgende Aufgaben:
Alle erforderlichen Daten für die Anzeige bereitstellen: Das ViewModel muss der Benutzeroberfläche alle Daten zur Verfügung stellen, die sie zur Anzeige benötigt. Dazu gehören neben den Daten, die dem Benutzer angezeigt werden sollen, auch die Aktionen, die der Benutzer ausführen kann (siehe Abschnitt Commands), sowie zusätzliche Daten für Auswahllisten. Will man beispielsweise eine ComboBox für eine Länderauswahl darstellen, muss dafür über das ViewModel eine Liste mit allen auswählbaren Ländern bereitgestellt werden.

Die Benutzeroberfläche über geänderte Werte informieren: Das ViewModel löst die jeweiligen Events aus den INotifyPropertyChanged- und INotifyCollectionChanged-Schnittstellen aus, damit die Anzeige automatisch aktualisiert werden kann.

Kapselung der Logik für die Benutzeroberfläche: Das ViewModel enthält sämtlichen Code, der für die korrekte Darstellung der Benutzeroberfläche notwendig ist, beispielsweise die Aktivierung und Deaktivierung von Steuerelementen oder ganzen Bereichen der Oberfläche sowie Benutzeraktionen (Commands). Damit befindet sich die gesamte Logik der Anwendungsoberfläche im ViewModel, und kann dort unabhängig von anderen Teilen der Anwendung mit Hilfe von
>
getestet werde.

28.11.2019 - 11:29 Uhr

Sorry: habe das schon mal so ähnlich nachgefragt, aber aus den Antworten bin ich nicht schlau geworden.

Meinst du diese Beiträge?
In WinForms App via Button einen Chat starten
Winforms Programm auf Client/Server umbauen

28.11.2019 - 11:23 Uhr

Ich kenne mich mit Blazor nicht besonders gut aus, aber ich finde es merkwürdig, daß du direkt auf das Steuerelement zugreifen willst. Sollte man da nicht DataBinding verwenden, und eine Eigenschaft an den Wert der Liste binden, und dann auf diese Eigenschaft zugreifen? Learn Blazor - Data Binding

22.11.2019 - 12:33 Uhr

Den as-Operator kannst du so verwenden:


var textbox = sender as TextBox;
if (textbox != null)
{
  SetStatusbarText(text: textbox.AccessibleDescription);
}

Du kannst dir aber diese ganzen Konvertierungen und Abfragen sparen, da die AccessibleDescription-Eigenschaft zur Klasse Control gehört, und alle Steuerelemente davon erben. Daher brauchst du nur einmal zu casten:


SetStatusbarText(text: ((Control)sender).AccessibleDescription);

22.11.2019 - 12:18 Uhr

Wenn ich es richtig verstehe, hast du ja das Währungssymbol bereits durch die Auswahl in der ComboBox. Dann brauchst du doch nur den Währungsbetrag mit einem Custom-Format formatieren, wie von Abt beschrieben.

21.11.2019 - 13:13 Uhr

ich weiss nicht mal wie ich formulieren soll

Das ist aber das Wichtigste. Ich kann dir jedenfalls nicht folgen. Ich weiß nur, es gibt Textfelder und ComboBoxen, und irgendwo soll eine Währung dynamisch geändert werden. Wenn du es nicht beschreiben kannst, zeig wenigstens mal einen Screenshot.

21.11.2019 - 13:06 Uhr

Ist das nicht exakt das gleiche XML, das du oben schonmal gepostet hast? Hast du deine Abfrage überhaupt angepaßt? Wieso postest überhaupt nur das XML, wenn das Problem doch offenbar in der SQL-Abfrage liegt?

20.11.2019 - 16:51 Uhr

Nein, der PluginManager bekommt die Abhängigkeiten mitgeteilt, wenn er ein Plugin lädt.

Die Abhängigkeiten kann das Plugin beim Laden mitteilen, oder z.B. auch in einer Konfigurationsdatei hinterlegen, so daß sie schon vor dem eigentlichen Laden bekannt sind.

20.11.2019 - 15:44 Uhr

Ich würde es wahrscheinlich so umsetzen, daß jedes Plugin eine Methode hat, die die jeweiligen Abhängigkeiten zurückgibt. Der PluginManager (oder wie man das auch nennt) sammelt die Abhängigkeiten und lädt sie dann in der korrekten Reihenfolge.

20.11.2019 - 15:40 Uhr

Es hat keinen Zweck, gleich zu pushen, wenn du nach zwei Stunden keine Antwort bekommst. Siehe [Hinweis] Wie poste ich richtig?, Punkt 7.

Wenn du keine Antwort bekommst, liegt es meistens daran, daß du das Problem nicht verständlich genug beschrieben hast. Mir z.B. ist nicht klar, ob sich dein Problem eher auf das SQL oder auf das XML bezieht.

Außerdem hat dir Th69 bereits eine Antwort gegeben. Wenn dir das nicht weiterhilft, kannst du mal genauer erklären, warum nicht.

20.11.2019 - 15:35 Uhr

Die PDF-Datei habe ich entfernt. Bitte poste die relevanten Code-Ausschnitte und die Fehlermeldung im Beitrag. Bitte beachte [Hinweis] Wie poste ich richtig?, besonders die Punkte 5 und 6!

19.11.2019 - 15:54 Uhr

Du kannst den TreeView auch so stylen, daß die Inhalte nebeneinander statt untereinander dargestellt werden. Das wäre einfacher, als die Funktionalität des TreeViews nachzubauen.

19.11.2019 - 15:46 Uhr

Wenn der Code der gleiche ist, dann sind optionale Parameter besser geeignet. Bei unterschiedlichem Code die Überladung.

19.11.2019 - 13:20 Uhr

Was willst du denn genau erreichen? Du kannst ja z.B. verhindern, daß die Einträge in der ersten Ebene selektiert werden können. Und die Mehrfach-Selektion geht auch mit dem TreeView.

Aber mit verschachtelten ListBoxen wirst du nicht zum Ziel kommen.

19.11.2019 - 12:35 Uhr

Ein TreeView ist besser geeignet, um hierarchische Daten darzustellen. Dann kannst du ein HierarchicalDataTemplate verwenden, um die Daten zu binden.

19.11.2019 - 12:33 Uhr

Vielen Dank noch einmal für (so gut wie) gar nichts.

Ich verstehe wirklich nicht, wo deine Anspruchshaltung herkommt. Es ist doch hier im Forum niemand Schuld daran, daß deine Englischkenntnisse nicht ausreichen, um deinen Job zu erledigen. Glaubst du wirklich, jemand bringt eher Verständnis für deine Situation auf und hilft dir schneller, wenn du nur ein bißchen pampig wirst?

Bitte beachte zukünftig [Hinweis] Wie poste ich richtig?

17.11.2019 - 16:51 Uhr

Es geht um diese Methode: Enumerable.Reverse. Schau in die Doku, dort gibt es ein Beispiel. Und wie du dort sehen kannst, liegt diese Methode im Namespace System.Linq. Den mußt du auch zu deinen zu deinen usings hinzufügen.

Ich weiß schon gar nicht mehr was ich noch alles ausprobieren soll.
Ich habe schon 16 Projektmappen.

Das nützt auch nichts, wenn du nicht wenigstens versuchst, die Tips nachzuvollziehen, die dir hier gegeben werden.

[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Und nochmal: [Hinweis] Wie poste ich richtig?, Punkt 1.1 Erst suchen und in die Doku schauen, dann posten!

17.11.2019 - 14:41 Uhr

Ein kurzer Überschlag sagt mir, daß 1247740 Sekunden etwas über 14 Tage sind. Offenbar geht da etwas schief mit deiner Parser- und Formatiererei.

Evtl. solltest du mal jeden Schritt einzeln mit dem Debugger nachvollziehen: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

17.11.2019 - 12:28 Uhr

Da hast du natürlich Recht. Bisher war immer nur von "Punkten" die Rede, daher habe ich das nicht in Betracht gezogen. Trotzdem ist die Reihenfolge der Werte in einem Dictionary nicht definiert, daher müßte man sie zuerst sortieren.

17.11.2019 - 11:19 Uhr

Ganz unten wird das foreach rot unterstrichen.

Es wird nicht nur rot unterstrichen, sondern auch eine Fehlermeldung vom Kompiler ausgegeben. Die ist relativ eindeutig. Und wenn du es nicht verstehst, dann solltest du halt doch mal in die Doku schauen. Dort steht alles, was du wissen mußt, und es gibt jede Menge Code-Beispiele. Dafür ist die Doku da!

Siehe auch: [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Wozu du jetzt das Dictionary rückwärts durchlaufen willst, erschließt sich mir nicht. Mein Tip bezog sich doch eindeutig auf den Code in deinem ersten Beitrag, wo du eine Liste verwendest. Du mußt dort nur eine einzige Codezeile ersetzen, und die Punkte werden nicht mehr überzeichnet.

@Th69:

PS: Das Rückwärtsdurchlaufen mittels Reverse finde ich eher irritierend, denn m.E. sollten doch die Punkte in der angegebenen Reihenfolge gesetzt werden (also der zuletzt gesetzte Punkt auch als letztes, d.h. evtl. einen anderen Punkt übermalend, angezeigt werden).

Was soll denn dort "übermalt" werden? Der Sinn des Dictionarys ist doch, daß es für jeden Punkt nur genau eine Farbe gibt. Das Rückwärtsdurchlaufen ist nicht irritierend sondern völlig überflüssig, zumal die Reihenfolge der Werte in einem Dictionary eh nicht definiert ist, siehe die Doku dazu:

For purposes of enumeration, each item in the dictionary is treated as a KeyValuePair<TKey,TValue> structure representing a value and its key. The order in which the items are returned is undefined.

16.11.2019 - 15:15 Uhr

Du solltest natürlich auch das Ergebnis der Where-Methode verwenden.

Schau dir im Debugger an, was dein Code macht: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

15.11.2019 - 14:41 Uhr

Ich hab den Beitrag jetzt mal in das Grundlagen-Forum verschoben, denn es geht letztendlich wieder um die Verwendung von Listen und Dictionarys.

Listen und Dictionarys sind auch nicht C#-spezifisch sondern existieren in den meisten Programmiersprachen. Wenn man solche grundlegenden Dinge nicht versteht, kann man sie nachlesen. Wenn man sie nicht nachlesen will, hilft einem auch vorgefertigter Code nicht weiter.

[FAQ] Wie finde ich den Einstieg in C#?
[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Und bitte beachte zukünftig [Hinweis] Wie poste ich richtig?, besonders Punkt 1.1 und 4.2

15.11.2019 - 14:32 Uhr

Du brauchst du nur die leeren Werte aus dem Array zu filtern:

filter.Where(m => !string.IsNullOrEmpty(m))

Oder habe ich was falsch verstanden?

14.11.2019 - 15:28 Uhr

Du brauchst doch eigentlich nur die Berechnungen aus der Excel-Tabelle zu übernehmen. Wenn du nicht weißt, wie man die Berechnungen in C# umsetzten soll, dann schau mal hier rein:
[FAQ] Wie finde ich den Einstieg in C#?
[Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

13.11.2019 - 12:16 Uhr

Es gibt mehrere Wege, zum Ziel zu kommen. Statt ein Dictionary zu verwenden, könnte man auch direkt in ein Bitmap (oder 2D-Array) zeichnen.

Die einfachste, aber auch die unperformanteste, Möglichkeit wäre, Linq zu verwenden, und einfach diese Zeile aus dem ersten Beitrag:

foreach (Point Koordinate in Markierung)

hiermit zu ersetzen:

foreach (Point Koordinate in Markierung.Reverse())

Dadurch werden die späteren Markierungen immer durch die zuerst gezeichneten ersetzt.

12.11.2019 - 13:33 Uhr

Im MainViewModel solltest du keine Controls erstellen, sondern eigene ViewModels für die Menüpunkte. Die packst du dann in eine ObservableCollection und bindest diese Liste an ein ItemsControl. Siehe die Beispiele in [Artikel] MVVM und DataBinding, Abschnitt 2.4 ViewModel-Auflistungen bzw. Strg-F "ItemsControl".

08.11.2019 - 14:35 Uhr

Um es nochmal kurz zusammenzufassen: Die Performance-Probleme werden nicht durch die Berechnung verursacht, sondern durch das ständige Aktualisieren der Benutzeroberfläche.

Das kannst du umgehen, indem du die Daten für die Anzeige weniger häufig aktualisierst (siehe Abts Antwort), und indem du nur die Anzeigen aktualisierst, die sich auch wirklich geändert haben (das passiert beim DataBinding automatisch, siehe Th69s Antwort).

07.11.2019 - 17:44 Uhr

Benutze zum Drucken lieber einen Report-Generator. Die Daten aus dem Formular werden in den Report übertragen, der genau den Maßen des gedruckten Formulars entspricht, und dieser dann gedruckt. So hast du keine Probleme mit Druckereinstellungen etc.