Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 21

Thema: Wie kann man GUI und OOP am besten vereinen?

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Wie kann man GUI und OOP am besten vereinen?

    Servus!


    Mein Problem ist, dass wenn ich ein Gui-programm schreibe, unzählige events überwachen muss. Manche events sollen z.B. was an ner anderen Instanz einer klasse ändern, das was bei mir da rauskommt, ist nicht wirklich schön. Hunderttausende Refernzen, die sich durchs ganze Programm verzweigen, nur damit ich in einer weiter "oben" definierten klasse zugriff af die bekomme, die weiter unten sind. Natürlich sollte man das vermeiden, aber man kann ein Programm einfach nicht komplett am Papier planen. Ich stehe vor einem echten Rätsel, ich möchte nicht auf dauer solche "Spagettirefernzprogramme" schreiben.
    Ich kann doch nicht jedes mal mit Referenzen auf die Mutterklasse arbeiten, dann hätte OOp ja gar keinen Sinn...
    Es besteht halt nicht jedes Programm aus "Kaffeautomat und StudentIn" wo die ganze Verarbeitung seriell abläuft..

    Kennt wer Tutorials, die sich mit OOP in Verbindung mit event-handling und guis beschäftigen. Nicht dass ihr mich falsch versteht: Ich brauche nicht die hunderttausendste Einführung in irgendein OOP-Toolkit, mitch würde vielmehr interressieren, wie man das ganze von Grund auf OOP-gerecht designen kann. Mir gehts vor allem darum wie man Logik und Gui miteinander verschmelzen soll. (Eigen klassen für Gui,Code; .....)


    Mfg
    Geändert von Lin728 (19-08-2017 um 16:32 Uhr)

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Man versucht die Events möglichst dort zu behandeln, wo sie auftreten.
    Manchmal führt das zu eine Transformation in eine Art eigenes Event.

    Beispiel:
    Ein "Tastenfeld" wie auf einem Telefon.
    Da hat man 12 Tasten (10 Zahlen, * und #), also Buttons.
    Die sind in einem Panel als Raster angeordnet.

    In der Panel Subklasse, die diese Buttons enthält, implementiert man einen ActionListener für die Buttons.

    dann kann man zB das addKeyListener überladen und so neu implementieren, dass man die KeyListener in einer Liste mitspeichert.

    Wenn nun ein Button ein ActionEvent auslöst, simuliert man an allen KeyListerner einen Tastendruck.
    Dadurch wird es für die Applikation egal, ob die Taste gedrück oder geklickt wurde.

    Eine Referenz geht also jeweils nur eine Ebene und der Aufruf erfolgt an einem Interface.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Hmm...?

    Danke...

    > Man versucht die Events möglichst dort zu behandeln, wo sie auftreten.
    > Manchmal führt das zu eine Transformation in eine Art eigenes Event

    Mein problem ist doch, dass wenn ich die Events dort behandle, wo sie auftreten, ich alle möglichen Referenzen durch die Gegend zeigen lassen muss....

    Mfg
    Geändert von Lin728 (19-08-2017 um 16:32 Uhr)

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: Hmm...?

    Original geschrieben von ceisserer

    > Man versucht die Events möglichst dort zu behandeln, wo sie auftreten.
    > Manchmal führt das zu eine Transformation in eine Art eigenes Event

    Hmm, nur was bringt mir das? Mein problem liegt doh ganz woanders, ich möchte mit dem Event-handling endlich Ordnung schaffen...
    Du fasst damit Events zusammen.
    zB wenn das Tastenfeld dann in ein Widget eingebettet ist, dass noch eine Anzeige hat und eventuell eine Entertaste, dann kann dieses Widget wiederum als Event beim Enter die ganze Zahl übergeben.


    Mein problem ist dovh, dass wenn ich die Events dort behandle, wo sie auftreten, ich alle möglichen Referenzen durch die Gegend zeigen lassen muss....
    Normalerweise geht das sauber über die Listener Interfaces.
    Ich kann mir dein Problem nicht so vorstellen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    letztendlich schreibst Du zwei Programme.
    Das erste hat mit GUIs nichts zu tun und besitzt Methoden, Klassen, ... mit denen Du Deine Arbeit erledigst.

    Das zweite Programm ist die GUI. Sie besitzt alle GUI-Elemente, wozu auch die EventListener gehören. Wird ein Listener durch ein GUI-Element "angeworfen", führt er eine Methode des anderen Programmes aus.

    Zumindest entwirfst Du sie so, dass es theoretisch zwei Programme sein könnten, aber Du hast nachher nur eine main()-Methode.
    Stell Dir vor, Du schreibst einen "Server" der die ganzen Berechnungen, etc. macht und die GUI wird der Client, mit dem man ihn bedienen kann.

    Sun nennt das Event-Delegations-Modell (gibts ab java 1.1). Observer-Pattern sind dazu eine interessante Ergänzung/Alternative.

    Schau mal hier:
    http://java.sun.com/j2se/1.4.1/docs/...ec/events.html
    I haven't lost my mind - It's somewhere on a backup-disc

  6. #6
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Klasse!

    danke Mondsuchender!

    Der Beispielcode der dabei ist, is genial, endlich hab ich eine möglichkeit gefunden, das ganze Strukturiert zu machen!
    Geändert von Lin728 (19-08-2017 um 16:32 Uhr)

  7. #7
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Nur noch kurz was...

    Nur noch ganz kurz:

    App name;
    name = anotherapp;

    Hier wird nur bei primitiven kopiert, bei objekten wird nur die Referenz von anotherapp auf name kopiert, oder?
    Geändert von Lin728 (19-08-2017 um 16:33 Uhr)

  8. #8
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Objekte werden by Reference übergeben, aber von der Schreibweise her siehts so aus, als würde man das Objekt by value übergeben (wir haben halt keine Zeiger)
    I haven't lost my mind - It's somewhere on a backup-disc

  9. #9
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Und was ist bei zuweisung?

    Servus!

    Also wenn ich das mache:

    app b;
    event(app a)
    {
    b=a;
    }
    b.setblabla("Giigle");

    verändere ich eigentlich das Object a, das übergeben wird, am I right?

    Mfg
    Geändert von Lin728 (19-08-2017 um 16:33 Uhr)

  10. #10
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Also ich kann nicht mehr ohne Signals&Slots leben und finde auch Listener umständlich

  11. #11
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Hmm, nur teuer sind die Sachen halt...

    Servus!

    Mein Problem ist halt, das C++ ohne QT doch eher rauh ist, und QT ist mir ehrlichgesagt zu teuer. O.K. wenn ich jetzt OpenSource-Sachen mit QT mache, kostet das nix, aber was ist, wenn ich mal mein Wissen in einem nicht-freien project ausutzen will, um mein Taschengeld aufzubessern?

    Wie macht das eigentlich MFC? Nicht das ich MFC lernen möchte, aber ich will wissen wie ein Freund von mir damit dran is...

    Mfg
    Geändert von Lin728 (19-08-2017 um 16:33 Uhr)

  12. #12
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    mfc hat auch noch irgendwas mit den windows - messages zu tun (die sind (imho) recht verkrüppelt)
    aber von M$ gesehen ist die MFC ja eh ein Auslaufmodell...

    QT kostet übrigens "nur" zwischen 1500 und 3100 $ (1 - 3 Plattformen)...
    Aber bist du das mit einem Programm wieder reingespielt hast, dauert schon recht lange ... (ausser du realisierst einen Kassenschlager wie CloneCD)

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  13. #13
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Mit MFC hab ich auch mal rumgeklickt:
    Also wenn ein Event eintraf, dann hat Windows automatisch das Event ans Fenster geschickt (z.B. WM_LBUTTONDOWN f. linke Maustaste).
    Will man darauf reagieren, braucht man eine Methode OnLButtonDown.
    Das entspricht wohl dem ActionListener in Java.

    Mehr weiß ich auch nicht mehr, den Rest sollte man wohl identisch wie beim Event-Delegations-Modell machen, falls M$ sich da nichts anderes für ausgedacht hat.


    Wegen der Zuweisung müsste ich mal in den Tiefen des Internets nachlesen, ich gehe mal davon aus, dass Sun die optimalste Methode genommen hat...
    I haven't lost my mind - It's somewhere on a backup-disc

  14. #14
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    hab was gesucht und gefunden (http://www.galileocomputing.de/openb...ava-03.htm#t39):

    "Wir wollen uns dies an einem Punkt-Objekt näher anschauen, das wir unter einem alternativen Variablennamen ansprechen können:


    Point p = new Point();
    Point q = p;


    Ein Punkt-Objekt wird erzeugt und mit der Variablen p referenziert. Die zweite Zeile speichert nun dieselbe Referenz durch die Variable q. Danach verweisen p und q auf dasselbe Objekt."
    Geändert von SeeksTheMoon (03-12-2002 um 16:47 Uhr)
    I haven't lost my mind - It's somewhere on a backup-disc

  15. #15
    Registrierter Benutzer
    Registriert seit
    17.09.2001
    Beiträge
    1.182

    Klasse! Danke

    In Gotojava3 wirds zwar erklärt wies prinzipiell geht, aber wie mans dann in der Praxis anwendet steht eben nicht drinnen oder habs ich überlesen).

    Auf jeden fall danke an alle, diemir da so tatkräftigt geholfen haben
    Geändert von Lin728 (19-08-2017 um 16:34 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •