Autor Beitrag
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Do 04.03.10 21:54 
Hallo zusammen,
ich schreibe jetzt schon eine ganze Weile C#-Programme. Dies sind bisher immer Bibliotheken, Dienste etc.. gewesen und große GUI-Kenntnisse sind nie benötigt gewesen.

Nun bin ich über eine ziemlich banale Frage gestolpert:
Wie strukturiert man am besten ein Programm mit grafischer Oberfläche
Bei Delphi und anderen Programmiersprachen habe ich es eigentlich immer so gehandhabt:
GUIStruct
Ein Beispiel:
Die in dem GUI wird die Aktion Click ausgelöst. Nun werden die passenden Funktionen im GUIBackend aufgerufen.
Das GUIBackend schaut z.B. welches Element in einem listview selektiert wurde, ordnet dies einem bestimmten Element in einem Array zu, welcher alle zusätzlichen Informationen enthält, dass das Programm benötigt (Dateiname, Größe etc.)
und Ruft tiefere Funktionen im Backend auf.

Die Funktionen für das GUIBackend habe ich immer in eine eigene Klasse gepackt.
Bei C# kann man jedoch ohne Invoke nicht auf die Elemente eines Forms zugreifen.
Ich suche nun nach einer Möglichkeit möglichst ohne Invoke (wegen mono) eine saubere Schnittstelle zwischen GUI und Backend zu erstellen.
Oder ist es in C# gar so gedacht dass man alle GUI-Relevanten Funktionen direkt in die Ereignisse setzt?
Mir kommt das immer irgendwie unsauber vor...
Wie baut ihr eure Programme auf?
Einloggen, um Attachments anzusehen!
_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 04.03.10 22:11 
Zitat:
Bei C# kann man jedoch ohne Invoke nicht auf die Elemente eines Forms zugreifen.

Das wäre nur nötig wenn du einen Crossthread Zugriff machst. Und unsynchronisierter Crossthread Zugriff sollte auch in Delphi ganz schlechter Stil sein auch wenn es Delphi nicht explizit unterbindet(oder doch?).

Aus Neugier wo ist das Problem mit Mono? Dort werden die Winforms Controls doch wohl auch ISynchronizeInvoke implementieren?

Moderiert von user profile iconChristian S.: C#- durch Quote-Tags ersetzt
patrick Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Do 04.03.10 22:31 
(verdammt mein text hat sich gerade in luft aufgelöst. hier die kurzform)
ich habe mich etwas unglücklich ausgerückt:

fremde klassen haben auf controls innerhalb des forms ja keinen zugriff (private). zugriff von außerhalb bekommt man nur per invoke (was man ja nicht tun sollte wenn es nicht unbedingt nötig ist).
ich habe irgendwo gelesen das mono-programme kein invoke enthalten dürfen.
und da ich vielleicht irgendwann, irgendein programm nach mono migrieren möchte will ich mir diesen weg durch sowas nicht verbauen.

möglicherweise habe ich auch einfach was falsch assoziiert /verstanden.

wie baust du solche programme auf?
alle gui relevaten aktionen direkt in ereignis implementieren oder erstellst du zusätzliche funktionen innerhalb der form-klasse ( was mir momentan als der "richtigste" weg vorkommt).

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
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 04.03.10 22:43 
user profile iconpatrick hat folgendes geschrieben Zum zitierten Posting springen:
ich habe irgendwo gelesen das mono-programme kein invoke enthalten dürfen.

Ich bin mir sicher, Du meinst PInvoke, also das einbinden von Betriebssystem-Funktionen wie der Windows-API. Das hat mit der normalen Invoke-Methode nichts zu tun.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 04.03.10 23:16 
Zitat:
fremde klassen haben auf controls innerhalb des forms ja keinen zugriff (private).


Das kommt drauf an wie man die definiert(Stichwort Modifiers Property an der Form). Aber Standard ist private und das ist auch gut so. Direkt soll man da wirklich nicht dran aber mann kann der Form ja wiederum eine saubere Schnittstelle gegeben mit Methoden/Properties/Events von dennen aus man auf die eigenen Controls zugreift. Das Problem sollte sich aber eher seltener Stellen klassischerweise Sitz der Auslöser einer Aktion in der Form (oder noch genauer vor der Form z.b du). Man wird also wenn man richtigherum gedacht hat von der Form aus auf Schichten dahinter zugreifen um sich etwas zu holen (Funktionen/Daten us.w.). Der Fall das man etwas aus einer anderen Klasse in eine Form hineinschiebt sollte der seltenere Fall sein(jaja ich weiß es gibt auch andere Anwendungen).

Zitat:
wie baust du solche programme auf?
alle gui relevaten aktionen direkt in ereignis implementieren oder erstellst du zusätzliche funktionen innerhalb der form-klasse ( was mir momentan als der "richtigste" weg vorkommt).


Üblicherweise bediene ich mich eines Patterns aus der MV... Umgebung (MVC, MVP, MVVM) oder benutze zumindest etwas das dem nahe kommt. Die ~zusätzlichen Funktionen~ würden also hauptsächlich in einer weiteren Klasse(n) stecken und nicht direkt auf der Form.