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).
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
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.
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? 😃
...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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo UltraEdit,
evtl. hilft dir mein Artikel Kommunikation von 2 Forms da weiter (s. unter "Ereignisse").
[...]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.
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:
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 😃
Wieso gibst Du den neuen Wert nicht via Eventargs mit?
Dafür sind sie gedacht...
Da sind noch einige Grundlagen unerleuchtet 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code