Autor Beitrag
HoPPeL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Sa 05.03.11 16:19 
Hiho,

habe ein kleines Problem, und zwar habe ich in einer separaten Klasse eine Variable, die sich gelegentlich ändert.
nun würde ich diese Varaible gerne in der mainform in ein label schreiben. Aber wie mache ich das, dass wenn sich die Varaible ändert auch mein labelinhalt ändern? Würde mich auch über einen Codeschnippsel freuen...

mfg
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 05.03.11 16:36 
Hallo,

das Stichwort dafür lautet: Ereignis (bzw. Event).

Du definierst in deiner Klasse ein Event, abonnierst dieses von deiner Form aus und änderst dann in der entsprechenden Event-Methode das Label.

Du kannst dir mal meinen Artikel Kommunikation von 2 Forms durchlesen (bzw. den relevanten Abschnitt: Ereignisse).
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Sa 05.03.11 16:41 
danke für die schnelle hilfe, werde mir das gleich mal zu gemühte führen :)
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Sa 05.03.11 23:16 
habe mir jetzt mal mit den events die zeit um die ohren geschlagen, komm aber einfach nicht aufn den trichter, wie ich das jetzt umsetzen muss... habe jetzt einfach mal in meine klasse

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 public event EventHandler MyEvent;

        protected virtual void OnMyEvent(EventArgs e)
        {
            EventHandler myEvent = MyEvent;
            if (myEvent != null)
            {
                myEvent(this, e);
            }
        }

        public void DoSomething()
        {
            // ...
            OnMyEvent(EventArgs.Empty);
            // ...
        }


und in die form

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        public Form1()
        {
            InitializeComponent();
            Operations.MyEvent += Operations_MyEvent;
            Operations.DoSomething();
        }

        public static void Operations_MyEvent(Object objSender, EventArgs e)
        {
            MessageBox.Show("myObject_MyEvent (" + objSender + ", " + e + ")");
        }


kopiert... weiß abernun nicht weiter, wie muss ich dass ganze denn nun anpassen, wenn ich den wert von z.B

ausblenden C#-Quelltext
1:
doube RangeX					


immer aktuell ins label in der Form geschrieben habe möchte, ohne dass ichirgendwas klicke?!
vllt muss ich einfach mal ne mütze schlaf nehmen und dann morgen in alle ruhe gucken, wäre aber für hilfe super dankbar

mfg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.03.11 06:24 
Du gibst den Wert in deinen EventArgs (also entsprechend von dir geschrieben) mit und hast den so immer direkt topaktuell im Eventhandler. ;-)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 06.03.11 12:14 
Hallo HoPPeL,

durch die Umsetzung des Codes nach HTML hatte ich leider vergessen, die < und > zu maskieren, daher wurden sie nicht korrekt dargestellt.
Ich habe nun den Artikel korrigiert - bitte schau dir das Beispiel nochmal an.
Entscheidend ist nun die Verwendung von EventHandler<TextEventArgs> (ansonsten hätte die Definition dieser Klasse TextEventArgs ja auch keinen Sinn gemacht).

Du bist ansonsten aber auf dem richtigen Weg und nach der Änderung müßte es dann auch bei dir funktionieren. Wenn du dann noch weitere Daten übergeben willst, dann fügst du einfach der Klasse TextEventArgs weitere Eigenschaften hinzu.

