none
Textboxausgabe begrenzen RRS feed

  • Frage

  • Hallo,

    ich habe vor kurzem angefangen mich in das Visual Studio 2019 einzuarbeiten. Da ich vorher keine Programmierfähigkeiten hatte ist aller Anfang schwer. Mittlerweile habe ich es erst einmal geschafft, über diverse Internetseiten und Tutorials eine Windows Form App zu erstellen.

    Ziel dieses kleinen Programmes ist es mittels der Flächeneingabe (LP X und LP Y), dem zugehörigem Zylinder (Zylinderdurchmesser) und der maximalen Tonnage und dem gewünschten Druck eine berechnete Ausgabe, in einer zugehörigen Textbox, zu geben.

    Leider ist bei den berechneten Ausgaben die Nachkommastelle sehr lang.

    Wie kann ich diese Kommastelle auf 2 begrenzen?

    private: System::Void Button1_Click(System::Object^ sender, System::EventArgs^ e)
    {
        //Berechnung der Laminierfläche in cm²
        lpquadrat->Text = Convert::ToString(Convert::ToInt32(lp_x->Text) * Convert::ToInt32(lp_y->Text) / 100);
    
        //Berechnung der Stempelfläche in mm²
        stempelflaeche->Text = Convert::ToString((((Convert::ToInt32(stempelbox1->Text) / 2) * (Convert::ToInt32(stempelbox1->Text) / 2)) * 3.1416) / 100);
    
        //Berechnung des maximalen hydraulischen Druckes in bar
        max_bar_hyd->Text = Convert::ToString((Convert::ToInt32(maximal_t1->Text) / Convert::ToDouble(stempelflaeche->Text)) * 1000);
    
        //Berechnung des maximalen Drucks auf die Laminierfläche basierend auf maximale Tonnage in N/cm²
        max_druck_lp->Text = Convert::ToString((Convert::ToDouble(maximal_t1->Text) / Convert::ToDouble(lpquadrat->Text)) * 9806.55);
    
        //Berechnung des hydraulischen Druckes auf die Laminierfläche bei einem gewünschten Druck auf die Laminierflächen (Angabe in N/cm²)
        bar_berechnet->Text = Convert::ToString((Convert::ToInt32(n_cm2->Text) * Convert::ToInt32(lpquadrat->Text) / Convert::ToDouble(stempelflaeche->Text)) * 0.09807);
    }

    Vielen Danke im voraus für die Hilfe.


    Donnerstag, 15. August 2019 10:27

