Laden...

Aktionen in Form2 soll Daten in Form1 aktualisieren.

Erstellt von UltraEdit vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.489 Views
U
UltraEdit Themenstarter:in
57 Beiträge seit 2013
vor 8 Jahren
Aktionen in Form2 soll Daten in Form1 aktualisieren.

Hallo Zusammen,
ich bastele gerade an einem Spiel und habe ein Verständnisproblem.

Es gibt eine Klasse „Mensch“ (Arbeitszeit, Geld, Hunger, usw.).
Die Daten der Klasse werden auf Form1 dargestellt(z.B. Label_Geld.Text).

Auf Form1 ist ein Button „Arbeiten“.
Dieser öffnet Form2 und dort produziere ich Arbeitszeit (z.B. Holz hacken per ButtonClick).

  • Mensch.AddArbeitsZeit(int Sekunden)
    fügt Arbeitszeit hinzu, bucht pro 3600 Sekunden 10 Geld um und setzt entsprechend die Arbeitszeit runter(das klappt soweit auch alles).

Nun möchte ich, dass auf Form1 der „Geldbetrag“ auch AKTUALISIERT wird(während ich in Form2 den Button klicke).

Das heißt: Der ButtonClick auf Form2 soll auch auf From1 den GeldBetrag aktualisieren.

Habe die Std. Threads gelesen…
Kommunikation zwischen 2 Forms und so weiter helfen mir da aber nicht weiter, oder?

Bitte um Schubs in die richtige Richtung…

Vielen Dank im Voraus
UltraEdit

T
314 Beiträge seit 2013
vor 8 Jahren

Deine Klasse kann z.B. ein Event haben "GeldGeaendert", welches Du entsprechend auslöst. Dieses abonnierst Du in Form1 und aktualisiert entsprechend dort deine Anzeige.

B
88 Beiträge seit 2016
vor 8 Jahren

Klingt ja interessant.
Ich bastel gerade noch an einem kleinem Spiel, aber vielleicht wäre das danach auch ein interessantes neues Projekt für mich 😉
Erzähl mal mehr über das Spiel hast du schon ein grobes Konzept, dass ich klau.. ääh von dem ich mich inspirieren lassen kann?

Meinst du diesen Thread?
[FAQ] Kommunikation von 2 Forms

Warum denkst du hilft er dir nicht weiter?
Da geht es m.E. genau um das Problem: ein Label in der Hauptform von einer zweiten Form aus zu ändern.

Da wird der Weg von t0ms3n und noch ein anderer beschrieben, klingt jetzt für mich erstmal genau nach dem was du machen willst, oder? 😃

U
UltraEdit Themenstarter:in
57 Beiträge seit 2013
vor 8 Jahren

...Dieses abonnierst Du in Form1 und aktualisiert entsprechend dort deine Anzeige.

Das Event in der Klasse hab ich, glaube ich, soweit verstanden.

Nur WER, oder WAS in FORM1 abonniert dieses Event?
Ich habe derzeit in Form1 eine private Methode


GUI_Update()
{
   lb_Geld.text = Mensch.Geld;
   lb_Alter.text = Mensch.Alter;
   ...usw.
}

diese könnte ich ja auch "schmutziger Weise" PUBLIC machen und von From2 aus aufrufen(wenn ich in Form2 den Button klicke).
Das wäre aber gegen jede Regel, da Form2 die Form1 ja gar nicht kennen sollte?!

Ich verstehe nicht was in Form1 gebaut werden muss, damit ich das feuern des Events dort mit bekomme.
Wenn das Event dann auslöst(wo und wie auch immer) brauche ich da ja nur noch per: lb_Geld.text = Mensch.Geld das Label zu aktualisieren.

@Buchstabensuppe:
Das Spiel "klau" ich gerade selber 😃
Die Idee kommt von "Punch Club" ein Box Manager/Simulator im Amiga-Style.

16.835 Beiträge seit 2008
vor 8 Jahren

In dem Link, den Dir Buchstabensuppe gegeben hat, steht eigentlich ziemlich genau drin, wie die Kommunikation zwischen zwei Forms funktioniert.

Wenn die beiden Forms vollständig voneinander unabhängig sein und sich absolut nicht kennen dürfen / sollen, dann musst Du eben einen Service erstellen, den beide Forms injiziert bekommen und darüber die Aktualisierung kommuniziert wird.

public Form1(IMyDataService service)
{
   _service = service;
}

private void IrgendeineMethode()
{

 _service.BroadcastData( <data here> )
}
public Form2(IMyDataService service)
{

 service.OnNewData += <hier auf deine Methode mappen>
}

Dann muss auch nichts publich sein.

Schmutzig ist das aber gewiss nicht, sondern sogar notwendig.
Die Forms können nicht durch Luft und Liebe Daten austauschen.

B
88 Beiträge seit 2016
vor 8 Jahren

[...]Die Idee kommt von "Punch Club" ein Box Manager/Simulator im Amiga-Style.[...]

Geil, das spiel ich auch ! Hab schon 20 Stunden auf der Uhr 😁
Die besten 10 Euro, die ich je in ein Computerspiel gesteckt habe kann ich echt empfehlen 😁 👍 👍

edit: Mit Forms "dürfen sich nicht kennen" ist glaub ich gemeint, dass man nach Möglichkeit keine Referenz auf die Form an die andere Form übergeben sollte.
Um dann in deren Controls rumzupfuschen.
Nicht, dass man nicht auf deren öffentliche Methoden zugreifen darf.
Korrigiert mich wenn das falsch ist.

U
UltraEdit Themenstarter:in
57 Beiträge seit 2013
vor 8 Jahren

Vielen Dank an alle "Antworter" bis hier 😃
Ich glaub nun hat es "klick" gemacht.
Der Link von Th69 hat sehr geholfen(nochmal vielen Dank).

Mein Problem war:

  • Ich wollte letztlich eine Klasse im Hintergrund, z.B. "Person", die ÜBERALL bekannt ist.
  • Diese sollte nun ALLE angemeldeten Forms über eine Änderung informieren(damit sie sich aktualisieren).

Die Schlüsselstelle war: subForm.UpdateText += UpdateLabelText; // Ereignis abonnieren

Hier ging e ja immer um Forms, oder Beispiele mit der Kommandozeile...
".UpdateText" kann man also auch in der PERSON-KLASSE hinterlegen und DORT die ganzen "UpdateLabelText"(VON VERSCHIEDENEN/VIELEN FORMS) ANMELDEN.

Anbei ein Stück Code wie ich das nun eingebaut habe:


class Mensch
{
	private int _Arbeitszeit_ms = 0;	
	public int Arbeitszeit_ms
	{
		get { return _Arbeitszeit_ms; }
		private set
		{
			_Arbeitszeit_ms = value;
			OnArbeitszeitChanged(EventArgs.Empty); // Ereignis-Methode aufrufen
		}
	}
  public event EventHandler ArbeitszeitChanged; // Ereignis deklarieren  
  protected virtual void OnArbeitszeitChanged(EventArgs e)
  {
  	EventHandler myEvent = ArbeitszeitChanged;
    if (myEvent != null) myEvent(this, e);
	}
}

// ---------------------------------------------------------

// Die HauptForm...
public partial class frmMain : Form
{
	public frmMain()
	{
		InitializeComponent();
		Mensch.ArbeitszeitChanged += UpdateLabelText; // Ereignis abonnieren...XXXXX 
	}
	void UpdateLabelText(object sender, EventArgs e)
  {
  	lb_Arbeitszeit.Text = Mensch.Arbeitszeit_ms.ToString();
  }
}

// ---------------------------------------------------------

// Eine (von diversen) UnterForms...
public partial class frmArbeit : Form
{
	public frmArbeit()
	{
		InitializeComponent();
		Mensch.ArbeitszeitChanged += UpdateLabelText; // Ereignis abonnieren...XXXXX
	}
	void UpdateLabelText(object sender, EventArgs e)
  {
  	lb_Arbeitszeit.Text = Mensch.Arbeitszeit_ms.ToString();
  }
}

Siehe die XXXXX markierten Zeilen:
Ich habe immer falsch rum gedacht, dass man ein Ereignis der Klasse an die Form meldet.
Aber nein, ich hänge eine Methode der Form, oder ganz viele Methoden von ganz vielen Forms, an ein Ereignis der Klasse.
"PlusGleich" halt 😃

DAS war mein Verständnisproblem...
Nochmal vielen Dank für die Hilfe 😃

16.835 Beiträge seit 2008
vor 8 Jahren

Wieso gibst Du den neuen Wert nicht via Eventargs mit?
Dafür sind sie gedacht...

Da sind noch einige Grundlagen unerleuchtet 😉