Die Programmiersprache Ruby

Blog| Forum| Wiki  

Dieses Snippet stellt eine einfache GUI mit wxRuby unter Ruby 1.9 auf die Beine.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env ruby
#Encoding: UTF-8
=begin
Ein Beispielprogramm, geschrieben von Quintus am 
25.11.2009 mit der wxRuby-Version 2.0.1. 
Getestet mit Ruby 1.9.1-p243. 

Demonstriert wird der allgemeine Gebrauch von Frames und 
die Anwendung von Events sowie das Anzeigen von Dialogen. 
=end

#Hier definierte Methoden sind überall verfügbar. 
module Kernel
  
  #Der Codeblock dieser Methode wird in einer Umgebung ausgeführt, 
  #die keine Warnings hervorruft. 
  def without_warnings
    raise(ArgumentError, "No block given!") unless block_given?
    v, $VERBOSE = $VERBOSE, nil
    yield
    $VERBOSE = v
  end
  
end

#Einbinden der wxRuby-Bibliothek
without_warnings{require "wx"} #Gibt unter 1.9 sonst sehr viele Warnings

#Ableiten einer eigenen Klasse von der Wx-Hauptklasse App
class MyGUI < Wx::App
  include Wx #Einbinden des Wx-Moduls, sodass wir nicht immer Wx:: für Namespaceauflösungen schreiben müssen
  
  #Die #on_init-Methode wird beim Start der Anwendung aufgerufen. 
  #Hier sollten alle Controls erstellt und angezeigt werden. 
  def on_init
    #Erstelle das Hauptfenster. Es hat kein Elternfenster - nil - und eine Größe von 400x400 Pixel. 
    #Sein in der Titelleiste angezeigter Name ist »Testprogramm«. 
    @mainwindow = Frame.new(nil, size: Size.new(400, 400), title: "Testprogramm")
    #Diese Zeile setzt den Hintergrund des Fensters auf die Standard-Hintergrundfarbe 
    #des Betriebssystems. Gelegentlich kommt es vor, dass der Hintergrund ohne diese Zeile 
    #ein sehr dunkles Grau annimmt. 
    @mainwindow.background_colour = NULL_COLOUR #Achte auf die Schreibweise! Colour, nicht Color!
    
    #Erstelle ein Label im Hauptfenster (@mainwindow) an der Position (20|20). 
    #StaticText-Controls benötigen in der Regel keine Größenzuweisung, da sie sich 
    #automatisch an ihren Inhalt anpassen. 
    StaticText.new(@mainwindow, pos: Point.new(20, 20), label: "Drücke, um eine Dialogbox aufzurufen:")
    #Erstelle einen Button mit der Aufschrift »Klick mich!« im Hauptfenster. 
    #Er bekommt eine fixe Breite von 100 Pixeln, aber die Höhe überlassen wir wxRuby. 
    @button = Button.new(@mainwindow, pos: Point.new(20, 50), size: Size.new(100, -1), label: "Klick mich!")
    
    #Weise jeder erforderlichen Aktion seinen Handler zu. 
    #Methodendefinition siehe weiter unten. 
    setup_event_handlers
    
    #Zeige das Hauptfenster (mit allen Controls) an. 
    @mainwindow.show
  end
  
  #Die folgenden Methoden sollten nicht von außerhalb aufgerufen werden können. 
  private
  
  #Weise jeder erforderlichen Aktion seinen Handler zu. 
  def setup_event_handlers
    #Fange das EVT_BUTTON-Event des Buttons @button auf 
    #und leite es an die Methode #on_button_click weiter. 
    evt_button(@button){|event| on_button_click(event)}
  end
  
  #Event-Handler unseres Buttons. Das mitgegebene Event 
  #enthält Informationen wie z.B. die Klickposition. 
  def on_button_click(event)
    #Erstelle einen Nachrichten-Dialog mit einem OK-Button und 
    #einem Informationssymbol. Sein Elternfenster ist ebenfalls das 
    #Hauptfenster. 
    md = MessageDialog.new(@mainwindow, caption: "Begrüßung", message: "Hallo, Welt!", style: OK | ICON_INFORMATION)
    #Zeige den Dialog modal an, d.h. verhindere für die Zeit seiner Anzeige 
    #alle Aktionen, die das Elternfenster (in unserem Fall @mainwindow) betreffen. 
    md.show_modal
  end
  
end

#Starte die GUI - aber nur, wenn diese Datei als Hauptprogramm benutzt wird. 
if __FILE__ == $0
  #Erstellen des GUI-Objekts
  x = MyGUI.new
  #Aufrufen der Haupt-(Event-)-Schleife. 
  x.main_loop
end