LISP Eine Einführung 5. OBERFLÄCHLICHES
Übersicht 2 5.1 Verschiedenes zum letzten Aufgabenblatt 5.2 Geschwister und Komponenten oder wie finde ich was 5.3 on-click-methoden und on-change-methoden
5.1 Musterlösung 3 (defmethod installiere-os ((computer computer) (os-typ string) (version string) (name string) (passwd string)) (setf (os computer) (make-instance 'betriebssystem :os-typ os-typ :version version :user (list (make-instance 'benutzer :name name :passwd passwd :benutzertyp "admin"))))) (defmethod konto-gesperrtp ((user benutzer)) (<= (status user) 0))
(defmethod starte-sitzung ((computer computer) (name string) (kode string)) (let ((user (find-if #'(lambda (x) (equal (name x) name)) (append (angemeldet (os computer)) (user (os computer)))))) (cond ((not user) "Ein Benutzer mit diesem Namen existiert nicht!") ((konto-gesperrtp user) "Ihr Konto ist gesperrt!") ((= (status user) 100) "Sitzung ist bereits aktiv!") ((and (equal name (name user)) (equal kode (passwd user)) (> (status user) 0)) (setf (status user) 100) (unless (member user (angemeldet (os computer)) :test #'equal) (setf (angemeldet (os computer)) (cons user (angemeldet (os computer))))) "Zugang gewährt.") Musterlösung (t (setf (status user) (- (status user) 1)) "Falsches Passwort!" )))) 4
Musterlösung 5 (defmethod beende-sitzung ((computer computer)) (if (and (angemeldet (os computer)) (= (status (first (angemeldet (os computer)))) 100)) (progn (setf (status (first (angemeldet (os computer)))) 3 (angemeldet (os computer)) (rest (angemeldet (os computer)))) "Sitzung beendet") "Unzulässige Aktion!"))
Musterlösung 6 (defmethod neuer-benutzer ((computer computer) (name string) (kode string)) (cond ((not (angemeldet (os computer))) "Niemand angemeldet!") ((not (equal (benutzertyp (first (angemeldet (os computer)))) "admin")) "Sie haben keine ausreichende Berechtigung(en)!") (t (setf (user (os computer)) (cons (make-instance 'benutzer :name name :passwd kode :benutzertyp "standard") (user (os computer)))) "Benutzer eingetragen")))
Musterlösung 7 (defmethod benutzer-wechseln ((computer computer)) (cond ((not (angemeldet (os computer))) "Niemand angemeldet!") (t (setf (angemeldet (os computer)) (append (rest (angemeldet (os computer))) (list (first (angemeldet (os computer)))))) (list "Aktiver Benutzer: " (name (first (angemeldet (os computer))))))))
5.2 Geschwister 8 Jede Applikation kann aus einer (beliebigen) Anzahl von Fenstern (bzw. Formen) bestehen. Fenster, die dem Benutzer ein gewisses Maß an Interaktivität gestatten, sind vom Typ dialog. Alle Objekte, die auf einem Fenster liegen, sind Komponenten des Fensters; das Fenster wird auch als Elternteil (parent) dieser Objekte betrachtet. Alle Objekte, die auf einem Fenster liegen, werden als Geschwister (voneinander) betrachtet.
Geschwister Eigenschaften von Objekten können vor der Ausführung des Programms im Inspector oder während der Ausführung des Programms durch geeignete Methoden geändert werden (via SETF-Eigenschaft-Anweisungen). In automatisch generierten Methoden bzw. Funktionen wird der Fenster-Parameter mit dialog und der Objekt-Parameter mit widget bezeichnet: (defun form1-button1-on-click (dialog widget) 9
Geschwister Zum Auffinden von Objekten können folgende beiden Funktionen verwendet werden: FIND-COMPONENT name fenster-oder-name name ist der Name des gesuchten Objekt; fenster-oder-name identifiziert das Fenster, auf dem sich name befindet 10 FIND-SIBLING name objekt name ist der Name des gesuchten Objekt; objekt das Schwesterobjekt, das als Referenzpunkt der Suche dient
Geschwister 11 1. Wenn auf einem Fenster mit dem Namen :mein-fenster ein Knopf mit dem Namen :hilfe-knopf liegt, dann kann dieser Knopf durch (find-component :hilfe-knopf :mein-fenster ) erreicht werden und seine Eigenschaften durch (setf (eigenschaft (find-component :hilfe-knopf :mein-fenster ) neuer-wert) verändert werden. 2. Gibt es noch einen Knopf mit Namen :abschalt-knopf, dann ist er durch (find-component : abschalt-knopf :mein-fenster ) oder (find-sibling :abschalt-knopf :hilfe-knopf) ansprechbar.
5.3 on-click-methoden und on-change-methoden 12 ACL stellt für Dialogobjekte verschiedene Funktionen zur Behandlung folgender Ereignisse zur Verfügung: on-change on-click on-double-click on-mouse-in on-mouse-out
on-click-methoden und on-change-methoden 13 Wenn man im Inspector die Tabelle Events betrachtet, entdeckt man, dass es diesen Ereignissen korrespondierende Attribute gibt, deren Wert fast ausschließlich mit NIL initialisiert ist. Wenn man eines dieser Wertfelder anklickt, erzeugt ACL automatisch das Skelett einer Funktion zur Behandlung des entsprechenden Ereignisses.
on-click-methoden und on-change-methoden 14 (defun formname-objektname-on-change (widget new-value old-value) (declare (ignore-if-unused widget new-value old-value)) < An dieser Stelle sollten die gewünschten Anweisungen enigefügt werden> t) ; Accept the new value (defun formname-objektname-on-click (dialog widget) (declare (ignore-if-unused dialog widget)) < An dieser Stelle sollten die gewünschten Anweisungen eingefügt werden> t)
on-click-methoden und on-change-methoden 15 pop-up-message-dialog fenster title prompt icon button1 Es wird ein Meldungsfenster über fenster angezeigt, dass im Rahmen titel und im Fenster prompt anzeigt und durch Anklicken von button1 geschlossen wird. Als title-, prompt- und button1-argumente werden Strings erwartet; als fenster und icon-argument müssen geeignete Objekte (bzw. bei icon auch NIL) verwendet werden.