Autor Beitrag
tigerfox
Hält's aus hier
Beiträge: 5

Win XP, Mac OSX
VS 2008 Express
BeitragVerfasst: Do 27.10.11 17:19 
hallo,

ich hab folgendes problem:

eine form-klasse enthält einen button. innerhalb meiner form-klasse wird von visualstudio eine method erzeugt, die beim drücken des buttons per event aufgerufen wird. dieser button soll nun auf die instanz irgendeiner klasse zugreifen. das geht nun aber nicht, weil diese klasse der form-klasse nicht bekannt ist.

ich hab das bis jetzt so gelöst, dass ich sämtliche logik in die form-klasse verlagert habe und das objekt auf welches ich mit meinen controls zugreifen will quasi in derselben form-klasse anlege, in welcher sich die entsprechenden controls befinden.

diese lösung kommt mir aber extrem unsauber vor. geht das nicht auch anders?

schöne grüße aus wien,

heinz.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4809
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 27.10.11 18:26 
Hallo tigerfox,

wie du richtig erkannt hast, sollte die Logik von der GUI getrennt werden, d.h. beides sollte in eigene Klassen ausgelagert werden. Um jetzt ein Logik-Objekt von der GUI-Klasse (Form) aus aufzurufen, muß dieses dann natürlich in der Form erzeugt werden.
Um das Logik-Objekt methodenübergreifend benutzen zu können, legst du ein Member davon in der Form-Klasse an (also außerhalb aller Methoden):
ausblenden C#-Quelltext
1:
private Logic logic = new Logic();					

Nun kannst du in jeder Form-Methode (d.h. auch z.B. im ButtonClick-Ereignis) auf dieses Logik-Objekt zugreifen:
ausblenden C#-Quelltext
1:
logic.CalculateSomething();					


Wenn du mehr Informationen über die Kommunikation zwischen 2 Klassen bzw. Forms haben möchtest (Stichworte: Eigenschaften und Ereignisse), dann kann ich dir meinen Artikel Kommunikation von 2 Forms empfehlen.
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 28.10.11 10:26 
Hallo Th69

Zu diesem Thema habe ich auch noch eine grundsätzliche Verständnisfrage.
Folgende Codestruktur habe ich in meinen Programmen angetroffen (als Beispiel):

ausblenden 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:
namespace Test
{
    public class Logikclass
    {
        public static String Logikmethode(String s)
        {
            return s;
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = Logikclass.Logikmethode("Hallo");
            }
    }
}

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = "Hallo";
            }
    }
}



Würdest Du diese beiden Codestrukturen als korrekt einstufen, in Bezug auf die Trennung von GUI zu Logik?
Vielleicht habe ich da etwas einfach falsch (oder gar nicht) verstanden und es spielt gar keine Rolle.

_________________
Gruss
mats74
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 28.10.11 12:36 
... der Grund wesshalb ich nachgefragt habe ist der, dass sich noch einige Programmteile in unseren Programmen im "Rohzustand" befinden und ich diese optimieren und logisch aufbauen muss.
Dabei ist mir nicht immer klar, welche Logikteile ich wohin setzen sollte, damit es den Programmierrichtlinien entspricht.
Aber deine Doku sagt ja eigentlich schon vieles.
Also danke Dir.

_________________
Gruss
mats74
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 28.10.11 12:48 
Hallo user profile iconmats74,

Die Logikklasse sollte in eine eigene Datei ausgelagert werden. Außerdem ist der Großteil der Logik nicht in einer Klasse namens Logik oder so ähnlich, sondern in den zahlreichen anderen Klassen, die im Logikteil benötigt werden. Eine zentrale Steuerungsklasse habe ich aber z.B. in einigen meiner Projekte auch.

Um deine Frage beantworten zu können, müsste man außerdem wissen, was die Methode Logikmethode macht. Denn zu viel auszulagern ist auch wieder ungeschickt, denn dann ist vielleicht GUI-Teil in den Logik-Klassen. Die Logikklassen sollten z.B. eigentlich keine übersetzten Texte enthalten. Den Status liest du von dort als Enum aus und übersetzt ihn dann im GUI-Teil in einen entsprechenden String.

Aber fang einfach mal an und wenn du dir nicht sicher bist, kannst du ja speziell noch mal fragen.

Grüße,
Yogu

Für diesen Beitrag haben gedankt: mats74
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 28.10.11 13:40 
Hallo Yogu

Danke Dir für deine Rückmeldung.
Da hab ich schon mal einen Anhaltspunkt, dass ich nicht ganz auf dem Holzweg bin.

Im Beispiel "Logikmethode" befinden sich bei mir vorwiegend Kalkulationsschemas, Parser und ähnliche Gebilde, die die mathematischen Prozesse ausführen.
Diese Methoden stehen aber nicht immer in separaten Dateien (oder Klassen).
Da müsste ich wahrscheinlich konsequenter auslagern und die kleinen Gehilfen in eine andere Datei einbinden.
Ich werde deinen Tip mit den separaten Dateien also zu Herzen nehmen :wink: .

_________________
Gruss
mats74
tigerfox Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, Mac OSX
VS 2008 Express
BeitragVerfasst: Sa 29.10.11 15:54 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo tigerfox,
Wenn du mehr Informationen über die Kommunikation zwischen 2 Klassen bzw. Forms haben möchtest (Stichworte: Eigenschaften und Ereignisse), dann kann ich dir meinen Artikel Kommunikation von 2 Forms empfehlen.


vielen dank soweit, das war ziemlich exakt das was ich wissen wollte!

liebe grüße,

heinz.