2 x 2 Textboxen aktuell halten.



  • Hallo.

    Ich soll einen Ausrechner für komplexe Zahlen mit c# bauen.

    Als Eingabe gibt es
    -Realteil und Imaginärteil
    -Betrag und Phase

    Es sind 4 Textboxen vorhanden, für jeden dieser Werte eine.

    Wenn ich Realteil und Imaginärteil eingebe, soll er Betrag und Phase ermiteln

    Das ganze umgekehrt, wenn Betrag und Phase eingegeben werden, sollen die anderen beiden Werte berechnet werden.

    Nun habe ich in die jeweiligen TextChanged-Events der Real- und Imaginärzahl die Rechnung für Betrag und Phase eingebaut, die die Werte auch den entsprechenden Textboxen zuweist.

    Das ganze umgekehrt mit den Textchanged-Events der Betrag und Phase, die die Real- und Imaginärteile ergänzen.

    Also ein Umrechner zwischen der geometrischen und der Polardarstellung sozusagen.

    Mein Problem ist:
    Angenommen, ich gebe Real- und Imaginärteil ein. Dann rechnet die Umrechnung und füllt die Felder Betrag und Phase.

    Nur leider werden in dem Moment die TextChanged-Event-Methoden von Betrag und Phase ausgelöst, so dass die Zahlen von denen wieder zurückgerechnet werden und in die Real-und Imaginärteil-Felder eingesetzt werden

    Dadurch werden wieder die TextChanged der Real- und Imaginärteile ausgelöst und die Zahlen ein drittes Mal umgerechnet usw usw.

    Eine nerverending-Story, bis es einen Stacküberlauf gibt. Außerdem lassen sich dadurch die Zahlen nicht wieder löschen.

    einen Knopf "Nun rechne!" darf ich nicht einbauen, das muss in Echtzeit aktualisiert werden, also in dem moment, wo User eine Zahl ändert.

    Wie verhinder ich das mit dem Hin- und her? Wie kann ich eine Textbox vom Programm aus mit Werten befüllen, ohne die TextChanged-Events auszulösen? Oder umgekehrt, gibt es ein Event, das wirklich nur dann ausgelöst wird, wenn die Zahlen vom Benutzer da eingegeben werden? 😕



  • Naja du könntest die LostFocus Events nutzen.



  • Ja,aber wenn ich zwei Felder vollgeschrieben habe, verlasse ich das letztausgefüllte ja nicht.


  • Administrator

    Naja, das wäre halt die Bedingung. Die Rechnung findet erst statt, wenn die Felder den Fokus verlieren.

    Ich nehme mal an, dass du WinForms verwendest. Da gäbe es nämlich ein ganz nützliches Property:
    http://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.modified.aspx

    Das praktische an dem ist, dass es nur auf true ist, wenn auch der User etwas verändert hat. Wenn du über die Property Text eine Änderung duchführst, wird Modified auf false gesetzt.

    Grüssli



  • Dann bastel dir doch eine zentrale Klasse die sich an die OnTextChanged Events / hängt ( oder KeyPress) und auswertet.

    Die Klasse muss dann halt nur managen dass einige Events ignoriert/deaktiviert werden und einige eben nicht.

    Real oder Imaginär Textbox geändert -->
    - Rechnen
    - deine Eventmethode von Betrag und Phase entfernen
    - Werte Setzen
    - Events wieder zuschalten

    Wenn du Betrag und Phase änerst dann das ganze Spiel anders herum!

    gruß
    Sascha



  • Oder einfach ein boolean der sich das merkt, so ala "self change"

    -> eingabe erfolgt
    -> if (!SelfChange)
    -> SelfChange = true;
    -> Rechnen
    -> Zuweisen
    -> SelfChange = false;

    Du musst ja nur unterscheiden ob der Text vom User oder von dir geändert wurde.



  • Hallo CSL,

    hättest ihm ja auch gleich diesen FAQ-Eintrag (aus dem MyCSharp-Forum) geben können: http://www.mycsharp.de/wbb2/thread.php?threadid=73593 -)


  • Administrator

    @CSL & Th69,
    Lest doch bitte mal durch, was das Property Modified genau tut.
    Wieso selber was hinzuschreiben, wenn es bereits fertig von der Bibliothek angeboten wird? 😉

    Grüssli



  • Hab ich nicht gesehen da es Forms ist, und von Forms hab ich kein Plan 😉

    franky hat ja noch nicht gesagt hat was er nun tatsächlich verwendet.


  • Administrator

    CSL schrieb:

    franky hat ja noch nicht gesagt hat was er nun tatsächlich verwendet.

    Naja, mit WPF würde ich aber eher ein TwoWay Binding verwenden mit einem eigenen Converter dazwischen, welcher die Rechnung ausführt, oder irgendetwas in der Richtung 😉

    Grüssli



  • Das ändert das Problem nicht.
    Sobald eine Eingabe in Box 1 gemacht wird soll ein Ergebnis in Box 2 gesetzt werden, und sobald in Box 2 eine Eingabe gemacht wird soll ein Ergebnis in Box 1 gemacht werden.
    Ob das Ergebnis nun von einem Converter eingetragen wird oder aus dem Code heraus ändert nichts an der Problematik wann gerechnet werden soll -> Endlosschleife.
    Entsprechend ist das Entfernen des Handlers oder ein Boolean die einzige gangbare Lösung.


  • Administrator

    Du vergisst, dass Binding automatisch dafür sorgt, dass es keine Rückkopplung gibt. Du kannst ja jederzeit zwei TextBox Elemente zusammenhängen, so dass die Änderungen in der einen TextBox sofort auf die zweite übertragen werden und umgekehrt.

    <TextBox Name="TxtFirst" />
    <TextBox Text="{Binding Text, ElementName=TxtFirst, UpdateSourceTrigger=PropertyChanged}" />
    

    Beide TextBox Elemente haben hier immer den gleichen Wert und zwar sofort. Egal in welcher TextBox man den Wert verändert. Eine Rückkopplung findet nicht statt. Damit beide TextBox Elemente mit einem Binding zusammengehängt werden können, müsste man wahrscheinlich ein zusätzliches DependencyProperty einführen, zu welchem man ein Binding aufbaut. Müsste man sich noch genauer überlegen, ist aber auf jedenfall möglich. Ich habe nämlich schon mal sowas ähnliches gebaut 😉

    Grüssli



  • // wegedit wegen blödsin 😃


Log in to reply