Autor Beitrag
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Mo 14.03.11 14:05 
Was genau meinst du mit schlecht?den letzen Beitrag von mir?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 14.03.11 16:35 
user profile iconmkRE hat folgendes geschrieben Zum zitierten Posting springen:
Klasse Datenaustausch kennt dann quasi Window1 und Window4 und verwaltet diese Daten.
Das meine ich. Wenn die wirklich nur in die eine Richtung Window1 und Window4 kennt, ist das gut, aber ich vermutete eher, dass auch eines der Fenster wiederum die Datenklasse kennen sollte. Und das wäre nicht so gut.
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Di 15.03.11 09:04 
Achso verstehe aber in meinem Fall soll nur die Klasse Datenaustausch als einzigez die beiden Windows kennen.Die Windows selber kennen die Klasse nicht.

Aber was mich interessiert ist warum das andersrum so verkehrt wehre?Was kann passieren?Ich kann mir da kein probleme ausmalen?

Und warum ist das auch nicht so die beste Lösung: da ein ungeordnetes Form (SubForm) niemals direkten Zugriff auf übergeordnete Forms (hier MainForm) tätigen sollte! " ??
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: Di 15.03.11 19:34 
Hi,

Stichwörter: Kapselung und Wiederverwendbarkeit

Ein untergeordnetes SubForm sollte niemals auf die Hauptform direkt zugreifen, da du damit die SubForm fest mit der Hauptform "verdrahtest". Du könntest jetzt also nicht einfach diese SubForm ohne die Hauptform verwenden (sei es bei dem Aufruf von einer anderen Form aus oder sogar in einem ganz anderen Projekt).

Komponenten (d,h, Controls, UserControls und (Sub-)Forms) sollten immer so programmiert sein, daß man sie relativ einfach austauschen kann (d.h. möglichst ohne Abhängigkeiten).

Genau aus diesem Grund gibt es Events, so daß nur die aufrufende Klasse die untergeordnete kennt. Die untergeordnete Klasse (bzw. Form) "wirft" einfach nur ein Ereignis (Event) und weiß nicht, ob und wer überhaupt dieses Ereignis behandelt.

Versuche bei einem Projekt immer hierarchisch zu denken, so daß du wie in einem Baukastensystem die einzelnen Teile zusammensetzt. Dadurch können einzelnen Teile evtl. ausgetauscht werden, ohne Änderungen am Gesamtsystem vornehmen zu müssen.
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: So 27.03.11 22:29 
Hallo da bin ich nochmal.Ich habe mich soweit es ging mit Events auseinander gesetzt.habe es auch hinbekommen nach dem Beispiel aus dem Thread mit meinem window4 ( SubForm ) daten zu meinem Hauptfenter window4 (MainForm) zu schicken der austausch funktioniert wundervoll.

Aber jetzt wollte ich den Spieß umdrehen und meine Daten von der MainForm an meine SubForm zu schicken und da passiert absolut gar nichts.

Der Teil mit dem ich gearbeitet habe ist:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
class SubForm : Form   //Window4 
{
// ...
public class TextEventArgs : EventArgs
{
public TextEventArgs(string text)
{
Text = text; // Eigenschaft setzen
}
public string Text { get; set; } // Text als Eigenschaft definieren
}
public event EventHandler<TextEventArgs> UpdateText; // Ereignis deklarieren
void button_Click(object sender, EventArgs e)
{
// ...
OnUpdateText(new TextEventArgs("Test")); // Ereignis-Methode aufrufen
}
protected virtual void OnUpdateText(TextEventArgs e)
{
EventHandler<TextEventArgs> ev = UpdateText;
if (ev != null)
ev(this, e); // abonnierte Ereignismethode(n) aufrufen
}



class MainForm : Form   //Window1 Hauptfenster
{
void button_Click(object sender, EventArgs e)
{
SubForm subForm = new SubForm();
subForm.UpdateText += UpdateLabelText; // Ereignis abonnieren
subForm.ShowDialog(this);
}
void UpdateLabelText(object sender, SubForm.TextEventArgs e)
{
labelText.Text = e.Text; // Zugriff auf Eigenschaft des Ereignisses
}
}



Ich habe von dem oben beschriebenen Beispiel einfach mal den Spieß umgedreht und da hat meine Subform keine daten erhalten.

Ich finde einfach keine Möglichkeit von meinem Hauptfenster aus Daten mittels Event an mein SubForm verschicken zu können.

ich verzweifle!!

Moderiert von user profile iconKha: C#-Tags hinzugefügt
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Mi 30.03.11 07:57 
Hat niemand eine Idee?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 30.03.11 08:17 
Du hast den Setter von Text ja leer gelassen. ;-)

Ich kann es gerade nicht testen, aber ich glaube es sieht so aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
public string Text { get; 
set { 
  DoSomething; 
}; }
So oder so ähnlich. Dann wird der Code im Setter bei Zuweisung der property ausgeführt.
mkRE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 31.03.11 08:22 
Hi ich werd das mal ausprobieren.Danke