Function Informieren, wer sie aufgerufen hat

  • C#

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Pardasus.

    Function Informieren, wer sie aufgerufen hat

    Folgendes würde ich gern wissen

    C#-Quellcode

    1. ...
    2. private void EingabeFeld1_KeyPress(object sender, KeyPressEventArgs e)
    3. {
    4. AufrufenXY();
    5. }
    6. private void EingabeFeld2_KeyPress(object sender, KeyPressEventArgs e)
    7. {
    8. AufrufenXY();
    9. }
    10. ...
    11. funtion void AufrufenXY()
    12. {
    13. ...
    14. }


    Ist es möglich, dass die Funktion genau weis, wer sie aufgerufen hat?
    Klar, ich könnte den Funktionsaufruf etwas mitgeben

    C#-Quellcode

    1. ​AufrufenXY("EingabeFeld1")

    und danach in der Funktion ein IF abfrage machen, aber das geht doch bestimmt viel CoOler ;)

    Pardasus schrieb:

    ​Ist es möglich, dass die Funktion genau weis, wer sie aufgerufen hat?

    Guckst du hier: CallerMemberName

    Es ist aber unwahrscheinlich, dass du das wirklich willst. Sag doch mal genau, was du vorhast - anhand der aufrufenden Methode die Funktionsweise zu bestimmen ist ein schwerer Designfehler.
    Mfg
    Vincent

    Da hätte ich folgendes Beispiel

    C#-Quellcode

    1. private void Eingabe1_KeyPress(object sender, KeyPressEventArgs e)
    2. {
    3. if ("\\1234567890qwertzuiopüasdfghjklöäyxcvbnm-ßQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM_\b:".IndexOf(e.KeyChar) == -1)
    4. {
    5. e.Handled = true;
    6. }
    7. }


    welches in Code immer wieder vorkommt. Wenn ich dieses in eine Funktion auslager, müsste diese ja wissen, von wem die Anfrage kommt bzw. ich müsste das Eingegebene Zeichen der Funktion weiter geben und die Antwort zurück erhalten. Aber woher weist die Funktion, in welchen Eingabefeld gerade was eingegeben wurde?

    C#-Quellcode

    1. private void Eingabe1_KeyPress(object sender, KeyPressEventArgs e) {
    2. e.Handled = CheckKey(e.KeyChar);
    3. }
    4. private bool CheckKey(char keyChar) {
    5. return "\\1234567890qwertzuiopüasdfghjklöäyxcvbnm-ßQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM_\b:".IndexOf(keyChar) == -1;
    6. }


    EDIT: Der obrige Post sollte natürlich vorher beachtet werden, es ist das nächste Mal nur wichtig, dass du dir folgendes denkst: Was benötige ich für die Funktion? Was soll zurückkommen? So kommst du dann relativ einfach an die Parameter der Funktion. Selbst wenn du es geschafft hättest, das Control zu übergeben, wäre das ein Designfehler (Resharper streicht dir das an), weil eine Funktion immer nur das allernötigste wissen sollte.
    Mfg
    Vincent

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VincentTB“ ()

    Wie wäre es mit:

    C#-Quellcode

    1. AufrufenXY(sender, e.keyChar);

    "sender" enthält doch die Info, um welches Feld es sich handelt!

    Edit: Aber der Code von @VincentTB zeigt es schon richtig! Es sei denn, Du benötigt das "Ursprungs-Feld" - also den "sender" - doch noch für andere Zwecke!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Thias“ ()

    Was du suchst ist object sender. Denke ich jdf. Caste das und nutze es.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Ich glaube, jetzt hab ich es. Bitte korrigieren wenn das unschön sein sollte.

    C#-Quellcode

    1. private void Eingabe1_KeyPress(object sender, KeyPressEventArgs e)
    2. {
    3. Test(sender, e);
    4. }
    5. private void Eingabe2_KeyPress(object sender, KeyPressEventArgs e)
    6. {
    7. Test(sender, e);
    8. }
    9. private void Test(object sender, KeyPressEventArgs e)
    10. {
    11. if ("\\1234567890qwertzuiopüasdfghjklöäyxcvbnm-ßQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM_\b:".IndexOf(e.KeyChar) == -1)
    12. {
    13. e.Handled = true;
    14. }
    15. }
    Du kannst dir die beiden KeyPress Events sparen.

    C#-Quellcode

    1. Form_Load(object sender,....) {
    2. Eingabe1.KeyPress += Test;
    3. Eingabe2.KeyPress += Test;
    4. }
    5. private void Test(object sender, KeyPressEventArgs e)
    6. {
    7. if ("\\1234567890qwertzuiopüasdfghjklöäyxcvbnm-ßQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM_\b:".IndexOf(e.KeyChar) == -1)
    8. {
    9. e.Handled = true;
    10. }
    11. }
    oder

    C#-Quellcode

    1. Form_Load(object sender,....) {
    2. Eingabe1.KeyPress += Test;
    3. Eingabe2.KeyPress += Test;
    4. }
    5. private void Test(object sender, KeyPressEventArgs e)
    6. {
    7. e.Handled = "\\1234567890qwertzuiopüasdfghjklöäyxcvbnm-ßQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM_\b:".IndexOf(e.KeyChar) == -1;
    8. }
    gugge auch Boolean, Vergleiche und bedingte Verzweigungen
    Das alles bringt mich wieder ein ganze Stück weiter. Den Beitrag "Boolean, Vergleiche und bedingte Verzweigungen" fand ich auch klasse! Klingt alles sehr logisch ;)

    Aber:
    Alles läuft wunderbar, aber verstanden habe ich es zu 70%, warum es funktioniert.

    Eingabe1 <- ist ein Objekt (Klasse)
    Eingabe1.KeyPress <- ist ein ...? eine Methode?!
    private void Test(object sender, KeyPressEventArgs e) <- ist ein Event auf das "Gefeuert" wird, wenn eine Taste gedrückt wird.
    e.Handled <- ist ein Boolean Wert der bei "True" das Zeichen zulässt.
    Eingabe1.KeyPress += Test; <- ist ein Delegat?!

    Wenn eine Klasse ein Event "Feuert". Kann es auch eine Antwort erhalten?

    Sorry für die vielen Fragen, ich bin erst seit 1 1/2 Monate ins Programmieren seit 20 Jahren wieder eingestiegen und habe noch meine Probleme mit den ganzen, neuen Begriffen.
    KeyPress ist ein sogenanntes Event (Ereignis). Diese kann man abonnieren, indem man ihnen Methoden zuweist, die aufgerufen werden, sobald dieses Event feuert. Wenn Du nun zum Beispiel in der Küche bist und wissen willst, wann die Mikrowelle fertig ist, dann stellst Du Dich ja nicht die ganze Zeit davor, sondern wartest, bis das Piep-Geräusch ertönt. Genauso ist es hier auch: Sobald ein Ereignis eintritt, werden die Objekte, die es abonniert haben, benachrichtigt, indem die angegebene Handler-Methode aufgerufen wird. Das Abonnieren erfolgt mit dem +=-Operator.

    Pardasus schrieb:

    private void Test(object sender, KeyPressEventArgs e)
    ist folglich kein Event, sondern diese Handler-Methode, welche noch ein paar Parameter enthält. (Das Objekt, das sie aufgerufen hat und ein paar Daten zum gedrückten Key)

    Pardasus schrieb:

    Wenn eine Klasse ein Event "Feuert". Kann es auch eine Antwort erhalten?
    Theoretisch könnte man das implementieren. Das ist aber generell nicht die Aufgabe von Events, da diese nur für die Benachrichtigungen da sind. Was das Objekt dann mit der Benachrichtigung macht, ist seine Sache und in der Regel muss auch nicht geantwortet werden, dass das Event empfangen wurde o. ä., denn die Kommunikation funktioniert mit jedem Objekt und dieses muss nicht bekannt sein.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    @Pardasus Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Test()
    3. End Sub
    4. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    5. Test()
    6. End Sub
    7. Private Sub Test()
    8. Dim stack = New StackTrace().ToString()
    9. Dim parts() = stack.Split(New Char() {CChar(vbCr), CChar(vbLf)}, StringSplitOptions.RemoveEmptyEntries)
    10. MessageBox.Show(parts(1))
    11. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Finde es beachtenswert, dass Du da dann gleich mit C# wieder einsteigst, es sei denn Du hast vorher mal C programmiert.

    Persönlich finde ich, dass bei VB.Net ja manchmal eher zu sehen ist, was etwas ist - aber dies ist sicherlich Geschmackssache:

    Private Sub Form_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    AddHandler Eingabe1.KeyPress, AddressOf Test
    AddHandler Eingabe2.KeyPress, AddressOf Test
    End Sub

    Private Sub Test(sender As Object, e As KeyPressEventArgs)
    e.Handled = "\1234567890qwertzuiopüasdfghjklöäyxcvbnm-ßQWERTZUIOPÜASDFGHJKLÖÄYXCVBNM_" & vbBack & ":".IndexOf(e.KeyChar) = -1
    End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thias“ ()

    Vielen Dank euch allen! Das hat mir sehr weiter geholfen :)

    Allein das Eingabe2.KeyPress += Test; hat mich in vielen Dingen weiter gebracht. Gerade was das Verständnis solcher Befehle angeht.

    @Thias
    C++ habe ich mal für 3 Tage reingeschaut, aber mich dann doch für C# entschieden. Gerade in VisualStudio ist es für ein Anfänger sehr leicht gemacht, noch beim eingeben Fehler zu sehen.
    Auf meinen AtariST 512 gab es damals GFA-Basic. Damit konnte ich alles Programmieren was ich wollte. Aber seit dem hat sich verdammt viel geändert, aber wenn das Grundverständnis da ist, geht das lernen recht schnell.