Sorry für den Fehler ;-)
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: So 06.03.11 21:48 
nochmals danke für die hilfe!
aber langsam komm ich mir dumm vor... irgendwie ist mein Kopf zu :(... habe jetzt meinen Code ein bissle angepasst:

in meiner Klasse

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
     public event EventHandler updateLabel;

        public void sendRange()
        {
            updateLabel(thisnew EventArgs());

            if (updateLabel != null)
            {
                double[] textX = SelectActorX.GetXRange();
                string Text = textX[0].ToString();
            }
        }


und in der Form dann

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 private void label1_Click(object sender, EventArgs e)
        {
            Operations.updateLabel += new EventHandler(Operations_updateLabel);
            Operations.sendRange();
        }

        void Operations_updateLabel(object sender, EventArgs e)
        {
            label1.Text = e.ToString();
        }


soweit weit klappt das natürlich, nur das wenn ich aufs label klicke da halt system.eventargs steht... was sollte da auch anderes stehen... komm irgendwie nicht darauf klar, jetzt den Wert der Varibale mit reinzupacken :/

mfg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.03.11 21:51 
Ich würde sagen du musst eine eigene EventArgs-Klasse erstellen. Schau dir einfach einmal die Mausereignisse z.b. des Formulars an. ;-)
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: So 06.03.11 23:44 
so hab jetzt mal alles 1zu1 kopiert.... wenn ich auf das label klick müsste doch theoretisch "test" erscheinen...
tuts aber nicht :(

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 public class TextEventArgs : EventArgs
    {
        public TextEventArgs(string text)
        {
            Text = text; // Eigenschaft setzen
        }

        public string Text { get; set; } // Text als Eigenschaft definieren
    }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 public class TerrainOperations
    {

public event EventHandler<TextEventArgs> UpdateText;

        protected virtual void OnMessage(TextEventArgs e)
        {
            if (UpdateText != null)
            {
                EventHandler<TextEventArgs> ev = UpdateText;
                if (ev != null)
                    ev(this, e);
            }
        }

        public void updateLabel()
        {
            double[] textX = SelectActorX.GetXRange();
            OnMessage(new TextEventArgs("test"));
        }


form:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
      private void label1_Click(object sender, EventArgs e)
        {
            Operations.UpdateText += new EventHandler<TextEventArgs>(Operations_UpdateText);
        }

        void Operations_UpdateText(object sender, TextEventArgs e)
        {
            label1.Text = e.Text;
        }
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.03.11 23:55 
user profile iconHoPPeL hat folgendes geschrieben Zum zitierten Posting springen:
wenn ich auf das label klick müsste doch theoretisch "test" erscheinen...
Warum?
Ich sehe nirgends, dass du updateLabel aufrufst, du fügst nur den Eventhandler hinzu, aber solange der nicht aufgerufen wird, passiert auch nix.
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 07.03.11 00:58 
ja stimmt, dass hatte ich vergessen... :oops:
eine abscließende Frage hätte ich jetzt noch, wie muss ich es machen, damit das Label bei jeder Änderung von "RangeX" aktualisiert wird, und ich nicht immer irgendwas klicken muss oder so ?

mfg und viele Dank für eure Geduld
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 07.03.11 01:35 
Dort, wo RandeX geändert wird, musst du das Event auslösen, sei das ein Setter oder was auch immer.
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 07.03.11 12:39 
hmmm das sind so meine beinde Problemkinder gewesen Events und set/get..
steh also schon wieder ein bisschen aufm Schlauch...

habe also in meiner Klasse " Operataions"
mehrere Methoden, die durchaus auf RangeX Einfluss nehmen könnten
ich weiß absolut nicht wo ich das in der Form hinschreiben muss, da wenn ich event in einem button aufrufe ich den ja immer klicken muss

private void button1_Click(object sender, EventArgs e)
{Operations.UpdateText += new EventHandler<TextEventArgs>(Operations_UpdateText);
Operations.updateLabel();}

was muss ich jetzt überhaupt mit set versehen? ja sicher irgendwas in der mainform?

mfg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 07.03.11 13:03 
user profile iconHoPPeL hat folgendes geschrieben Zum zitierten Posting springen:
habe also in meiner Klasse " Operataions"
mehrere Methoden, die durchaus auf RangeX Einfluss nehmen könnten
Und genau dort, wo du das änderst, musst du auch das Event auslösen. Wobei du aufpassen musst, dass du nicht dadurch wiederum etwas änderst, so dass das ganze immer hin- und hergeht.

Für diesen Beitrag haben gedankt: HoPPeL
HoPPeL Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 07.03.11 13:31 
ich glaub ich gebs auf irgenwie komm ich da einfach nicht hinter...
wie soll ich denn jetzt das event in meiner klasse aufrufen?

UpdateText +=new EventHandler<TextEventArgs>(UpdateText);
oderwie?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 07.03.11 13:43 
Hallo HoPPeL,

am besten, du liest dir mal selber die Grundlagen zu Ereignissen in einem Buch durch, z.B. im OpenBook "Visual C#": 5.2 Ereignisse eines Objekts

Du mußt einfach selber den Sinn dahinter verstehen, ansonsten bleibt es bei dir "ein Stochern im Nebel".

Und bei konkreten Fragen kannst du dich gerne hier wieder melden.