PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann man GUI und OOP am besten vereinen?



Lin728
02-12-2002, 17:47
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

anda_skoa
02-12-2002, 18:15
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,
_

Lin728
03-12-2002, 06:58
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

anda_skoa
03-12-2002, 09:20
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,
_

SeeksTheMoon
03-12-2002, 11:10
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/guide/awt/1.3/designspec/events.html

Lin728
03-12-2002, 12:50
danke Mondsuchender!

Der Beispielcode der dabei ist, is genial, endlich hab ich eine möglichkeit gefunden, das ganze Strukturiert zu machen!

Lin728
03-12-2002, 12:52
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?

SeeksTheMoon
03-12-2002, 13:50
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)

Lin728
03-12-2002, 13:57
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

axeljaeger
03-12-2002, 14:07
Also ich kann nicht mehr ohne Signals&Slots leben und finde auch Listener umständlich

Lin728
03-12-2002, 14:26
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

peschmae
03-12-2002, 15:06
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ä

SeeksTheMoon
03-12-2002, 15:20
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...

SeeksTheMoon
03-12-2002, 15:45
hab was gesucht und gefunden (http://www.galileocomputing.de/openbook/javainsel/java-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."

Lin728
03-12-2002, 15:56
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

anda_skoa
03-12-2002, 17:21
Original geschrieben von ceisserer

Mein Problem ist halt, das C++ ohne QT doch eher rauh ist


Früher konnte ich ohne Qt auch kein C++ machen.
Vorallem das string Handling von C Strings ist ein Grauen.
Aber seit einiger Zeit kann man praktisch alles, was Non-GUI ist, super mit den Sachen aus der stdlib und der STL machen.

Aber ich kann mit axlejaeger nur anschliessen :)
Signal&Slots sind eine verdammt feine Sache.



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


Die arbeite intern mit einem Messagetable.
Jedes Event ist da eine Message an das Fenster (wobei auch ein Button ein Fenster ist)
Man kann eine Message mit einem Eventhandler ähnlich wie bei Signal&Slots verbinden, allerdings, glaube ich, nur zur Compilezeit.

Aber die MFC kannst vergessen. Die schleppen die alte API mit, weil sie immer scön Sourcekopatible bleiben wollten.
Von OOP sieht man da manchmal nur Ansätze, etc.

Ein Freund von mir muß das für seine Diplomarbeit benutzen und der flucht nur :)

Ciao,
_

Lin728
03-12-2002, 18:08
Hi!

Kennt wer ein freies C++-GUI das Signal&Slots benutzt? Ich bn ja C++ generell nicht abgeneigt

Und Garbage-Collection gibts ja auch schon für C++.....

anda_skoa
03-12-2002, 18:45
Original geschrieben von ceisserer

Kennt wer ein freies C++-GUI das Signal&Slots benutzt?

GPL nicht frei genug? :)
Lass das mal RMS hören



Ab besten wär eine Wrapper-Lib auf GTK+, aber ich bin da nicht so heikel...


AFAIK gibt es C++ Bindings für GTK+
gtkmm oder so ähnlich.

Ciao,
_

SeeksTheMoon
03-12-2002, 20:17
Signal & Slots? gibts da ne andere Bezeichnung für? Was ist damit gemeint?
Observer?

anda_skoa
04-12-2002, 08:26
Original geschrieben von SeeksTheMoon
Signal & Slots? gibts da ne andere Bezeichnung für? Was ist damit gemeint?
Observer?
http://doc.trolltech.com/3.1/signalsandslots.html

Ciao,
_

axeljaeger
04-12-2002, 16:43
Wenn du nur Signals&Slots willst, hilft das vielleicht: LibSigc++ (http://libsigc.sourceforge.net)