Autor Beitrag
Cyron
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: So 30.07.06 00:11 
Hallo, ich bin neu hier, lerne erst seit drei Monaten C# und hab auch gleich ein Problem.
Um meine Windows Form sauber zu halten, möchte ich nur den Konstruktor und die Eventhandler darin behalten. Alle Methoden und Variablen, die z.B. Eingaben verarbeiten und verwalten, sollen in einer anderen Klasse stehen. Natürlich müssen die Ergebnisse ja wieder in die Form zurück (oder?), damit sie dort ausgegeben werden können.
Mit gegenseitigen Klasseninstanzen bekomme ich eine infinite loop exception, was ja auch logisch ist. Nun hat man mir bei MyCsharp.de empfohlen, das Ganze über events zu lösen. Das hat auch funktioniert, aber in einigen Fällen erscheint mir das zu komplex. Ein Beispiel: Ich habe in einer Form eine Checkbox. Eine bool-Variable (in einer anderen Klasse) wird über den Eventhandler gesetzt und gibt ihren Status an die Form zurück, also eine ganz triviale Sache. Für diese Variablenabfrage ein Eventhandling zu definieren, halte ich für überzogen. Jetzt hab ich das Problem über eine Zwischenklasse, ich nenne sie mal Mediator, gelöst. Diese beinhaltet Variablen und Properties als Zwischenspeicher. Die Form-Klasse schreibt Werte dort hinein, wo sie von der Arbeitsklasse abgeholt werden (und vice versa). Damit habe ich die n:m Beziehung in zwei 1:n Beziehungen aufgelöst. Das funktioniert aber nur solange der Mediator statisch ist. Anderenfalls verlieren die Variablen ihren Inhalt (vielleicht bin ich ja auch nur zu blöd dafür). Tja, da ist nun mein Problem. Ich möchte die Mediatorklasse über ein Interface ansprechen. Das lässt aber keine statischen Klassen zu. Bei MyCsharp.de hat man mir geraten, mich mit dem MVP auseinander zu setzen. Leider hab ich trotz langer Suche kein einfaches Beispiel dafür gefunden. Die Abhandlung über Design Pattern bei MSDN war mir noch irgendwie zu kompliziert.
Gibt es eine einfache Lösung für mein Problem?
Kennt jemand ein gut verständliches Tutorial über das MVP pattern?
Waldteufel
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 30.07.06 12:30 
Hi Cyron.

Deine Lösung scheint mir etwas sehr kompliziert. Würde vorschlagen, du instanziierst im Hauptformular die Hilfsklasse (direkt, nix Mediator), rufst deren Methoden auf und verwendest die Rückgabewerte weiter.

Gruß,
Waldteufel

PS: Das war jetzt die "einfache Lösung" für dein Problem. Zu MVP finde ich leider nur den Hinweis auf Wikipedia, das es dem Model-View-Control-Pattern ähnelt. Probier das doch vielleicht mal aus: de.wikipedia.org/wiki/MVC (zu Patterns kann ich das Buch "Head First Design Patterns" empfehlen. ISBN: 0-596-00712-4)
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: So 30.07.06 13:53 
Hallo Waldteufel,
danke für deine Antwort. Mein Beispiel war vielleicht nicht so glücklich gewählt. Das handling eines CheckBoxFlag-Properties kann man sicher auch ohne Zwischenklasse bewerkstelligen. Es gibt aber auch Fälle bei denen ich eine Instanz der Formklasse in der Arbeitsklasse deklarieren müsste, und dann kommt es zu der besagten Exception.
Vielen Dank auch für deine Buchempfehlung. Ich habe gerade die Rezensionen durchgelesen und bin sehr neugierig geworden. Ich werde es demnächst kaufen.

_________________
Gruß,
Cyron
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: So 30.07.06 13:54 
user profile iconCyron hat folgendes geschrieben:
Hallo Waldteufel,
danke für deine Antwort. Mein Beispiel war vielleicht nicht so glücklich gewählt. Das handling eines CheckBoxFlag-Properties kann man sicher auch ohne Zwischenklasse bewerkstelligen. Es gibt aber auch Fälle bei denen ich eine Instanz der Formklasse in der Arbeitsklasse deklarieren müsste, und dann kommt es zu der besagten Exception.
Das MVC Pattern werde ich mir zu Gemüte führen.
Vielen Dank auch für deine Buchempfehlung. Ich habe gerade die Rezensionen durchgelesen und bin sehr neugierig geworden. Ich werde es demnächst kaufen.
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: So 30.07.06 13:56 
Hups entschuldigung, falscher Button. :oops:
Waldteufel
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 30.07.06 15:48 
Hi Cyron.

user profile iconCyron hat folgendes geschrieben:
Es gibt aber auch Fälle bei denen ich eine Instanz der Formklasse in der Arbeitsklasse deklarieren müsste, und dann kommt es zu der besagten Exception.

In dem Moment, in dem du "eine Instanz der Formklasse in der Arbeitsklasse deklarieren müsste[st]" hast du es mit dem Entkoppeln etwas zu doll getrieben. ;-)
Dann solltest du deine Änderungen wieder ein bischen undo-en, bis du wieder so viel Code im Formular hast, dass die andere Klasse keinen Zugriff mehr auf's Formular braucht.

Gruß,
Waldteufel
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: So 30.07.06 16:39 
Hallo Waldteufel,
das ist ein gutes Argument.
Danke :)
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: Mi 02.08.06 22:09 
Jetzt stehe ich genau vor dem Problem, welches ich oben geschildert habe.
Folgendes: Ich arbeite zur Zeit an einer Übungsaufgabe aus einem meiner Bücher. Es soll eine Kesseldruckregelung simuliert werden. Um das ganze etwas aufzupeppen, möchte ich den Kesseldruck über einen ProgressBar darstellen. Natürlich habe ich die Simulation in einer eigenen Klasse gecodet. Wie übergebe ich nun den aktuellen Kesseldruck aus der Simulatorklasse an den ProgressBar in Form1, ohne wieder über diese infinite loop exception zu stolpern?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 02.08.06 22:27 
Hallo!

Ich würde über eine Callback-Funktion arbeiten, welche Du bneim Aufruf der Berechnung übergibst und die von Berechnung aus aufgerufen werden soll, wenn die Progressbar aktualisiert werden soll. Schau Dir dazu mal die Verwendung von Delegates an, ansonsten frag einfach nochmal :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: Do 03.08.06 15:57 
"Callback-Funktion" höre ich zum ersten mal. Ich werde mich schlau machen. Danke erstmal. :)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 03.08.06 16:10 
Mal ein kleines Beispiel in Form einer Konsolenanwendung, welche die Fakultät einer Zahl berechnet.

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:
namespace ConsoleApplication2
{
    class Program
    {
        static void PrintStatus(int total, int current)
        {
            Console.WriteLine(total.ToString() + " :: " + current.ToString());
        }

        static void Main(string[] args)
        {
            Calculator.Faculty(10, PrintStatus);
            Console.ReadLine();
        }
    }

    delegate void StatusCallback(int total, int current);

    class Calculator
    {
        public static int Faculty(int n, StatusCallback status)
        {
            int result = 1;

            for (int i = 1; i <= n; i++)
            {
                result *= i;
                status(n, i);
            }

            return result;
        }

    }
}


Im Prinzip wird beim Aufruf der Fakultätsfunktion eine Methode als Parameter mitgegeben, welche in jedem Schleifendurchlauf aufgerufen wird. Und ob die nun was auf die Konsole ausgibt oder einen progressBar ändert, ist ja wurscht. :zwinker:

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Cyron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP home SP2
C# (VS 2005 professional am DLR, VS2005 Academic Edition zu Hause)
BeitragVerfasst: Do 03.08.06 18:09 
Wow danke! :D
Alles klar; und wieder was gelernt. :zustimm: