Erfahrungen mit Racket

Nee, ich meine schon "windowed". Ich baue gerade den "sam"-Editor nach und komme da nur sehr behäbig vom Fleck. Sieht ca. so aus:

dMeCxkZ.png

Tabs bringen mir da nüscht. :)
 
Und da ich gerade am Fragen bin:

Wie kann ich einem dialog seine absurden Maße austreiben?

Beispiel:

Code:
(define (test-dlg)
  (define the-dialog
    (new dialog%
         (label "quux")))

  (new message%
       (label "foo

bar

baz")
       (horiz-margin 10)
       (vert-margin 10)
       (parent the-dialog))
 
  (send the-dialog show #t))

Führt zu:

Bwah3tA.png


Dem Dialog explizit eine height zu geben ändert überhaupt nichts. Ich hatte es mal testweise probiert, stattdessen eine Messagebox für so was zu nutzen, das ist aber noch bescheuerter: Ab vier Zeilen (oder so) wird da automatisch eine Scrollbar eingefügt. Etwas wie (scrollbars #f) scheint es nicht zu geben.

Will keiner außer mir auch mal mehrzeiligen Text mit Racket ausgeben? :mad:

Nachtrag: Noch schöner: Das label in einer message scheint zeichenbeschränkt zu sein. Wenn ich zu viel reinschreibe, kriege ich eine "contract violation". Was für ein Unsinn.
 
Ja, in der Widget Gallerie fehlt einiges, guckst Du hier:

Fehlende Widgets

MDI gibt es definitiv nicht, ich habe recherchiert. Auch wenn Racket nicht pefekt ist, es ist schnell zu erlernen und bringt zeitnah gute Ergebnisse. Es entwickelt sich ja hoffentlich weiter. Ich bleibe bei Racket, auch wenn es nicht vollkommen ist.
 
Ich hab mir mal den Sourcecode vom Modul files-viewer angeschaut, der verwendet ja auch für jedes neue Dokument einen Tab. Also mir reicht das. Das könnte ich mir auch vorstellen für den DokuMaker, denn es ist schon praktisch, wenn man mehrere Dokumente gleichzeitig anzeigen und bearbeiten kann. Und einen kleinen Dateimanager brauche ich ja auch für das neue größere Projekt burner. Denn es müssen ja auch einzelne Dateinen sowie Ordner hinzugefügt werden können, so das dann mit mkhybrid ein entsprechendes ISO Image erstellt werden kann. Die CD kann dann (auch ohne cdrecord) mit bordeigenen Mitteln per Buttonclick gebrannt werden.
 
Ich hab immer noch einen Denkfehler oder bekomme es nicht mit path hin:

Code:
[callback (lambda (button event)
             (process "doas cdio -f cd0 tao archiv.iso"))])

Wie bekomm ich es hin, das er archiv.iso nicht im Standardhomeverzeichnis akzeptiert, sondern in dem Verzeichnis aus dem cdburn.rkt gestartet wurde, und zwar egal in welchem Verzeichnis cdburn auch immer gespeichert ist, das soll ja mit path oder so funktionieren. Ich habe es in der Doku mir angeschaut, bekomme es aber nicht hin. Daher bitte ich um Hilfe. Vielleicht darf ich @Andy_m4 oder @midnight noch ein Mal um Hilfe bitten, das einer von Euch Sachkundigen mir diesen Code mal korrigiert. Er funktioniert zwar auch so, erwartet aber immer das ~/ Verzeichnis. Danke!:)
 
Wie bekomm ich es hin, das er archiv.iso nicht im Standardhomeverzeichnis akzeptiert, sondern in dem Verzeichnis aus dem cdburn.rkt gestartet wurde, und zwar egal in welchem Verzeichnis cdburn auch immer gespeichert ist, das soll ja mit path oder so funktionieren.
Normalerweise sollte es immer so sein das das "aktuelle Verzeichnis" das ist von wo aus Du Dein Programm gestartet hast. Das sollte auch beim Aufruf von process so sein.

Ansonsten gibt (current-directory) auch das aktuelle Verzeichnis zurück, so dass Du nachprüfen kannst, wo Du gerade bist.

Was Du sonst noch probieren kannst ist der #:set-pwd? Keyword-Parameter:
Code:
[callback (lambda (button event)
             (process "doas cdio -f cd0 tao archiv.iso" #:set-pwd? #t))]
 
Ich kann es gerade nicht testen, aber versuche mal folgendes:
Code:
[callback (lambda (button event)
             (process "doas cdio -f cd0 tao $(pwd)/archiv.iso"))])
 
Ansonsten gibt (current-directory) auch das aktuelle Verzeichnis zurück, so dass Du nachprüfen kannst, wo Du gerade bist.
Ist auf jeden Fall mal ein guter Tipp, danke.

Was Du sonst noch probieren kannst ist der #:set-pwd? Keyword-Parameter:
Funktioniert erst mal nicht, werde weiter testen müssen. Auf jeden Fall muß ich die Doku wohl noch lesen, bis ich es kapiere. Es geht ja grundsätzlich darum, wie auch im DokuMaker, das eine gespeicherte Datei dorthin gespeichert wird, von wo aus das racket Programm gestartet wurde. Wahrscheinlich muß ich es innerhalb des Programmes als Variable oder Funktion definieren, so das ich immer den relativen Path habe. Im Augenblick seh ich den Wald vor lauter Bäumen nicht, vielleicht sollte ich mal Pause machen, damit ich wieder klarer sehe.
 
Und da ich gerade am Fragen bin:

Wie kann ich einem dialog seine absurden Maße austreiben?

Beispiel:

Code:
(define (test-dlg)
  (define the-dialog
    (new dialog%
         (label "quux")))

  (new message%
       (label "foo

bar

baz")
       (horiz-margin 10)
       (vert-margin 10)
       (parent the-dialog))

  (send the-dialog show #t))

Führt zu:

Anhang anzeigen 3678

Dem Dialog explizit eine height zu geben ändert überhaupt nichts. Ich hatte es mal testweise probiert, stattdessen eine Messagebox für so was zu nutzen, das ist aber noch bescheuerter: Ab vier Zeilen (oder so) wird da automatisch eine Scrollbar eingefügt. Etwas wie (scrollbars #f) scheint es nicht zu geben.

Will keiner außer mir auch mal mehrzeiligen Text mit Racket ausgeben? :mad:

Nachtrag: Noch schöner: Das label in einer message scheint zeichenbeschränkt zu sein. Wenn ich zu viel reinschreibe, kriege ich eine "contract violation". Was für ein Unsinn.

Labels funktionieren in Racket meines Wissens nach nur einzeilig. Wenn Du mehrzeilige labels benoetigst, muesstest Du das in etwas so realisieren:

Code:
#lang racket

(require racket/gui/base)

(define the-dialog
  (new dialog% [label "quux"]))

(new message% [label "Es"] [parent the-dialog])
(new message% [label "war"] [parent the-dialog])
(new message% [label "einmal"] [parent the-dialog])
(new message% [label "vor"] [parent the-dialog])
(new message% [label "langer"] [parent the-dialog])
(new message% [label "Zeit..."] [parent the-dialog])

(send the-dialog show #t)
 
Weiterer Versuch, mich der Lösung anzunähern:

Also (current-directory) liefert den path des Ordners, aus dem das Racket Script gestartet wurde.

Einfacher Test:

Code:
#lang racket

(define dirpath (current-directory))

print dirpath

Funktioniert.

Jetzt mit GUI:

Code:
#lang racket/gui

(define dirpath (current-directory))

; Erstellt einen Frame, indem die Frame% -Klasse instanziiert wird

(define frame (new frame% [label "Beispiel Button Click event"]))

; Erstellt eine statische Textnachricht im Frame

(define msg (new message% [parent frame]
                          [label "Bisher kein Ereignis..."]))

; Erstell einen Button im Frame

(new button% [parent frame]
             [label "Klick mich"]

; Callback-Verfahren für einen Klick auf die Schaltfläche

             [callback (lambda (button event)
                         (send msg set-label dirpath))])

; Zeigt den Frame, indem seine show-Methode aufgerufen wird

(send frame show #t)

Funktioniert nicht. Ist dir dirpath kein String?

Komme leider nicht wirklich weiter.... :confused:
 
Bei mir funktioniert folgendes:
Code:
#lang racket/gui

(define dirpath (current-directory))
(define frame (new frame% [label "foo"]))
(define msg (new message% [parent frame] [label (format "Du bist hier: ~a" dirpath)]))
(send frame show #t)

Die Frage ist nun, wie Du deine beiden Beispiele getestet hast? Wo liegen die scripts oder sind die als binary in /usr/local/bin? Wie rufst Du die scripts auf?
 
Labels funktionieren in Racket meines Wissens nach nur einzeilig. Wenn Du mehrzeilige labels benoetigst, muesstest Du das in etwas so realisieren:
Ich würde es so machen:

Code:
#lang racket

(require racket/gui/base)

(define the-dialog
  (new dialog% [label "quux"]))

(new message% [label "Es"] [parent the-dialog])
(new message% [label "war"] [parent the-dialog])
(new message% [label "einmal"] [parent the-dialog])
(new message% [label "vor"] [parent the-dialog])
(new message% [label "langer"] [parent the-dialog])
(new message% [label "Zeit..."] [parent the-dialog])

(new message% [label "\n  DokuMaker: Version 0.9  \n\n  Author: Ralli"] [parent the-dialog])

(send the-dialog show #t)

Ist ein wenig umständlich, funktioniert aber zweizeilig.
 
Ich würde es so machen:

Code:
#lang racket

(require racket/gui/base)

(define the-dialog
  (new dialog% [label "quux"]))

(new message% [label "Es"] [parent the-dialog])
(new message% [label "war"] [parent the-dialog])
(new message% [label "einmal"] [parent the-dialog])
(new message% [label "vor"] [parent the-dialog])
(new message% [label "langer"] [parent the-dialog])
(new message% [label "Zeit..."] [parent the-dialog])

(new message% [label "\n  DokuMaker: Version 0.9  \n\n  Author: Ralli"] [parent the-dialog])

(send the-dialog show #t)

Ist ein wenig umständlich, funktioniert aber zweizeilig.

Ja, nur dann bist Du wieder beim Problem, dass mit jeder Zeile unnoetiger Leerraum unter dem Text entsteht. Das war ja das Problem, dass CrimsonKing oben angesprochen hat.
 
Die Frage ist nun, wie Du deine beiden Beispiele getestet hast? Wo liegen die scripts oder sind die als binary in /usr/local/bin? Wie rufst Du die scripts auf?
Im Augenblick arbeite ich überhaupt nicht mit binarys. Ich habe für jedes Projekt einen eigenen Ordner unter ~/racket/gui. Meine scripts rufe ich grundsätzlich mit racket script.rkt auf. Das habe ich für Gui Progs natürlich mitr caja automatisiert, so das ich das Gui Script im Dateimanager nur anzuklicken brauche. Also (current-dir) ist nicht das, was ich brauche. Die Funktion gibt mir nämlich den path des Homeverzeichnis aus. Ich muß aber den path des Ordners ermitteln, aus dem das Script gestartet wurde. Man, das kann doch nicht so schwierig sein .... (ich meine aber nicht Dich). Also wieder stundenlang die Doku wälzen.... ich glaub ich werd welk....;)
 
Im Augenblick arbeite ich überhaupt nicht mit binarys. Ich habe für jedes Projekt einen eigenen Ordner unter ~/racket/gui. Meine scripts rufe ich grundsätzlich mit racket script.rkt auf. Das habe ich für Gui Progs natürlich mitr caja automatisiert, so das ich das Gui Script im Dateimanager nur anzuklicken brauche. Also (current-dir) ist nicht das, was ich brauche. Die Funktion gibt mir nämlich den path des Homeverzeichnis aus. Ich muß aber den path des Ordners ermitteln, aus dem das Script gestartet wurde. Man, das kann doch nicht so schwierig sein .... (ich meine aber nicht Dich). Also wieder stundenlang die Doku wälzen.... ich glaub ich werd welk....;)

Doch, current-dir ist eigentlich die Funktion, die Du benoetigst. Versuche mal dein Racket-GUI-script ohne Caja auszufuehren. Ich vermute stark, dass Caja evtl. irgendwo den path auf dein $HOME setzt.
 
Doch, current-dir ist eigentlich die Funktion, die Du benoetigst. Versuche mal dein Racket-GUI-script ohne Caja auszufuehren. Ich vermute stark, dass Caja evtl. irgendwo den path auf dein $HOME setzt.
Werd ich gleich mal ausprobieren. Aber ich denke, ich habe die Lösung gefunden:

Code:
#lang racket/gui

;(define dirpath (current-directory)) Home Verzeichnis

(define dirpath (path-only (path->complete-path (find-system-path 'run-file))))

(define frame (new frame% [label "foo"]))

(define msg (new message% [parent frame] [label (format "Du bist hier: ~a" dirpath)]))

(send frame show #t)

Jetzt bekomme ich immer den kompletten und richtigen Pfad, egal von wo ich das Script starte.
 
@midnigt, Du hattest Recht, current-directory funktioniert einwandfrei in drracket und auch wenn ich das Script auf der Konsole mit racket starte. Klick ich es hingegen im Dateimanager caja an, dann liefert er immer ~/. Danke.
 
Labels funktionieren in Racket meines Wissens nach nur einzeilig. Wenn Du mehrzeilige labels benoetigst, muesstest Du das in etwas so realisieren:

Code:
#lang racket

(require racket/gui/base)

(define the-dialog
  (new dialog% [label "quux"]))

(new message% [label "Es"] [parent the-dialog])
(new message% [label "war"] [parent the-dialog])
(new message% [label "einmal"] [parent the-dialog])
(new message% [label "vor"] [parent the-dialog])
(new message% [label "langer"] [parent the-dialog])
(new message% [label "Zeit..."] [parent the-dialog])

(send the-dialog show #t)

Igitt... Danke!
 
Da ich auch versuchen werde einen kleinen Dateimanager zu erstellen, arbeite ich komplett dieses Kapitel dafür durch und werde für viele nützliche Funktionen auch mal einige Beispiele erstellen und dann posten:

Kapitel 15.2 Filesystem
 

Ich muss mich korrigieren:

Code:
#lang racket/gui

(define the-dialog
  (new dialog% [label "quux"]))

(new message%
     [label "Es\nwar\neinmal\nvor\nlanger\nZeit"]
     [parent the-dialog])

(send the-dialog show #t)

Unter Linux (Debian, Mate) funktionieren auch mehrzeilige labels ohne Abstaende unter dem Text.

@ralli Koenntest Du bitte mal den o.g. code unter OpenBSD mit Mate ausprobieren, ob unter dem Text ein grosser leerer Abstand bis zum Fensterrand besteht? Siehe auch https://www.bsdforen.de/threads/erfahrungen-mit-racket.34483/post-305263
 
Zurück
Oben