Antworten

  • Hi,

    ich gebe Stefan absolut recht C++ ist alles andere als einfach. Ich finde auch das C# sicherlich die besser Wahl ist wenn man nicht vorhat Spiele oder Microcontroller zu entwickeln. Wobei beides auch mit C# geht.

    Um dir den Umstieg/Einstieg einfacher zu machen, habe ich dein Beispiel von oben nach C# und WPF überführt.

    WPF ist der Nachfolger von Windows Forms und meiner persönlichen Meinung nach besser.

    Projektart: WPF-App (.NET Framework)

    In die MainWindow.XAML kommt dieser Code. Aber nur der Inhalt von Window

    <Window ...>
        <!--Das Grid ist wie eine Tabellenstruktur mit Zeilen und Spalten-->
        <Grid>
            <ScrollViewer>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="40"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
    
                    <!--Das StackPanel ordnet alle Element untereinander oder nebeneinander-->
                    <StackPanel  Orientation="Vertical" Grid.Column="0">
    
                        <Label Content="Fläche X" />
                        <TextBox x:Name="tbLpX" />
    
                        <Label Content="Fläche Y" />
                        <TextBox x:Name="tbLpy" />
    
                        <Label Content="Stempelbox 1" />
                        <TextBox x:Name="tbStempelbox1" />
    
                        <Label Content="Maximal T1" />
                        <TextBox x:Name="tbMaximalT1" />
    
                        <Label Content="n_cm2" />
                        <TextBox x:Name="tbN_cm2" />
                        
                    </StackPanel>
    
                    <!--Durch Grid.Column wird das Element in die rechten Spalte eigefügt -->
                    <StackPanel  Orientation="Vertical" Grid.Column="1">
    
                        <Label Content="lpquadrat" />
                        <TextBox x:Name="tbLpquadrat" />
                        
                        <Label Content="Stempelfläche" />
                        <TextBox x:Name="tbStempelflaeche" />
    
                        <Label Content="max_bar_hyd" />
                        <TextBox x:Name="tbMax_bar_hyd" />
    
                        <Label Content="max_druck_lp" />
                        <TextBox x:Name="tbMax_druck_lp" />
    
                        <Label Content="Bar" />
                        <TextBox x:Name="tbBar_berechnet" />
                    </StackPanel>
    
                    <Button Content="Berechne" Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Click="BtnBerechne_Click" />
                </Grid>
            </ScrollViewer>
        </Grid>
    </Window>

    Und in die MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();
    }
    
    private void BtnBerechne_Click(object sender, RoutedEventArgs e)
    {
        double lpx = StringToDouble(tbLpX);
        double lpy = StringToDouble(tbLpy);
        double stempelbox1 = StringToDouble(tbStempelbox1);
        double maximal_t1 = StringToDouble(tbMaximalT1);
        double nCm2 = StringToDouble(tbN_cm2);
    
        double lpquadrat = lpx * lpy / 100;
        double stempelflaeche = ((stempelbox1 / 2) * (stempelbox1 / 2) * 3.1416) / 100;
        double max_bar_hyd = maximal_t1 / stempelflaeche * 1000;
        double max_druck_lp = maximal_t1 / lpquadrat * 9806.55;
        double bar_berechnet = nCm2 * lpquadrat / stempelflaeche * 0.09807;
    
        tbLpquadrat.Text = Math.Round(lpquadrat, 2).ToString();
        tbStempelflaeche.Text = Math.Round(stempelflaeche, 2).ToString();
        tbMax_bar_hyd.Text = Math.Round(max_bar_hyd, 2).ToString();
        tbMax_druck_lp.Text = Math.Round(max_druck_lp, 2).ToString();
        tbBar_berechnet.Text = Math.Round(bar_berechnet, 2).ToString();
    }
    
    private double StringToDouble(TextBox tb)
    {
        if (double.TryParse(tb.Text, out double d))
        {
            return d;
        }
    
        //Wenn das paresen nicht funktioniert hat, MesageBox anzeigen
        MessageBox.Show("Der eingegebene Wert entspricht keiner Zahl");
        tb.BorderBrush = Brushes.Red;
    
        return 0;
    }

    Ich habe das gesamte Projekt auf Github hochgeladen https://github.com/twytec/WpfRechnenMitWerten dort kannst Du es wenn Du willst auch runterladen (Clone)


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings




    • Bearbeitet Thomas Wycichowski Donnerstag, 15. August 2019 22:36
    • Als Antwort markiert Isosek Montag, 19. August 2019 09:25
    Donnerstag, 15. August 2019 22:18
  • Hi,

    bspw. so:

    this.textBox1.GotFocus += new System.EventHandler(this.textBox_GotFocus);
    this.textBox2.GotFocus += new System.EventHandler(this.textBox_GotFocus);
    ...
    
    
    private void textBox_GotFocus( object sender, EventArgs e )
    {
       ((TextBox)sender).SelectAll();
    }

    Zukünfigt bitte aber noch beachten: neue Fragen bitte immer in einem neuen Thread stellen und beantwortete Fragen durch "Als Antwort markieren" und ggfs. "Abstimmen" abschließen. Das erhöht die Übersichtlichkeit im Forum enorm. Vielen Dank.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Isosek Montag, 19. August 2019 09:25
    Montag, 19. August 2019 08:20
    Moderator

