Man sollte überlegen wie nutzerfreundlich es wirklich ist, wenn Tasten still und leise einfach nur nichts bewirken. Das irritiert mehr als es hilft.
Da ist es verständlicher wenn man eingeben kann was man will, sieht dass was passiert und danach dann eine Meldung erhält dass die Eingabe keine gültige Zahl ist.
Die Tabelle sollte eigentlich... gefüllt sein.
Debugger gibt es, weil so vieles bei der Programmierung nicht das ist oder tut was es soll 😉
Die Meldung sagt "An der Position 0 befindet sich keine Zeile." mit der Angabe "bei Autovermietung2030.Vertrageinzel.PreisBerechnen()".
Die einzige Stelle in dieser Methode wo auf Position 0 zugegriffen wird, ist das mit tabelle.Rows[0]. Es gibt also scheinbar wirklich keine Row[0].
es handelt sich vermutlich um ein Timingproblem und ich solle die Datenbank einmal löschen und neu schreiben.
Jemand vom "Fach" rät das? Klingt gruslig. Was könnte ein Timingproblem sein? Datenbank neu schreiben, statt nachzusehen was das Programm tut?
> Sollen Begriffe wie "Checkout" oder "Commit" erhalten bleiben, eingedeutscht oder übersetzt werden?
Nein, blos nicht! Um Himmels willen...
Warum? Weil es nützlich ist einen eindeutigen Begriff für etwas wie einen Checkout oder Commit zu haben. In unserer Sprache wird das für nichts anderes verwendet als für diese eine Sache. In ziemlich jedem Artikel oder Forenbeitrag wird man diese Begriffe so finden. Also warum sollte man das unbedingt übersetzen? Irgendwelche Umschreibungen sind verwechselbar, man muss zuerst überlegen was gemeint sein soll.
Außerdem, sind wir ehrlich, Übersetzungen solcher Begriffe hören sich nur noch dämlich an.
Man aktiviert essentielle Features in Datenbank, damit der Programmierer nicht ständig an zig Dinge denken muss um alles konsistent zu halten, und dann muss man aber in jedem Verbindungsaufbau explizit angeben dass ein derart wichtiges Feature auch wirklich aktiviert wird?
Verstehe ich da was falsch, oder ist das tatsächlich so schlecht wie es sich für mich anhört?
Schau dir den betroffenen Bereich mit einem Hexeditor an. Vielleicht ist noch ein nicht darstellbares Zeichen zwischen dem = und dem " Zeichen.
Das würde erklären warum du alles bis zum = findest und ab dem " auch wieder, aber nichts wenn du nach =" hintereinander suchst.
Der Benutzer soll mit dem Auslösen des Commands eine optische Bestätigung, dass er einen Vorgang initiiert hat, bekommen.
Jetzt das große Aber,wenn der Benutzer nach diesem Auslösen nochmal was angeben muss, dann hat er doch den Vorgang noch nicht wirklich initiiert.
Dazu kannst du sicher verschiedene Meinungen bekommen, aber für mich ist es vor allem bei längeren Operationen wichtig dass ich sehe: jetzt läufts von selbst und will nichts mehr von mir. Dann kann man sich nämlich etwas anderem widmen.
Ich finde es unheimlich lästig wenn ich nach einiger Zeit wieder an den Rechner komme und sehe dass letztendlich noch überhaupt nichts passiert ist, weil ein paar Sekunden nachdem ich mich weggedreht habe, das Programm doch nochmal was von mir wollte.
Unabhängig von all dem frage ich mich, warum die MessageBox unbedingt in den asynchronen Ablauf hinein soll. So wie ich das verstehe kommt die zu Beginn des Ablaufs? Lässt sich das nicht alles vorher direkt abfragen und die eigentliche Aufgabe startet dann im asynchronen Teil?
Oder ist es wirklich so dass erst mal ein Teil der Arbeit passiert und sich zwischendrin dann erst eine Frage stellt?
Also mein erster Gedanke war ja, wenn er schon unbedingt deutsche Bezeichner nimmt, dann wenigstens konsequent auch mit Umlauten wo welche hingehören 😉
Rueckgabe .... sieht doch furchtbar aus.
Mein zweiter Gedanke war, die Kommentare irgendwo weit weit hinten in den Zeilen machen in weniger breiten Ansichten Probleme, sind in dieser Intensität sicher nicht nötig (oft erzählen sie nur das was doch sowieso schon da steht) und das Konzept sie immer auf gleiche Höhe zu setzen wird sicherlich schnell lästig.
Ich wollte dem Benutzer nur signalisieren, dass er den Rücksicherungsvorgang eingeleitet hat und über die MessageBox soll er auswählen, welchen Umfang die Rücksicherung haben soll.
Wat denn nu, wurde der Vorgang schon eingeleitet oder muss noch was dazu ausgewählt werden?
Ohne deinen genauen Fall zu kennen würde ich vorschlagen, der Benutzer soll doch einfach vor dem Start schon alles festlegen was passieren soll.
Ein Argument ist es wirklich nicht, aber nach meiner Erfahrung ist != true die Stufe bevor man merkt dass man auch == false schreiben kann 😉
In Fällen bei denen man zum Beispiel vor lauter Klammern und vielleicht | Verknüpfungen ein ! untergehen sieht, habe ich schon das ! in Leerzeichen gesetzt. Dann fällt es besser auf und der Lesefluss kann trotzdem bei "wenn nicht X" bleiben, statt zu einem "wenn X nicht ist" zu werden.
Ich finde es auch lesbarer wenn man == weglässt und dann genau das lesen kann was gemeint ist.
Sagt man "wenn Dienstag ist ..." oder "wenn es wahr ist dass Dienstag ist ..."?
Während == true einfach nur überflüssig ist finde ich == false noch schlimmer. Und != true ist das absolute Outing für Anfänger.
"Wenn nicht Dienstag ist" vs. "Wenn es falsch ist dass Dienstag ist ..." vs. "Wenn es nicht wahr ist dass Dienstag ist ...". Gruslig!
Bei meinen "zwei Zeilen mit Vergleich" wollte ich etwas anderes schreiben als ich letztendlich geschrieben habe. Ich habe meinen Beitrag geändert und das eingetragen was da eigentlich stehen sollte. Wie ich auf if... komme weiß ich nicht, da hat natürlich kein if was zu suchen.
Falls die Listen so typisiert sind dass nichts anderes als dieser eine Datentyp enthalten sein kann, kann man sich die Casterei und Tests auf den Typ ebenfalls noch sparen.
Schicker wäre noch statt if (isIdentical == false) nur if (!isIdentical) zu schreiben.
Auch schick finde ich nicht var zu verwenden sondern tatsächlich den Typ anzugeben um den es geht. var ist für mich Faulheit oder unangebrachte Coolness.
Die zwei Zeilen mit dem Vergleich lassen sich zusammenfassen durch return (((MyModel)obj).ItemId == this.ItemId); (Edit: vorher stand hier if (((MyModel)obj).ItemId == this.ItemId) was natürlich Quatsch ist, hier ist kein if sinnvoll)
Sehr wichtig wäre zuerst zu prüfen ob beide Listen gleich lang sind. Falls nicht sind sie nicht identisch und du bekommst einen Zugriffsfehler wenn du in der kürzeren Liste ein Element suchst das es nicht gibt.
Es geht hier um einen Text, nicht um Dateien 😉
Das Control dient der Vorschau der Farbauswahl des Nutzers.
Also ein ColorPicker?
Dann ist die Lösung doch ganz einfach. Die gewählte Farbe wird nicht als Hintergrund des Labels angezeigt, was ich bei diesem Zweck sowieso als seltsam empfinden würde, sondern in einer separaten Fläche die nur die gewählte Farbe enthält und sonst nichts.
Du kannst dir bei Zeichenprogrammen abkucken wie die das machen.
Oder soll das eine Auswahl für die Hintergrundfarbe für Schrift sein? Dann biete auch eine Auswahl für die Schriftfarbe an. Damit hat der Nutzer selbst in der Hand was er einstellt und du bist aus der Entscheidung raus. Sowas finde ich generell besser als wenn ein Programm versucht eine gute Entscheidung zu treffen. Ob jemand die gut findet oder nicht hängt letztendlich von der jeweiligen Person ab.
Stattdessen eben doch wieder schwarz oder weiß verwenden.
Invertieren der Farben kann zu seltsamen Erscheinungsbildern führen, selbst wenn man es vom Kontrast her gesehen noch lesen kann.
Warum kann das Control beliebige Farben haben? Lassen die sich auf eine sehr begrenzte Anzahl einschränken? Dann würde ich Farbpaare vorgeben die man gut lesen kann und die nicht den Augen weh tun.
Das darf dann aber nicht null sein, sondern ist überhaupt nicht definiert.
Die Beschränkung auf Ziffern kann man noch machen, aber viel mehr Logik halte ich für kontraproduktiv.
Ich fände es auch nicht schlimm wenn man zunächst beliebiges eingeben könnte und dann eine Meldung kommt "xyz ist kein gültiger Wert für ein Feld namens Anzahl, bitte eine Zahl eingeben" oder ähnlich. Sagt mehr aus als wenn eine Taste einfach nicht funktioniert.
setze ich meine Textbox auf den Wert 1 ... Kann da etwas schief gehen?
Ja. Jemand kann etwas eingeben von dem er denkt das passt, aber dein Programm macht mehr oder weniger unbemerkt mit 1 weiter.
Einfach "irgendetwas" tun von dem man so gut wie sicher sein kann dass es falsch ist, ist eine der schlechtesten Idee um mit Fehleingaben umzugehen. Die Eingabe auf "irgendetwas" abändern ist ebenfalls eine der schlechtesten Idee. Wie kommt man auf sowas?
Du guckst dir echt erst Werbung und dann ein Video an wo du jemandem beim tippen zu siehst? Du liebe Güte!
Mir wurds schnell zu blöd, aber viel kann dabei ja nicht rausgekommen sein. Vielleicht kannst du hier ein Beispiel posten das daraus entstanden ist.
Der auskommentierte Code zeichnet das Bild mit Höhe und Breite 400, soll das so sein? Falls es nicht quadratisch ist wird es dadurch verzerrt. (Mahlzeit g )
Von der Vorgabe "wenn größer soll es verkleinert werden" ist in deinem Code nichts zu sehen.
Etwas OT ... aber erwähnenswert.
Käse hier var zu verwenden
var verwenden ist in vielen Fällen entweder Faulheit oder der Irrglaube man würde damit etwas besser machen, obwohl es nicht der Fall ist 😉
Lesbarer wirds meist nicht.
Sollte das Frust abbauen, oder welchen Sinn hat das? Denn Nutzen, den Du selbst ansprichst, hat das keinen - für niemanden.
Dass ich das anspreche hat noch keinen Nutzen. Aber vielleicht zeigt sich der Nutzen, wenn zukünftig jemand der mit dem Prinzip und Grundverständnis von Arrays und Listen und deren Handling schon überfordert ist, einen Hinweis bekommt was er falsch macht oder wo er etwas übersieht, statt einfach auf Linq verwiesen zu werden.
Was soll denn jemand mit Linq wenn die Grundlagen noch fehlen?
Wenn sich jemand verläuft und mich um Rat fragt dann erkläre ich ihm wo er sich gerade befindet, wo er falsch abgebogen ist und wie er richtig läuft. Sollte ich sagen "kannst auch mit Auto, Bus oder U-Bahn hinfahren - falls du selbst rausfindest wo du bist und wo du hin musst"?
Statt ein Quiz daraus zu machen, kann man ja einfach produktiv antworten, oder?
Mit meiner Frage wollte ich ausdrücken dass ich nicht weiß was eine Und Verknüpfung hier bringen sollte.
Frust direkt ist es nicht, aber schade finde ich sowas. Ich bilde mir ein in der Zeit als ich von hier sehr wertvolle Antworten für mein C# Wissen mitgenommen habe waren die Antworten anders.
Es gibt die Methode BinarySearch für Listen und Arrays, hab ich soeben gefunden. Vielleicht hilft dir das ja.
Die erfordert aber dass die Liste sortiert ist. Sonst kann die Suche nicht wissen welche Listenelemente sie nicht überprüfen muss.
Denn wenn der Treffer überall stehen kann, muss alles durchsucht werden.
Dictionary lässt sich ja optimiert nach Keys durchsuchen.
Nicht ganz. Ein Dictionary merkt sich mittels Hashwerten wo ein Objekt liegt. Damit muss im Idealfall kaum gesucht werden, sondern es kann sich direkt ausrechnen wo das Objekt liegen müsste. In der Praxis liegen an dieser Stelle vielleicht auch mehrere Objetke, aber eben nicht alle sondern nur ein paar.
Wie sehr sich Optimierung lohnt hängt stark von deinem Anwendungsfall ab. Wenn ein Einzelplatzrechner der kaum was tut pro Tag 100 x 1 ms länger braucht wäre mir das egal. Wenn ein Server alle 10 Sekunden sehr viele Elemente durchsucht und dabei jeweils 0,5 Sekunden länger braucht ist es schlecht.
Dass reflexartig Linq erwähnt wird ohne der Frage viel zu nutzen ist man in diesem Forum gewohnt. Neu wäre der Hinweis auf UND Verknüpfungen - was könnte DNS46 damit anfangen?
Mit den if Abfragen mit dem break der inneren Schleife hast du auch einie magic numbers.
Noch schlimmer. Wenn man die for Schleife bis y2 ≤ 43 laufen lässt, muss man nicht mehr aus ihr herausspringen wenn y2 ≥ 44 ist 🙂
Die verschachtelten if kannst du doch auch ersetzen durch
if Fehler bei Schritt 1 then return
if Fehler bei Schritt 2 then return
if Fehler bei Schritt 3 then return
Meines Wissens kann die Zwischenablage Daten in mehrerem Variationen speichern. Vielleicht setzt du die falsche?
Guck dir doch den funktionierenden Inhalt mit GetData an, dann siehst du möglicherweise den entscheidenden Unterschied zu dem was du setzt.
Was mir noch auffällt und dir sicherlich hilft.
Nenne den Zähler nicht C, sondern so dass du weißt was er tut. Dann brauchst du hinter die Verwendung der Variable nicht schreiben was sie ist.
Ja, ich weiß man denkt sich gerne mal "das weiß ich dann später schon noch", wenn man als Anfänger sein erstes Programm macht. Ist aber garantiert nicht so 🙂
item.SubItems.Add(sqlReader.GetValue(1).ToString()); //Artikel
Das funktioniert solange der Wert 1 auch tatsächlich der Artikel ist.
Wenn du in die Tabelle einen Wert einfügst und sich die Spalten verschieben, ist dein komplettes Programm im Eimer und du suchst und fluchst.
Greife per Spaltenname auf den Wert zu. Dann kannst du auch hier wieder auf den Kommentar verzichten.
(Mit dem SqlReader bin ich spontan nicht so fit dass ich Methodennamen kenne. Ich weiß dass es mit einer Table und den einzelnen Rows funktioniert.)
float num2 = float.Parse(string.Format("{0:0.00}", sqlReader.GetValue(5).ToString()));
Allgemein wäre ich mit ToString bei solchen Dingen vorsichtig. Es verleitet einen das oft zu verwenden weil es einem aus allem schnell einen String macht. Nutze lieber den Datentyp der tatsächlich drin steckt. In deinem Fall steht hoffentlich ein float in der Datenbank? Warum also den in einen String wandeln und den String dann wieder zurück in float parsen? Lies den Wert doch gleich als float aus.
Dass string.Format einen String als 0.00 float formatiert kann ich mir übrigens nicht vorstellen. Funktioniert das bisher tatsächlich?
Das Ganze funktioniert aber nur mit einem Produkt und will nicht mehr, wenn mehrere Produkte gescannt werden.
Könnte das daran liegen dass du nur dann etwas zu listWarenkorbMain hinzufügst wenn C == 1 ist?
Dass der Entwickler da produktiver ist mag sein. Aber wie sieht es für den Anwender aus?
Ja, einige Punkte sind eine Frage der Implementierung. Aber die erlebe ich eben hier und da ziemlich mager.
Das Argument "jetzt alles als Webanwendung" alleine ist noch nicht genug. Man muss es dann schon auch gescheit machen - wenn das nicht passiert, ist kein Wunder dass so ein Eindruck entsteht.
Selbes mit "wir haben eine Umgebung in der man tolle Dinge anstellen könnte, aber das was letztendlich passiert ist ein Rückschritt" 😉
Nur weil es Webanwendungen gibt und viele glauben sie müssten sie deswegen für alles einsetzen, ist das trotzdem noch nicht überall sinnvoll 🙂
Man denke an Onlinebanking, wo man ein Problem kriegt wenn man aus Gewohnheit "zurück" klickt - und dann auf einer abgelaufenen Session steht und sich dann vielleicht direkt neu anmelden muss damit man weiter kommt. Lästig! Und undurchdacht!
Oder andere Anwendungen die es oft auch im professionellen Umfeld gibt, wo die ganzen Aspekte die hier angesprochen werden (mehrere Ansichten, verschiebbar und so) entweder einfach gar nicht existieren oder plump und nur unzureichend simuliert werden.
Ganz davon zu schweigen vom Aktualisierungskonzept einer Ansicht. Wenn ich zum umsortieren einer Liste einen Durchlauf "Anfrage an den Server - Antwort vom Server - Neuaufbau der kompletten Ansicht" abwarten muss, das kanns nicht sein.
Das Argument "läuft auf jeder Platform" mag stimmem. Nur was hilft es mir wenn etwas zwar auf jeder Platform läuft, ich das aber gerade im Firmenumfeld gar nicht brauche weil es dort nur Windows gibt? Für diese rein in der Theorie existierende Freiheit gebe ich die ganzen Vorteile einer richtigen Anwendung auf.
Wie viel Lob darf ich dafür erwarten?
Dazu kommt dass eine professionelle Anwendung für mich subjektiv gesehen einfach nichts in einem Browsertab zu suchen hat, neben dem sich Katzenvideos, Nachrichtenseiten, Facebook und ähnliches tummeln.
am liebsten wäre meinen Chef eine Webanwendung
Da haben wir das Problem.
Warum wäre ihm das am liebsten? Ist er die Art Chef, der mit der Thematik nichts zu tun hat und der Begriff "Webanwendung" das einzige ist was ihm dazu zufällig irgendwo begegnet ist?
Informiere ihn dass man nach der Aufzählung der Vorteile nicht zu lesen aufhören darf, da kommen meistens noch die Nachteile 😉
Den running Gag, dass man jemandem der noch so gut wie nichts kann mit LINQ kommt, haben wir jetzt ja auch mal wieder hinter uns. Jetzt etwas tatsächliche Hilfe.
Tip mit der Klasse ist klasse 🙂 Setz das um, dann ist der Code gleich viel sprechender.
Dann mach dir eine for-Schleife die über alle Umsätze läuft und sich den höchsten davon merkt. Der hat die halbe Bildschirmbreite.
Für die anderen Umsätze kannst du dann mit dem Dreisatz ausrechnen wie breit die jeweils sein sollen.
Wenn nur verschoben und nicht eingefügt/gelöscht wird, musst du beim Verschieben nur die Sortierungen vom Einfügepunkt bis zum Endpunkt anpassen.
for i von Min(Anfangsposition, Endposition) bis Max(Anfangsposition, Endposition) setze Sortierwert = i
Die Variablen müssen in diesem Fall eben global gemacht werden. Oder es wird eine Methode für das SQL erstellt, in die man die Variablen als Parameter übergibt.
Wie das SQL ausgeführt wird ist für die eigentliche Frage nicht entscheidend. Wohl aber für den nächsten Schritt, nämlich dass man eine saubere Abfrage bekommt.
Es ist ein Unterschied zwischen
* Ich soll dies und das machen, Code bitte.
* Ich soll dies und das machen und hänge an einem bestimmten Punkt.
Was ich interessant finde, dass einige Antworten eingehen obwohl bis zur Erklärung nun wirklich niemand wissen konnte was da "nicht funktioniert" 😉
C# bietet vieles was man grundsätzlich mit Strings machen wollen könnte. Diese Aufgabe ist allerdings "zu speziell" als dass C# dazu eine eingebaute Methode hätte. Aber wie du ja siehst, ist das schnell selbst programmiert.
(Ich hoffe das beantwortet deine Frage - falls nicht, bitte genauer erklären was du wissen möchtest)
Die Stelle eines Zeichens bekommst du mit IndexOf.
Deine Beschreibung verstehe ich nicht. Ab dem X willst du den Rest der Zeile inklusive dem N löschen. Später willst du aber ab dem N löschen?
Ich glaube da ist ein Bild hilfreich. Ich wüsste nämlich gerade nicht wo links Platz entsteht wenn Text umbricht.
Dein Problem ist die Herangehensweise -> "ich bin auf der Suche nach einer Library".
Als erstes sollte man bei solch kleinen Dingen danach suchen wie Netzwerkadressen gebildet werden und sich überlegen ob man sich ein Snippet dazu sucht das man in den Code einbaut, statt eine Library dafür einzubinden 😉
Sind die Werte für die neue Bildgröße schlüssig? Vergleiche sie mit dem Bild was als Resultat herauskommt. Dann siehst du ob deine Crop Routine nicht passt, oder ob die neue Bildgröße schon nicht stimmt.
Wenn die Methoden zur Gesichtserkennung schon unsinnige Werte zurückgeben, kann natürlich kein sinniges Bild mehr herauskommen.
Und wie gesagt, dass das immer nur bei der Auflösung von 96 funktioniert ist wirklich komisch. Die Auflösung hat meiner Meinung hier überhaupt nichts zu suchen.
Vorweg ich hab zu Gesichtserkennung überhaupt keinen Einblick.
Mich wundert dass hier die Auflösung des Bilds eine Rolle spielen soll. Sollten das nicht alles absolute Pixelangaben sein? Da sollte es völlig irrelevant sein welche Auflösung man dem Bild andichtet, die es später vielleicht beim Ausdruck oder sonstiger Darstellung haben soll.
Du beginnst mit zahl bei 0, wirst aber nur aktiv wenn zahl ≥ 1 🙂
Sofern das nicht sowieso raus optimiert wird, sparst du dir schon mal einen Vergleich pro Durchlauf, wenn du direkt bei 1 beginnst. Und du sparst dir optisch eine Einrückungsebene.
ConvertToInt64 brauchst du auch nicht, liest sich nur schwer aber der Compiler wandelt dir das automatisch um.
Was ich mir jetzt alles überlege, bitte selber noch nachprüfen.
Was genau soll in primzahl stehen? So wie ich das Sieb verstehe, markiert es Zahlen. Wäre also ein Array von bool Werten statt Zahlen?
Ich würde primzahl[ i ] nicht mit i+1 füllen, sondern mit i. Sonst kennt sich keiner mehr aus.
Das führt dann dazu dass du nicht mehr primzahl[zahl] auslesen musst was einen Zugriff auf das Array bedeutet, sondern du bei der Prüfung auf != u und der Rechnung mit % direkt zahl verwenden kannst.
Nur für primzahl [zahl] != 0 brauchst du noch das Array, denn das prüft die Markierung der Zahl, statt den Wert selbst.
Zu if (primzahl[zahl] % u == 0) was mit sinnvolleren Zuweisungen das selbe ist wie if (zahl % u == 0).
Die % Rechnung wird nicht Null, wenn zahl < u. Du kannst also die innere Schleife bei u beginnen, statt bei 0. Das spart einiges an Durchläufen.
Wenn du die Schleife erst bei u+1 beginnst und den Fall zahl == u separat in der äußeren Schleife behandelst, kannst du den Test primzahl[zahl] != u auch weglassen.0
Ein weiterer Ansatz: Das Sieb markiert Vielfache einer Zahl.
Du durchläufst JEDE Zahl und prüfst mit % ob sie ein Vielfaches von u ist. Das funktioniert zwar, ist aber sehr viel Aufwand. Für u = 1000 findest du ein Vielfaches und prüfst dann die nächsten 999 Zahlen ebenfalls, obwohl die kein Vielfaches sein können. Für u = 10000 prüfst du 9999 andere Zahlen ohne Ergebnis.
Also beginne die innere Schleife bei zahl = u und dann nicht mehr zahl++ sondern zahl += u. Dann brauchst du die % Operation nicht mehr und kannst ohne weitere Prüfung primzahl[zahl] = 0 setzen.
Als welcher Datentyp ist denn das Datum in Win32_OperatingSystem gespeichert?
Dieses ToString überall finde ich eine Katastrophe, machen anfangs alle. Alles was man hat wird in einen String gewandelt und dann wieder mühsam zurück.
Wenn die Tabelle Win32_OperatingSystem sauber angelegt ist, ist das Datumsfeld bereits ein Datum und muss nur noch passend gecasted werden.
Das mit dem "screen.Bounds" ist echt gemein. Mit großen "Screen" wird das nämlich nicht angeboten.
Was ist gemein und was wird nicht angeboten?
Ich denke das liegt am "Screen.PrimaryScreen.Bounds.[...]"
Wenn du nur nach dem ersten Bildschirm fragst, bekommst du in der Tat auch nur den ersten zu sehen.
screen.Bounds.ToString());" zeigt es richtig an, aber in einer Art und Weise, wie mir das nicht gefällt (Siehe Anhang)
Mal ne irrwitzige Idee, was wenn du die Ausgabe in der Form die du haben willst ganz einfach nicht immer nur mit dem selben Screen.PrimaryScreen.Bounds.Width machst, sondern mit dem aktuellen screen.Bounds.Width?
Was macht der Ping wenn er keine Antwort kriegt, fällt der dann wirklich in eine Exception oder gibt das einen Status zurück?
Dann wäre dein Programm nämlich weit davon entfernt "nichts zu tun", weil es dann permanent ständig pingen würde 🙂
laut Einzelkschritt wird die "1" aber in "Wert" geschrieben...
Und was passiert wenn du weiter tippst mit dem Wert?
Den Ausdruck "if ((value % 1) > 0)" finde ich interessant. Da sollte ein Kommentar ran, der aussagt was das soll.
Length == 3 wird nur aktiv wenn genau drei Nachkommastellen eingegeben werden. Was wenn jemand eine Zahl mit 5 Nachkommastellen hineinkopiert?
Machs lieber etwas überschaubarer, zum Beispiel teste ob 100 * value noch Nachkommastellen hat.
Und wieso werden die drei Algorithmen (sind ja alles eine Form der Tiefensuche) haupsächlich für Bäume erklärt?
Ein Baum ist ein Graph mit vielen Einschränkungen. Es gibt nur genau einen Einstiegspunkt, eine definierte Richtung (Pfeil bei der Verbindung) und keine Zyklen. Beim Binärbaum hat ein Knoten maximal zwei Nachfolger, so dass man von links und rechts sprechen kann und die Nachfolger somit auch geordnet sind (z.B. links ist immer kleiner als rechts).
Ein allgemeiner Graph kann bidirektionale Verbindungen und Zyklen haben und seine Nachfolger haben auch nicht unbedingt eine Sortierung.
Preorder und Postorder besuchen die Nachfolger beim Binärbaum entweder alle vor dem Knoten oder alle nach dem Knoten. Das lässt sich von den zwei Nachfolgern beim Binärbaum leicht auf sonstige Anzahlen an Nachfolgern erweitern. Dann sind es eben nicht zwei Teile die man alle vor/nach dem Knoten besucht, sondern mehr.
Inorder besucht den Knoten genau zwischen dem linken und dem rechten Nachfolgerknoten. Das "zwischen" wird beim beliebigen Graphen schwer, denn der hat nicht nur (maximal) zwei Nachfolger.
Natürlich kannst du dir eine Strategie überlegen die "inorder" funktioniert. Zum Beispiel indem du den Knoten selbst immer nach dem ersten Nachfolgebaum untersuchst (egal wie viele noch kommen), oder immer vor dem vorletzten, oder immer nach der Hälfte oder was dir eben einfällt.
Hiermit bekomme ich den Wert weiß aber nicht wie ich das der Schleife übergeben kann, weil ich daraus nicht Length entnehmen kann.
Ist nicht das i das du hier erhältst schon genau diese Anzahl?
Nächster Punkt. Dein Code sieht für mich aus als bräuchtest du nicht nur die Zahl der angehakten Checkboxen, sondern solltest auch wissen welche das sind.
Also solltest du trotzdem alle durchlaufen und in der Schleife aber nur diejenigen berücksichtigen die Checked sind.
Sonst würdest du bei einer angehakten Checkbox mit dem Zähler 1 in deine Schleife gehen und immer nur Textbox 0 ansprechen, egal welche Checkbox angehakt ist.
Statt dem Gebastel mit den Namen könntest du alle Checkboxen und Textboxen jeweils in ein Array oder eine Liste packen. Dann kannst du mit Index auf diese Elemente zugreifen und brauchst nicht ständig mit Controls.Find hantieren.
Dann irgendwann später wenn du verstanden hast was du da tust und wie man Listen, Array etc. benutzt, kannst du dir ansehen was Databinding und Linq ist.
Aber bitte alles der Reihe nach verstehen. Kein Arbeitgeber will von dir hören dass du weißt wie man Linq schreibt und deshalb nicht mehr wissen musst was ein Array ist.
Da du die Variablen nicht als Zahl deklariert hast sondern als Weekday, will der Compiler dafür auch ein Element der Aufzählung haben.
Du könntest das casten als (Weekday)1, dann geht das. Aber dann nimmst du dir den Vorteil, sofort sehen zu können welches Aufzählungselement das ist.
Soweit dazu warum die 1 nicht ohne ausdrücklichen Cast akzeptiert wird.
Warum die 0 dann doch funktioniert, könnte daran liegen dass eine solche Variable mit einer 0 vorbelegt wird wenn du nichts anderes angibst. Daher könnte es sein dass der Compiler erkennt, da passiert ja nichts was ohne diese Zeile nicht auch passieren würde, und er deswegen die Zuweisung hinnimmt.
Mal angemerkt, selbst wenn man rausfinden könnte wie viele Parameter eine Methode/Funktion hat, weiß man ja immer noch nicht welche das sind.
Würde also nicht sehr viel bringen, denn man hat dann immer noch keinen Hinweis darauf was man da nun übergeben soll.
Klar, wenn du auf beide wartest wird auch auf beide gewartet 🙂
Erstelle die zwei Tasks nur einmalig und lass die selbst in einer Schleife schauen ob noch was in der Queue ist.
"Queue ist gesperrt"
Eigentlich ist die Queue hier ja nur leer, aber nicht gesperrt.