Erfahrungen mit Racket

Ich habe mich mal an ein kleines Beispiel für key events gewagt. Wie erwartet funktioniert es nicht auf Anhieb. Es soll eigentlich nur der Frame geschlossen werden, wenn die Taste ESCAPE gedrückt wird. Hab recherchiert und über 1 Stunde rumgedoktert .... ja programmieren müßte man können...

Code:
#lang racket/gui

(define frame (new frame% [label "Beispiel Key Events"] [width 300] [height 300]))

(define my-canvas%
  (class canvas%
    (define/override (on-char key-event)
      (cond

[(equal? (send key-event get-key-code 'escape)) (send frame show #f)]))))

;(super-new)

(send frame center)

(send frame show #t)
 
Ich möchte auf jede Eingabe in einem text-field% reagieren (vielleicht wird da ein kleines Tool draus). Das geht zwar mit einem callback, aber ich weiß nicht, wie ich da zum Beispiel ein "Return" erkennen kann. Bei allen anderen Tasten ist das leicht: Den Text auslesen und das letzte Zeichen ist es dann. Aber "Return" ist kein im Text vorhandenes Zeichen.
Ja. Das ist ein wenig tricky. Denn beim text-field% selbst landen nur control-events. Die Tastaturcodes selbst gelangen im text-field% enthaltenen editor.
Die einfachste Variante ein Key-Event beim text-field% abzufangen ist die Methode
on-subwindow-char zu überschreiben:
Code:
(define my-text-field
  (new (class text-field% (super-new)
         (define/override (on-subwindow-char receiver event)
           ; Nachschauen, ob ENTER gedrückt
           (if (equal? (send event get-key-code) #\return)
               ; Wenn ja:
               (displayln "ENTER!")
               ; falls nein, lass den Original-Eventhandler ran:
               (super on-subwindow-char receiver event))
           #f
           ))
       (label "Text")
       (parent my-parent)))
 
Es soll eigentlich nur der Frame geschlossen werden, wenn die Taste ESCAPE gedrückt wird.
Du hast zwar mit my-canvas% die neue Klasse definiert aber noch nicht instantiiert.
So sollte es aber funktionieren:
Code:
#lang racket/gui

(define frame (new frame% [label "Beispiel Key Events"] [width 300] [height 300]))

(define my-canvas%
  (class canvas%
    (super-new)
    (define/override (on-char key-event)
      (cond
        [(equal? (send key-event get-key-code) 'escape) (send frame show #f)]))))

(define my-canvas (new my-canvas% [parent frame]))

(send frame center)

(send frame show #t)
 
Du hast zwar mit my-canvas% die neue Klasse definiert aber noch nicht instantiiert.
So sollte es aber funktionieren:
Zunächst mal danke für die Unterstützung. Aber mal eine Frage, hast Du den Code ausgeführt und getestet? Bei mir wird der Frame zwar angezeigt, aber bei Betätigung der Taste ESCAPE passiert definitiv nichts. Ist es richtig, das my-canvas zwei Mal definiert wird?
 
Naja. Eigentlich der normale Weg bei klassenorientierten GUI-Toolkits. Wenn das Standard-Widget nicht das Verhalten an den Tag legt, was man möchte leitet man eine Klasse davon ab und implementiert das gewünschte Verhalten.
So kenn ich das auch vom QT Framework. Aber auch da fand ich es umständlich.
 
Aber mal eine Frage, hast Du den Code ausgeführt und getestet? Bei mir wird der Frame zwar angezeigt, aber bei Betätigung der Taste ESCAPE passiert definitiv nichts.
Das liegt daran, dass Dein Canvas den Focus nicht hat. Du musst also entweder den Focus per Programm drauf setzen oder einmal mit der Maus drauf klicken.

Ist es richtig, das my-canvas zwei Mal definiert wird?
Es wird nicht zwei mal definiert. Das sind zwei unterschiedliche Sachen.
my-canvas% ist die Klasse. my-canvas ist eine Instanz der Klasse my-canvas%.

Das Prozent hinten dran ist also nicht irgendein Operator oder so. Es ist lediglich eine Konvention damit man einem Bezeichner gleich ansieht, dass es eine Klasse ist. Du kannst prinzipiell beliebige Namen vergeben und auch schreiben:
Code:
(define meine-canvas-klasse
  (class canvas%
    (super-new)
    (define/override (on-char key-event)
      (cond
        [(equal? (send key-event get-key-code) 'escape) (send frame show #f)]))))

(define mein-canvas (new meine-canvas-klasse [parent frame]))

Generell macht es auf jeden Fall Sinn mit der objektorientierten Programmierung unter Racket vertraut zu sein, weil das Racket-GUI-Toolkit intensiv Gebrauch davon macht:

So kenn ich das auch vom QT Framework. Aber auch da fand ich es umständlich.

Die Frage ist halt immer, wie macht man es alternativ. Wenn es so viele so machen, dann ist es möglicherweise ja von allen denkbaren Varianten der beste Kompromiss.

Ungeachtet dessen kann es bei CrimsonKings Problem auch sinnvoll sein sich an den text-field-Editor zu hängen und die keymap-Belegung für "Enter" zu ändern. Oftmals führen ja auch mehrere Wege nach Rom.
Das war jetzt eher so die "Holzhammer"-Methode, weil die halt bei jeder von window% abgeleiteten Klasse funktioniert.
 
Es wird nicht zwei mal definiert. Das sind zwei unterschiedliche Sachen.
my-canvas% ist die Klasse. my-canvas ist eine Instanz der Klasse my-canvas%.
Ok, das habe ich jetzt verstanden. Ich merke gerade, das ich trotz einiger Anfangserfolge noch ziemlich am Anfang stehe und noch viel zu lernen habe. Für Deine Unterstützung bin ich zutiefst dankbar, weil das an bestimmten Stellen, wo es noch hapert, zu einem besseren Verständnis führt.

Das liegt daran, dass Dein Canvas den Focus nicht hat. Du musst also entweder den Focus per Programm drauf setzen oder einmal mit der Maus drauf klicken.
Du bist der Held, es funktioniert.:)
 
Generell macht es auf jeden Fall Sinn mit der objektorientierten Programmierung unter Racket vertraut zu sein, weil das Racket-GUI-Toolkit intensiv Gebrauch davon macht:
Jupp, werde ich durcharbeiten, denn das werde ich immer wieder gebrauchen, danke für den Tipp.:)

Ohne @midnight und Dich hätte ich wohl langsam die Motivation verloren, aber jetzt habe ich wieder Zuversicht gefaßt, das ich das dann doch noch gebacken kriege.
 
Jupp, werde ich durcharbeiten, denn das werde ich immer wieder gebrauchen, danke für den Tipp
Ja. Gerade der Guide ist eigentlich ganz eingängig, weils mehr so wie ein Tutorial ist.

aber jetzt habe ich wieder Zuversicht gefaßt, das ich das dann doch noch gebacken kriege.
Ganz bestimmt.
Ist ja meist so am Anfang das einem vieles unklar ist und man mehr probiert als zielgerichtet irgendwas zu machen. Und dann nach und nach werden einem die Zusammenhänge klar.

Übrigens, wegen Deinen Helferlein a-la "CD einhängen" etc. hatte ich ja schon mal die Idee, ob man dafür nicht ein Rahmenprogramm macht in dem solche Helferlein dann Plugin-mäßig eingebunden werden und dann z.B. quasi als App in einem Tab laufen oder so ähnlich.
Mal sehen, ob ich da mal die nächsten Tage was zusammen schreiben kann, wenn sich die Zeit findet.
 
Bambus funktioniert meistens. Oder erst mal was anderes machen. Ich prokrastiniere aktuell sowohl meine Japanischstudien als auch meine Arbeit an o.g. C#-Programm ... :o
 
Ganz bestimmt.
Ist ja meist so am Anfang das einem vieles unklar ist und man mehr probiert als zielgerichtet irgendwas zu machen. Und dann nach und nach werden einem die Zusammenhänge klar.
Ganz genau so ist es.

Übrigens, wegen Deinen Helferlein a-la "CD einhängen" etc. hatte ich ja schon mal die Idee, ob man dafür nicht ein Rahmenprogramm macht in dem solche Helferlein dann Plugin-mäßig eingebunden werden und dann z.B. quasi als App in einem Tab laufen oder so ähnlich.
Mal sehen, ob ich da mal die nächsten Tage was zusammen schreiben kann, wenn sich die Zeit findet.
Eine Suuuuper Idee.... :)
 
Ich prokrastiniere aktuell sowohl meine Japanischstudien als auch meine Arbeit an o.g. C#-Programm ... :o
Ojee, Du leidest doch nicht an "Aufschieberities? Wenn doch, wünsche ich gute Besserung.;)

Aber mal im Ernst, ich neige auch dazu, auf vielen Hochzeiten zu tanzen, oder zu viel auf ein Mal zu machen. Das allerschlimmste aber ist es, wenn ich den Lernzenith überschritten habe, muß ich aufpassen, das mich nicht die Langeweile peinigt. Deshalb sind geistige Herausforderungen auch im fortgeschritteneren Alter ein absolutes Muß für mich.

Ich will ehrlich sein, letzte Woche oder die letzten Tage war ich auch ein bißchen neben der Spur und war vollgedröhnt mit Antibiotika. Geht mir aber schon wieder besser, alles ist gut.
 
Deswegen habe ich mit Japanisch angefangen. Über 30 wird das Gehirn nicht mehr vernünftig gefördert. ;)
Echt? Dann wünsche ich viel Erfolg und gutes Gelingen.:) Und mit 68 muß ich mir die Herausforderungen auch selber setzen ...;)

Ist zwar jetzt ein wenig OT, aber egal. Ist japanisch schwer zu lernen?
 
Hängt davon ab. Japanisch hat eigentlich eine ziemlich einfache Grammatik (auch nicht deutlich komplizierter als Spanisch, es wird viel mit Nach- und Zwischensilben gearbeitet), aber der Rest...

Vor allem die Schrift ist anstrengend. Das Japanische kennt Hiragana (die "normale" Schrift für eigentlich alles), Katakana (für Fremdwörter im Allgemeinen) und Kanji (für chinesische Fremdwörter im Speziellen, außerdem für Zahlen), wobei Hiragana und Katakana meist für Silben (so was wie "shi" und "kyo", aber auch "a", "e", "i", "o" und "u"), Kanji hingegen auch für ganze Wörter stehen können. In normalen japanischen Texten, wurde mir angedroht, kommen die alle gleichzeitig vor.

Obwohl Katakana und Kanji in meinem Selbststudium erst später (da bin ich noch nicht) "drankommen", habe ich jetzt schon ordentlich was zu tun: Die Hiragana, von denen es ungefähr 50 gibt, haben jeweils eine "Lesart" (es wäre schon gut zu wissen, wie man sie ungefähr ausspricht), eine "Schreibart" (ein Zeichen lesen zu können heißt noch nicht, dass man es auch reproduzieren kann - das lernt man auch in der Grundschule mit "Ole geht in die Schule. Ole Ole Ole Ole Ole..." :)) und dann werden daraus auch noch Wörter gebildet, die jeweils eine Grammatik (allerdings recht regelmäßig) und eine Übersetzung haben.

Das lernt man nicht mal mit viel Mühe an einem Wochenende. Ist ja nicht Englisch oder so.

OT Ende - 'tschulljung.
 
Zurück
Oben