Ich habe Probleme die Variable zu übergeben ...



  • [Hi leute,

    ich sitze gerade an einem Taschenrechner und wollte als aller erstes nur die addition einrichten daher ist die calculate funktion sehr spezifisch, das wollte ich später ändern. Das problem ist das ich entweder die variable "eb" per parameterlist übergebe und er mir dann den fehler

    Fehler 1 Keine Überladung für "Calculate" stimmt mit dem Delegaten "System.EventHandler" überein. C:\Coding\Projects\TaschenRechner\TaschenRechner\Form1.Designer.cs 304 36 TaschenRechner

    (hier der Code:)

    public void Calculate(object sender, EventArgs e, ref int eb)
                {
                    object test;
                    test = textBox1.Text;
                    int bc = Convert.ToInt32(test);                              
                    int result = bc + eb;
                    object kk = result;
                    kk = Convert.ToString(kk);
                    textBox1.Text = (string) kk;
    
                }
    
                public void addition(object sender, EventArgs e)
                {
                    object test;
                    test = textBox1.Text;
                    int eb = Convert.ToInt32(test);
                    textBox1.Text = "";
    
                }
    

    ODER

    das er mir sagt die Variable ist im aktuellen kontext nicht enthalten wenn ich eb nicht mit der parameterliste weitergebe was eigl auch logisch ist



  • Also zum ersten, dein Code ist extrem unsauber.Wenn du weißt du erhälst einen string aus der Text Eigenschaft der Textbox, dann schmeiß es doch direkt in einen string.
    Als zweites zeig uns doch mal den Code wo du Calculate aufrufst?



  • es ist ein Event, mom

    this.button16.Click += new System.EventHandler(this.addition);
    

    das ist der teil der als fehler unterstrichen wird bei der fehler meldung

    mh, was meinst du genau mit wo calculate aufgerufen wird? Es wird bei einem Click auf nen "=" button aufgerufen der einzige code den ich dazu habe steht im vorherigen teil

    sorry für die unübersichtlichkeit und fehlende informationen, bin immernoch ein blutiger anfänger



  • Würde ich so gar nich machen.Mach mal ein Doppelklick auf dein "=" Button dann wird dir ein OnClick Eventhandler erzeugt. Darin implementierst du deine Additionslogik, was auch immer.



  • so hab ich es doch gemacht, nur das die logik nicht hinhaut 😉

    ich schreibe jetzt einfach mal den ganzen "Form.cs" code hier rein (in die program.cs hab ich ja eh nix geschrieben bisher)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
                private void Digit1(object sender, EventArgs e)
                {
                    textBox1.Text += "1";
    
                }
    
                private void Digit2(object sender, EventArgs e)
                {
                    textBox1.Text += "2";
                }
    
                private void Digit3(object sender, EventArgs e)
                {
                    textBox1.Text += "3";
                }
    
                private void Digit4(object sender, EventArgs e)
                {
                    textBox1.Text += "4";
                }
    
                private void Digit5(object sender, EventArgs e)
                {
                    textBox1.Text += "5";
                }
    
                private void Digit6(object sender, EventArgs e)
                {
                    textBox1.Text += "6";
                }
    
                private void Digit7(object sender, EventArgs e)
                {
                    textBox1.Text += "7";
    
                }
    
                private void Digit8(object sender, EventArgs e)
                {
                    textBox1.Text += "8";
                }
    
                private void Digit9(object sender, EventArgs e)
                {
                    textBox1.Text += "9";
                }
    
                private void Digit0(object sender, EventArgs e)
                {
                    textBox1.Text += "0";
                }
    
                public void Calculate(object sender, EventArgs e, ref int eb)
                {
                    object test;
                    test = textBox1.Text;
                    int bc = Convert.ToInt32(test);                              
                    int result = bc + eb;
                    object kk = result;
                    kk = Convert.ToString(kk);
                    textBox1.Text = (string) kk;
    
                }
    
                public void addition(object sender, EventArgs e)
                {
                    object test;
                    test = textBox1.Text;
                    eb = Convert.ToInt32(test);
                    textBox1.Text = "";
    
                }
          }
    }
    

    den OnClick eventhandler hab cih genauso erzeugt wie auch von dir beschrieben



  • Hehe ist ja auch ganz klar das das nicht funktioniert.
    Der EventHandler vom Click Event erwartet eine Methode mit folgender Signatur

    private void Click(object Sender,EventArgs e)
    

    Deine Methode jedoch weißt eine solche Signatur nicht auf, deshalb gibts den Fehler. Nimm das

    ref int eb
    

    Raus und du bekommst den Fehler nicht mehr.



  • naja das mache ich aber DANN habe ich das problem das er mir sagt "Variable eb nicht im aktuellen kontext vorhanden" daher hatte ich die idee mit dem ref int eb ... aber es funktioniert ja nicht^^ Also wie kann ich die Variable in der anderen Funktion verwenden ???



  • In dem du dir eine Methode baust, die deine Parameter entgegen nimmst, und diese dann einfach mit den richtigen Werten aufrufst.
    Und das Ergebnis lässt du dir einfach zurückgeben.



  • so hab mich bis eben nochmal dran gesetzt... vielen dank für deine Hilfe firefighter aber kann es sein das wir etwas aneinander vorbeisprechen ? Ich habe deinen Ratschlag befolgt, raus kam :

    (ich bin mir bewusst das ich nur die Wörter als Zahlen zusammenfüge! die Datentypen möchte ich nach meinem hauptproblem konvertieren)

    public void Calculate(object sender, EventArgs e)
                {
                    string Wert1;
                    Wert1 = "";
                    Cal(Wert1);
    
                }
    
                public void addition(object sender, EventArgs e)
                {
    
                    Add();
    
                }
                public void Add()
                {
                    /*object Wert1 = textBox1.Text;
                    textBox1.Text = "";
                    Wert1 = Convert.ToInt32(Wert1);
                     */
                    string Wert1 = textBox1.Text;
                    textBox1.Text = "";
    
                }
    
                public void Cal(string Wert1)
                {
                    /*object Wert2 = textBox1.Text;
                    Wert2 = Convert.ToInt32(Wert2);
                    int result;
                    result = Wert1 + Wert2;
                     */
                    string Wert2 = textBox1.Text;
                    string result;
                    result = Wert1 + Wert2;
                    MessageBox.Show(result);
    
                }
    

    Ich "MUSS" ja Wert1 irgendwie vorher deklarieren ... aber dann funktioniert es ja nicht mehr richtig! Daher immernoch meine Frage, wie übergebe ich der funktion in diesem fall die Variable ??? die Variable wird ja erst "erzeugt" wenn ich auf "+" drücke

    Tut mir leid für das ganze generve, ist grad das erste mal das ich mich an ein GUI ran waagee und ich hab das kapitel noch nicht wirklich in meinem buch durchgearbeitet....



  • du gehst das ganze i-wie völlig falsch an ^^ in den Click Eventhandler des Buttons kommt nur der Methodenaufruf und dann am besten ne Additionsmethode einfach also

    void Addieren(int Zahl1, int Zahl2, out Ergebnis)
    {
        Ergebnis = Zahl1 + Zahl2;
    }
    

    und dann aufrufen mit

    int Ergebnis, Zahl1 = 5, Zahl2 = 2;
        Addieren(Zahl1, Zahl2, Ergebnis);
    

    vllt. unterschätz ich grad auch einfach das Problem und versteh dich nich ^^ aber so würde es am meisten Sinn machen



  • Das Problem ist doch wohl, dass Du Dir zum Zeitpunkt des '+' den ersten Summanden merken musst, weil die Textbox für den zweiten Summanden freigemacht werden muss. Das machst Du am besten in einem Feld der Klasse. Da muss nix übergeben werden, jedenfalls nicht im Bereich des Eventhandlers.



  • Ok ich habe es mehr oder weniger geschafft... Die konvertierung der Datentypen ist etwas hässlich geschrieben, dürfte aber klappen.

    Das positive meiner bisherigen Bemühen : Es gibt mir in der IDE keinen Fehler aus!

    Der negative aspekt ist das ein Fehler während der Laufzeit auftritt... übrigens kam bei mir in der IDE manchmal die Warnung das AdditionFu nicht genutzt werde... da der Warnungscode im augenblick nicht kommt (obwohl ich nichts am code geändert habe) kann ich ihn nicht genau wieder geben.

    Es ist relativ unsauber ... sorry es sollte erstmal ne art "schmierzettel" bzw "schmierprogramm" werden um überhaupt eine Funktion des Rechners auf die Reihe zu bekommen. Sorry für das anfängerliche gefrage...

    Als aller erstes die Klasse stdOperatoren

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TaschenRechner
    {
        class stdOperatoren
        {
            public int Wert1;
            public int Wert2;
    
            public int calci()
            {
                int result;
                result = Wert1 + Wert2;
                return (result);
            }
    
        }
    }
    

    Und hier die Form.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using TaschenRechner;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private stdOperatoren AdditionFu;
    
                private void Digit1(object sender, EventArgs e)
                {
                    textBox1.Text += "1";
    
                }
    
                private void Digit2(object sender, EventArgs e)
                {
                    textBox1.Text += "2";
                }
    
                private void Digit3(object sender, EventArgs e)
                {
                    textBox1.Text += "3";
                }
    
                private void Digit4(object sender, EventArgs e)
                {
                    textBox1.Text += "4";
                }
    
                private void Digit5(object sender, EventArgs e)
                {
                    textBox1.Text += "5";
                }
    
                private void Digit6(object sender, EventArgs e)
                {
                    textBox1.Text += "6";
                }
    
                private void Digit7(object sender, EventArgs e)
                {
                    textBox1.Text += "7";
    
                }
    
                private void Digit8(object sender, EventArgs e)
                {
                    textBox1.Text += "8";
                }
    
                private void Digit9(object sender, EventArgs e)
                {
                    textBox1.Text += "9";
                }
    
                private void Digit0(object sender, EventArgs e)
                {
                    textBox1.Text += "0";
                }
    
                public void Calculate(object sender, EventArgs e)
                {
                    AdditionFu = new stdOperatoren();
    
                    object zwischen;
                    zwischen = textBox1.Text;
                    AdditionFu.Wert2 = Convert.ToInt32(zwischen);
                    AdditionFu.calci();
                    int dada;
                    dada = AdditionFu.calci();
                    MessageBox.Show(dada.ToString());
                }
    
                public void addition(object sender, EventArgs e)
                {
                    object zwischen2;
                    zwischen2 = textBox1.Text;
                    textBox1.Text = "";
                    AdditionFu.Wert1 = Convert.ToInt32(zwischen2);
    
                }
    
          }
    }
    


  • also erst mal hoffe ich dass du den button addition zuerst drückst 😉 ^^ zweitens, hat calci den rückgabewert vom typ int, du kannst es also nicht einfach so aufrufen:

    AdditionFu.calci();
    

    lösch die zeile mal, drittens initialisiere doch keine variablen die du eh nur einmal benutzt ^^ mach aus

    object zwischen;
    zwischen = textBox1.Text;
    AdditionFu.Wert2 = Convert.ToInt32(zwischen);
    
    AdditionFu.Wert2 = int.Parse(textBox1.Text);
    

    #Das du noch kein Parameter benutzt is gewollt oder? weil das wäre wesentlich sinnvoller und einfacher, ausser du willst die extra noch nich benutzen



  • mh ich hab sie einfach nur nicht benutzt weil ich es nach dem motto "hauptsache es funktioniert" probiert habe, du darfst mir den teil mit den parametern gerne machen oder mir sagen was ich damit machen soll um es zu verbessern.

    edit: Den teil mit dem

    AdditionFu.Wert2 = int.Parse(textBox1.Text);
    

    raffe ich ehrlich gesagt nicht... was ist dieses int.Parse? Da ich nicht genau weiss was es ist weiss ich auch nicht wo es hin soll ... sind parse heisst ja eigl durchkämmen => durchsucht die textbox nach int werten ???

    edit2: übrigens mit deinen änderungen (int.parser teil noch nicht eingearbeitet) funktioniert das programm noch immer nicht^^. Wie gesagt der Fehler kommt erst nach dem man das programm gestartet hat...



  • int.Parse wandelt einfach nur in int um geht auch mit double... hm wenns immernoch nich klappt weiß ich es nicht vllt könntest du den genauen fehler posten



  • der fehler geschieht halt immer zur laufzeit ... du kannst den source ja mal starten und einfach 1+1 oder so rechnen ... dann wirst du sehen was ich meine, ich versuche den genauen fehlercode mal mit try und catch zu kriegen

    EDIT : ok er gibt den Fehler "Input string was not in a correct format" das kann ich wsl alleine schaffen und setze mich da auch gleic ran 🙂 Anregungen dürfen trotzdem gerne gepostet werden 🙂



  • ähm ok ... was ist daran falsch ? Ich habe es nicht lösen können 😕 allerdngs hatte ich auch nicht so viel zeit dafür...

    Könnte mir jmd erklären was daran falsch ist und es korrigieren ?



  • public void addition(object sender, EventArgs e)
            { 
                AdditionFu = new stdOperatoren();
                AdditionFu.Wert1 = int.Parse(textBox1.Text);
            }
    
            public void Calculate(object sender, EventArgs e)
            { 
                AdditionFu.Wert2 = int.Parse(textBox1.Text);
                MessageBox.Show(AdditionFu.calci().ToString());
            }
    

    also erst mal ist ein Fehler dass du additionfu erst bei calculate erstellst aber in addition schon zuweist und falls du wirklich diese Fehlermeldung mit falsches string format so bekommst ist i-was drum herum falsch (falsche eingabe etc.)



  • Ich kriege es einfach nicht hin, hier der bisher ganze code... WIESO gibt er mir den Fehler aus ? Ich verstehe es gaaaaarnicht!

    Form.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using TaschenRechner;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private stdOperatoren AdditionFu;
    
                private void Digit1(object sender, EventArgs e)
                {
                    textBox1.Text += "1";
    
                }
    
                private void Digit2(object sender, EventArgs e)
                {
                    textBox1.Text += "2";
                }
    
                private void Digit3(object sender, EventArgs e)
                {
                    textBox1.Text += "3";
                }
    
                private void Digit4(object sender, EventArgs e)
                {
                    textBox1.Text += "4";
                }
    
                private void Digit5(object sender, EventArgs e)
                {
                    textBox1.Text += "5";
                }
    
                private void Digit6(object sender, EventArgs e)
                {
                    textBox1.Text += "6";
                }
    
                private void Digit7(object sender, EventArgs e)
                {
                    textBox1.Text += "7";
    
                }
    
                private void Digit8(object sender, EventArgs e)
                {
                    textBox1.Text += "8";
                }
    
                private void Digit9(object sender, EventArgs e)
                {
                    textBox1.Text += "9";
                }
    
                private void Digit0(object sender, EventArgs e)
                {
                    textBox1.Text += "0";
                }
    
                public void Calculate(object sender, EventArgs e)
                {
                    AdditionFu = new stdOperatoren();
    
                    AdditionFu.Wert2 = int.Parse(textBox1.Text);
    
                    MessageBox.Show(AdditionFu.calci().ToString());
                }
    
                public void addition(object sender, EventArgs e)
                {
                    try
                    {
                        textBox1.Text = "";
                        AdditionFu.Wert1 = int.Parse(textBox1.Text);
    
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Fehler");
                    }
    
                }
    
          }
    }
    

    Program.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        static class Program
        {
            /// <summary>
            /// Der Haupteinstiegspunkt für die Anwendung.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
    
            }
    
        }
    }
    

    stdOperatoren.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TaschenRechner
    {
        class stdOperatoren
        {
            public int Wert1;
            public int Wert2;
    
            public int calci()
            {
                int result;
                result = Wert1 + Wert2;
                return (result);
            }
    
        }
    }
    


  • ich hab dir doch schon geschrieben dass deine klasse noch nicht besteht in addition und du schon was zuweist, was nicht möglich ist und die methoden wie sie richtig wären hab ich auch schon gepostet 😕


Anmelden zum Antworten