Bei TreeView, gibt es die Möglichkeit mit ShowNodeToolTips = true; Dort
erscheint immer ein Fensterchen rechts unten, mit dem vollständigen Text.
Schön wäre es aber, wenn sich der Text einfach nach rechts fortsetzen würde.
Weiss das jemand ?
Du hast noch nicht abgefangen was passiert wenn der User anstatt einer Zahl etwas anderes eingibt. Am besten mit MyBool = int.TryParse(Input, out MyInt) versuchen. Dann wird keine Exception geworfen.
BTW, weils mir gerade wieder einfällt...
Ein reales Beispiel für was passiert wenn man Dinge nicht deterministisch freigibt.
Die Klasse System.Windows.Interop.D3DImage verwendet intern Objekte vom Typ System.Windows.Interop.InteropBitmap (bzw. davon abgeleitete).
Jedes mal wenn man D3DImage.SetBackBuffer mit einem anderen BackBuffer aufruft erzeugt D3DImage ein neues Objekt das von InteropBitmap abgeleitet ist.
Diese Objekte halten unmanaged Resourcen - ich glaube mich zu erinnern dass es um file mappings geht (Shared Memory halt).
D3DImage gibt diese InteropBitmap Objekte aber nie frei. (EDIT: Also "unreachable" werden die natürlich, aber D3DImage räumt sie eben nicht deterministisch ala IDisposable auf. /EDIT) Und es gibt auch sonst keine Klasse im ganzen WPF Framework die sich darum kümmern würde die InteropBitmap Objekte so bald wie möglich freizugeben.
Der Effekt: wenn man oft D3DImage.SetBackBuffer aufruft, weil man halt blöderweise muss (z.B. weil sich das Format oft ändert, oder weil der User dauernd Fenster wo ein D3DImage drinnen ist auf und zu macht), dann kackt das Programm irgendwann einfach ab. Fliegt ne Exception irgendwo in den Eingeweiden von WPF - gefangen bekommt man die nicht (weil WPF-interner Thread) und man könnte sie sowieso nicht sinnvoll behandeln. Bzw. davor wird es erstmal noch gröbstens langsam - so schlimm dass die ganze GUI einfriert und quasi unverwendbar wird.
Einziger Workaround der mir eingefallen ist: Nach allen 2-3 D3DImage die man erzeugt bzw. allen 2-3 SetBackBuffer Aufrufen ein GC.Collect ausführen.
Ich will damit nur verdeutlichen: Dispose-Disziplin ist keine unnötige Fleissaufgabe - es können in der Praxis wirklich böse Dinge passieren wenn man da schludert.
EDIT: Oops, zu früh Absenden gedrückt. Jetzt sollte es passen.
PCMan schrieb:
Frage ich mal andersherum: Wenn ein erfahrener Enwtickler die Sache angehen würde, schreibt der dann ganz spezifische Lösungen nur für diesen einen Fall? Oder entwickelt er etwas generisches, z.B. eine Steuerung, die sowohl den Aquariumfutterautomaten als auch den Rasensprenger bedienen kann?
Das hängt massiv vom Unternehmen ab, wo man arbeitet. Optimalerweise arbeitest Du in einem an eine Hochschule angeschlossenen Forschungsinstitut und hast da einen Namen. Und dann machste weder das eine noch das andere.
Im "real life" haste derzeit Chefs über Dir, die zur Zeit entweder SCRUM ums Verrecken oder 80er-Jahre-Stil durchboxen.
Du bist der einzige Programmieraffe, der gelegentlich ein Buch liest; und wirst bald den Ruf haben, zaubern zu können.
KP
So leicht lasse ich mich nicht verunsichern wenn ich mir wo sicher bin. Und wäre ich mir nicht sicher gewesen, hätte es mir auch nicht geschadet nochmal nachzulesen.
Also mit ListView geht es. Da kann man mit der rechten Maustaste den Eintrag
anklicken und Drag&Drop ausführen. Und die linke Maustaste kann man mit
MouseButton abfangen, also auch SelectItemChanged bearbeiten. Das Problem,
dass verschiedene Aktionen, mit der linken Maustaste beginnen, wird in der
Literatur beschrieben ! Drag&Drop von ListView nach TreeView ist eine Ausnahme !
Wieso wundert es dich, dass eine Funktion die eine 32 Bit CRC berechnet nicht eine 5 Bit CRC berechnet?
Versuch 'mal >> 31 in >> 4 umzuwandeln...
ps: Das höchstwertige Bit im Polynom brauchst du nicht, d.h. 0x15 tut's auch.
Du solltest vor allem darauf achten, die Berechnungen von der GUI zu trennen. Ist bei den paar Zeilen Code ist noch nicht so wichtig, aber man sollte möglichst früh damit anfangen. Also die eigentliche Funktion zum Berechnen darf nicht auf irgendwelche GUI Controls wie ComboBox oder Checkbox zugreifen, die muss alles was sie braucht als Parameter reinbekommen. Dann könntest du später z.B. eine Weboberfläche drüberklatschen und müsstest an der Berechnungsfunktion überhaupt nichts ändern, nur am Frontend.
Und gleich mal die Anmerkung, möglichst keine deutschen Bezeichner zu verwenden. Es gibt paar Leute, die es nicht stört, aber die allermeisten verwenden immer englische Bezeichner.
Danke für die Mühe - Kommando zurück. Ein Neustart von Visual Studio 2015 wirkt manchmal wunder... oder ich hatte einfach nicht gespeichert.
Auf jeden Fall funktioniert es jetzt.
Sorry für den Thread. Kann geschlossen werden.
/*schäm*/
Je nachdem was genau die Ansprüche sind:
static string ExceptTrim(string input, string charsToKeep)
{
//Echtes trim
return String.Concat(input.SkipWhile(c => !charsToKeep.Contains(c))
.Reverse().SkipWhile(c => !charsToKeep.Contains(c)).Reverse());
//Entfernt einfach alle Zeichen die nicht in "charsToKeep" sind aus dem string
return String.Concat(input.Where(c => charsToKeep.Contains(c)));
}
string test = ExceptTrim("test1234test44test", "0123456789");
Ein Pipe brauchst du bei C# nicht mehr explizit aufzubauen. Dafür gibts genug Methoden wenn du einen Prozess erstellt hast. Wie das funktioniert steht alles hier:
https://www.tutorials.de/threads/c-externes-programm-und-ausgabe-auswerten.336543/
Wenn du eine Echtzeitausgabe in deiner GUI willst, musst du das halt in einen zweiten Thread packen.