Alle Antworten

  • Hi,

    die ToString Methoden numerischer Datentypen haben in der Regel eine Überladung, um das Zahlenformat anzugeben. In deinem Fall bspw. so:

    deineTextBox.Text = deineDoubleVariable.ToString( "N2" );

    Ist jetzt in C# aber wenn ich das richtig sehe, musst Du nur anstatt . -> nehmen (C++ ist nicht meine Welt :))


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 15. August 2019 11:18
    Moderator
  • Ich habe keine Ahnung, wie ich die Variablen richtig anlege. Ich lese soviel durch und alles was ich versuche gibt mir Fehler aus. Ich arbeite in einem Windows Forms template. Ich würde ja gerne ein Bild posten, welches die Oberfläche zeigt, aber ich bin noch nicht verifiziert hier.
    Donnerstag, 15. August 2019 11:36
  • Hi,

    musst Du zwingend C++ machen? Ich persönlich würde ja eher mit C# anfangen, dazu findest Du zum einen sehr viel einfaches Lernmaterial und für Einsteiger finde ich schon, dass es einem damit besser gelingt, die Programmiererwelt kennenzulernen.

    Ursprünglich wolltest Du ja wissen, wie Du die Ausgabe auf zwei Nachkommastellen begrenzen kannst. Das geht wie oben gezeigt.

    Welche anderen Fehler noch bei dir kommen, weiß ich natürlich nicht. Hier würden die exakten und vollständigen Fehlermeldungen inkl. Angabe des Codes, der den Fehler auslöst, schon weiterhelfen.

    ---

    Generell solltest Du aber solche Convert "Orgien" wie in deinem Code oben vermeiden. Leg dir entsprechende Variablen an, konvertiere dann einmal die Stringwerte aus dein Eingabefeldern in die numerischen Zielformate, rechne damit und nur das Ergebnis wird dann auch einmalig wieder in einen String umgewandelt.

    Ein sehr einfach gehaltenes Beispiel:

    string eingabe1 = textBoxEingabe1.Text;
    string eingabe2 = textBoxEingabe2.Text;
    string ausgabe;
    
    int zahl1;
    int zahl2;
    int ergebnis;
    
    int.TryParse( eingabe1, out zahl1 );
    int.TryParse( eingabe2, out zahl2 );
    
    ergebnis = zahl1 * zahl2;
    
    ausgabe = ergebnis.ToString();
    
    textBoxAusgabe.Text = ausgabe;

    HTH


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 15. August 2019 11:40
    Moderator
  • Das hilft mir schon mehr.

    Es muss nicht C++ sein.

    Was mir nur immer fehlt ist, wo ich diesen Code eintrage. Vorm eigentlichen berechnen ist mir klar, aber ich habe keine Ahnung, ob ich diesen ganz oben im Code eintragen muss, oder ob ich immer so ein "private" machen muss.

    Edit: Ich habe mal das mit deinem string eingabe1 = textBoxEingabe1.Text mal eingeben und bekomme prompt einen Fehler. Ich muss noch #include <string> darüber eingeben und im besten Fall noch using namespace std. Allerdings mekert er dann wieder bei namespace rum. Ich bin wohl zu dumm für sowas einfaches.


    • Bearbeitet Isosek Donnerstag, 15. August 2019 12:01
    Donnerstag, 15. August 2019 11:55
  • Hi,

    dann würde ich C++ wieder zur Seite legen und mit C# weitermachen.

    Die Grundlagen der Programmierung können wir dir hier allerdings für keine der Sprachen beibringen, das musst Du schon selbst erledigen.

    Hier mal ein paar Seiten, die dir evtl. helfen:

    http://www.csharpme.de/

    Visual C# OpenBook


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Donnerstag, 15. August 2019 14:26
    Moderator
  • Hi,

    ich gebe Stefan absolut recht C++ ist alles andere als einfach. Ich finde auch das C# sicherlich die besser Wahl ist wenn man nicht vorhat Spiele oder Microcontroller zu entwickeln. Wobei beides auch mit C# geht.

    Um dir den Umstieg/Einstieg einfacher zu machen, habe ich dein Beispiel von oben nach C# und WPF überführt.

    WPF ist der Nachfolger von Windows Forms und meiner persönlichen Meinung nach besser.

    Projektart: WPF-App (.NET Framework)

    In die MainWindow.XAML kommt dieser Code. Aber nur der Inhalt von Window

    <Window ...>
        <!--Das Grid ist wie eine Tabellenstruktur mit Zeilen und Spalten-->
        <Grid>
            <ScrollViewer>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="40"/>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
    
                    <!--Das StackPanel ordnet alle Element untereinander oder nebeneinander-->
                    <StackPanel  Orientation="Vertical" Grid.Column="0">
    
                        <Label Content="Fläche X" />
                        <TextBox x:Name="tbLpX" />
    
                        <Label Content="Fläche Y" />
                        <TextBox x:Name="tbLpy" />
    
                        <Label Content="Stempelbox 1" />
                        <TextBox x:Name="tbStempelbox1" />
    
                        <Label Content="Maximal T1" />
                        <TextBox x:Name="tbMaximalT1" />
    
                        <Label Content="n_cm2" />
                        <TextBox x:Name="tbN_cm2" />
                        
                    </StackPanel>
    
                    <!--Durch Grid.Column wird das Element in die rechten Spalte eigefügt -->
                    <StackPanel  Orientation="Vertical" Grid.Column="1">
    
                        <Label Content="lpquadrat" />
                        <TextBox x:Name="tbLpquadrat" />
                        
                        <Label Content="Stempelfläche" />
                        <TextBox x:Name="tbStempelflaeche" />
    
                        <Label Content="max_bar_hyd" />
                        <TextBox x:Name="tbMax_bar_hyd" />
    
                        <Label Content="max_druck_lp" />
                        <TextBox x:Name="tbMax_druck_lp" />
    
                        <Label Content="Bar" />
                        <TextBox x:Name="tbBar_berechnet" />
                    </StackPanel>
    
                    <Button Content="Berechne" Grid.Row="1" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" Click="BtnBerechne_Click" />
                </Grid>
            </ScrollViewer>
        </Grid>
    </Window>

    Und in die MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();
    }
    
    private void BtnBerechne_Click(object sender, RoutedEventArgs e)
    {
        double lpx = StringToDouble(tbLpX);
        double lpy = StringToDouble(tbLpy);
        double stempelbox1 = StringToDouble(tbStempelbox1);
        double maximal_t1 = StringToDouble(tbMaximalT1);
        double nCm2 = StringToDouble(tbN_cm2);
    
        double lpquadrat = lpx * lpy / 100;
        double stempelflaeche = ((stempelbox1 / 2) * (stempelbox1 / 2) * 3.1416) / 100;
        double max_bar_hyd = maximal_t1 / stempelflaeche * 1000;
        double max_druck_lp = maximal_t1 / lpquadrat * 9806.55;
        double bar_berechnet = nCm2 * lpquadrat / stempelflaeche * 0.09807;
    
        tbLpquadrat.Text = Math.Round(lpquadrat, 2).ToString();
        tbStempelflaeche.Text = Math.Round(stempelflaeche, 2).ToString();
        tbMax_bar_hyd.Text = Math.Round(max_bar_hyd, 2).ToString();
        tbMax_druck_lp.Text = Math.Round(max_druck_lp, 2).ToString();
        tbBar_berechnet.Text = Math.Round(bar_berechnet, 2).ToString();
    }
    
    private double StringToDouble(TextBox tb)
    {
        if (double.TryParse(tb.Text, out double d))
        {
            return d;
        }
    
        //Wenn das paresen nicht funktioniert hat, MesageBox anzeigen
        MessageBox.Show("Der eingegebene Wert entspricht keiner Zahl");
        tb.BorderBrush = Brushes.Red;
    
        return 0;
    }

    Ich habe das gesamte Projekt auf Github hochgeladen https://github.com/twytec/WpfRechnenMitWerten dort kannst Du es wenn Du willst auch runterladen (Clone)


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings




    • Bearbeitet Thomas Wycichowski Donnerstag, 15. August 2019 22:36
    • Als Antwort markiert Isosek Montag, 19. August 2019 09:25
    Donnerstag, 15. August 2019 22:18
  • Hallo  Thomas und Stefan,

    ich habe euren Rat befolgt und C# angefangen. Zwar Windows Forms erstmal aber mein Programm funktioniert jetzt fürs erste.

    Ich werde mir dein WPF Program anschauen und ausprobieren.

    Eine andere Frage wäre nur noch, ob es relativ einfach wäre, dass man mittel Tabulatortaste, wenn man bei LP X und LP Y hin und her schaltet, der Text automatisch seletierkt ist und man sofort einen komplett neuen Wert einschreiben kann? Ich suche zur Zeit mich dumm und dusselig.

    Montag, 19. August 2019 07:30
  • Hi,

    bspw. so:

    this.textBox1.GotFocus += new System.EventHandler(this.textBox_GotFocus);
    this.textBox2.GotFocus += new System.EventHandler(this.textBox_GotFocus);
    ...
    
    
    private void textBox_GotFocus( object sender, EventArgs e )
    {
       ((TextBox)sender).SelectAll();
    }

    Zukünfigt bitte aber noch beachten: neue Fragen bitte immer in einem neuen Thread stellen und beantwortete Fragen durch "Als Antwort markieren" und ggfs. "Abstimmen" abschließen. Das erhöht die Übersichtlichkeit im Forum enorm. Vielen Dank.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort markiert Isosek Montag, 19. August 2019 09:25
    Montag, 19. August 2019 08:20
    Moderator