Die Programmiersprache Ruby

Blog| Forum| Wiki  

Die Artikel FxRuby und FXRuby überschneiden sich inhaltlich. Bitte hilf mit, das zu verbessern, indem du die Artikel unter einem Namen zusammenführst.
Bitte entferne anschließend den Redundanz-Baustein.

Ich würde mich über einen Kommentar und Anregung freuen ICQ 567877710 ich schreibe weiter an diesen Thema (Diskussionsseite - anschauen)

Dieser Beitrag ist in Modulen aufgebaut und kann durch Kopieren aus dem diesen Beispiel schnell ein Gui zusammen stellen

Inhaltsverzeichnis


Grundlagen

Wer sich in FX einarbeiten möchte sollte sich mit der Homepage anfreunden
Dort gibts es unter anderem die aktuelle API und ein Anfängertutorial. Nachdem man das durchgearbeitet hat, sollte man die Grundlagen beherrschen, um selbstständig weiter zu experimentieren.
Dann kann man anfangen neue Elemente in das Standardfenster einzubauen. Dabei sollte immer die API offen sein, dort steht alles nötige drin. Außerdem liefert die Installation des fxruby-Gems auch einige sehr schöne Beispiel (unter RUBYORDNER/lib/ruby/gems/1.8/fxruby/examples) aus denen man einiges lernen kann.

Installation

  • Beim One-Click-Installer für Windows ist es standardmäßig dabei.
  • Alternativ kann man es sich per gem install fxruby von Rubyforge ziehn
  • Hier ein Link zu den Binarys

Einbinden

  • Um das gem in einem Ruby-Programm zu verwenden wird es wie alle anderem Gems auch per require eingebunden
  • Dazu gibts verschiedene Variationen, die gebräuchlichste aber ist require 'fox16
  • per include Fox erspart man sich vor jedes FX Element Fox:: zu schreiben

Grundgerüst

Hello World

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'fox16'
include Fox

# Applikation initialisieren
application = FXApp.new("FXRuby", "FoxTest")
# Der Applikation ein Hauptfenster ��bergeben
main = FXMainWindow.new(application, "Title", nil, nil, DECOR_ALL)
# Dem Hauptfenster ein Element ��bergeben - hier ein Button, der beim Click die Anwendung schlie��t
FXButton.new(main, "&Hello, World!", nil, application, FXApp::ID_QUIT)
# Bevors losgehen kann muss die Applikation erstellt werden
application.create()
# das Fenster anzeigen (mittig auf dem Bildschirm)
main.show(PLACEMENT_SCREEN)
# die Applikation starten
application.run()


einfaches Fenster

Wie im Hello World Beispiel gesehen kann man alles fortlaufen aus Standardelementen zusammenbauen. Am Sinnvollsten ist aber das Erstellen einer eigenen Fensterklasse - schon aus Übersichtsgründen. Dabei wird einfach die eigenene Klasse vom FXMainWindow abgeleitet. (Dieses Beispiel kann man Kopieren, die Kommentare rausnehmen und für jegliche Übung verwenden, da es ist ein leeres, lauffähiges Fenster ist) Hier wird nicht jeder mögliche Parameter der Elemente aufgeführt. Wer genau wissen will was geht schaut in die API (Link - siehe oben)

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
require 'fox16'
include Fox

  class MyWindow < FXMainWindow
    def initialize(app)    
      # Initialisierungfunktion von FXMainWindow aufrufen
      super(app, "Forum FXRubyTutorial", :opts => DECOR_ALL, :width => 850, :height => 600)
      # Hier folgen dann in der Regel die Fensterelemente, wie Frames, Buttons und Labels
      # Bsp: FXLabel.new(self, "Hello World") # self <- da unsere Klasse ja selbst der Bezugspunkt ist
    end

    # Ist einfach Pflicht, das Fenster muss erstellt und angezeigt werden
    def create
      super
      show(PLACEMENT_SCREEN)
    end

    # Applikation bei SIGINT Signal ordentlich beenden (wenn zBsp jmd in der Console STRG+C dr��ckt)
    def ende(sender, sel, ptr)
      getApp().exit(0)
    end
  end

if __FILE__ == $0  
  # Wie gehabt - neue Appliaktion, Fenster ��bergeben, Applikation erstellen und starten
  application = FXApp.new("Window", "Test")
  window = MyWindow.new(application)
  application.addSignal("SIGINT",window.method(:ende)) # Ist ein Zusatz um die App immer odentlich zu beenden
  application.create
  application.run
end


(... to be continued ...)

Popmenü erzeugen

So gehts
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
def mn
      menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
      
      ## 1.Spalte
      menucol1 = FXMenuPane.new(self)
      FXMenuTitle.new(menubar, "&Spalte1", nil, menucol1)
            
      @menucol11=FXMenuCommand.new(menucol1, "&Save", nil, getApp())
      @menucol12=FXMenuCommand.new(menucol1, "&Open", nil, getApp())
      @menucol13=FXMenuCommand.new(menucol1, "&Quit", nil, getApp())
      @menucol14=FXMenuCommand.new(menucol1, "&Exit", nil, getApp())
      
      ## 2.Spalte
      menucol2 = FXMenuPane.new(self)
      FXMenuTitle.new(menubar, "&Splte2", nil, menucol2)
      
      @menucol21=FXMenuCommand.new(menucol2, "&menucol21", nil, getApp())
      @menucol22=FXMenuCommand.new(menucol2, "&menucol22", nil, getApp())
      @menucol23=FXMenuCommand.new(menucol2, "&menucol23", nil, getApp())
      
      ## 3.Spalte
      menucol3 = FXMenuPane.new(self)
      FXMenuTitle.new(menubar, "&Spalte3", nil, menucol3)
      
      @menucol31=FXMenuCommand.new(menucol3, "&menucol31", nil, getApp())
      @menucol32=FXMenuCommand.new(menucol3, "&menucol32", nil, getApp())
      @menucol33=FXMenuCommand.new(menucol3, "&menucol33", nil, getApp())
      
      ## 4.Spalte
      menucol4 = FXMenuPane.new(self)
      FXMenuTitle.new(menubar, "&Spalte4", nil, menucol3)
      
      @menucol41=FXMenuCommand.new(menucol4, "&menucol41", nil, getApp())
      @menucol42=FXMenuCommand.new(menucol4, "&menucol42", nil, getApp())
      @menucol43=FXMenuCommand.new(menucol4, "&menucol43", nil, getApp())
    end #def mn
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
def cmmndmn
      @menucol11.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue11\n"
        STDOUT.flush
      end
      @menucol12.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue12\n"
        STDOUT.flush
      end
      @menucol13.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue13\n"
        STDOUT.flush
      end
      @menucol14.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue14\n"
        STDOUT.flush
      end
      
      @menucol21.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue21\n"
        STDOUT.flush
      end
      @menucol22.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue22\n"
        STDOUT.flush
      end
      @menucol23.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue23\n"
        STDOUT.flush
      end
      
      @menucol31.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue31\n"
        STDOUT.flush
      end
      @menucol32.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue32\n"
        STDOUT.flush
      end
      @menucol33.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue33\n"
        STDOUT.flush
      end
      
      @menucol41.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue41\n"
        STDOUT.flush
      end
      @menucol42.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue42\n"
        STDOUT.flush
      end
      @menucol43.connect(SEL_COMMAND) do |sender, selector, data|
        STDOUT.print "Menue43\n"
        STDOUT.flush
      end
    end #def cmmndmn
durch einsetzen in die initialize methode der GUI

Anwendung entsteht das Programm

1
2
3
4
5
6
def initialize(app)
  text=Iconv.iconv('utf-8','iso-8859-15','Forum FXRubyTutorial').to_s
  super(app, text, :opts => DECOR_ALL, :width => 850, :height => 600)
  mn
  cmmndmn
end #def initialize
Erweiter des Minimal Fenster mit Widgets

um die Gui Klasse von Ruby leichter lesen können
Werden Einstellung die der User benötig in eigene Klassen
abgelegt und mit FXRuby Werten vorbelegt
in diesen Fall kann wegen LAYOUT_EXPLICIT
mit x und y Werte bestimmt werden
so sie anzeigt werden sollen

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
class MyEntry < FXTextField
  def initialize(main,xwert,ywert,wwert=380,hwert=30)
    super(main,1,nil,:opts =>LAYOUT_EXPLICIT,:x=>xwert,:y=>ywert,
:width =>wwert,:height =>hwert)
    self.font =FXFont.new(getApp(), "Arial ", 8,FONTWEIGHT_BOLD)
  end #def initialize
end #class MyEntry
class MyCombobox < FXComboBox
  def initialize(main,xwert,ywert,wwert=180,hwert=30)
    super(main,10,nil,0,:opts =>COMBOBOX_NORMAL|LAYOUT_EXPLICIT,:x=>xwert,
          :y=>ywert,:width =>wwert,:height =>hwert)
    self.font =FXFont.new(getApp(), "Arial", 8,FONTWEIGHT_BOLD)
    self.numVisible=10
  end #def initialize
end #class MyComboBox
class MyButton < FXButton
  def initialize(main,xwert,ywert,text,wwert=180,hwert=30)
    text=Iconv.iconv('utf-8','iso-8859-15',text).to_s
    super(main,text,nil,nil,0,:opts =>BUTTON_NORMAL|LAYOUT_EXPLICIT,:x=>xwert,
          :y=>ywert,:width =>wwert,:height =>hwert)
    self.font =FXFont.new(getApp(), "Arial", 8,FONTWEIGHT_BOLD)
  end #def initialize
end #class MyButtun
class MyListBox < FXListBox
  def initialize(main,xwert,ywert,wwert=180,hwert=30)
    super(main,nil,0,:opts =>LISTBOX_NORMAL|LAYOUT_EXPLICIT,:x=>xwert,
          :y=>ywert,:width =>wwert,:height =>hwert)
    self.font =FXFont.new(getApp(), "Arial", 8,FONTWEIGHT_BOLD)
    self.numVisible=10
  end #def initialize
end #class MyListBox
class MyLabel < FXLabel
  def initialize(main,xwert,ywert,text,wwert=400,hwert=30)
    text=Iconv.iconv('utf-8','iso-8859-15',text).to_s
    super(main,text,nil,:opts =>JUSTIFY_LEFT|LABEL_NORMAL|LAYOUT_EXPLICIT,:x=>xwert,
          :y=>ywert,:width =>wwert,:height =>hwert)
    self.font =FXFont.new(getApp(), "Arial", 8,FONTWEIGHT_BOLD)
  end #def initialize
end #class MyListBox

in einer Methode in der GUI können jetzt die
Widgets geladen und verteilt werden

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def scrn
  @entry1 = MyEntry.new(self,10,10)
  @entry2 = MyEntry.new(self,10,50)
  @entry3 = MyEntry.new(self,10,90)
  @entry4 = MyEntry.new(self,10,170)

  @combobox1 = MyCombobox.new(self,10,130)
  @combobox2 = MyCombobox.new(self,410,10)

  @listbox1 = MyListBox.new(self,410,50)
  @listbox2 = MyListBox.new(self,410,90)

  @button1 = MyButton.new(self,610, 10,"Button1")
  @button2 = MyButton.new(self,610, 50,"Button2")
  @button3 = MyButton.new(self,610, 90,"Button3")
  @button4 = MyButton.new(self,610,230,"Button4")
  @button5 = MyButton.new(self, 10,210,"Button5")

  @label1 = MyLabel.new(self,200,130,"Textausgabe")

end #def scrn
setzen von Startwerten
1
2
3
4
5
6
7
8
9
10
def set
  @entry1.text="Entry1"
  @entry2.text="Entry2"
  @entry3.text="Entry3"
  @entry4.text="Entry4"
  @combobox1.appendItem("combobox1") 
  @combobox2.appendItem("combobox2")
  @listbox1.appendItem("listbox1")
  @listbox2.appendItem("listbox2")
end #def set
Verbindung zu einer Anwendung
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
def cmmnd
  @button1.connect(SEL_COMMAND) do |sender, selector, data|
    STDOUT.print "wahl\n"
    STDOUT.flush
  end #button1.connect
  @button1.connect(SEL_MOUSEWHEEL) do |sender, selector, data|
    STDOUT.print "drehen #{data.target}\n"
    STDOUT.flush
  end #button1.connect
  @button1.connect(SEL_MIDDLEBUTTONPRESS) do |sender, selector, data|
    STDOUT.print "mitte \n"
    STDOUT.flush
  end #button1.connect
  @button1.connect(SEL_RIGHTBUTTONPRESS) do |sender, selector, data|
    #STDOUT.print data.win_x, data.win_y
    STDOUT.print "rechts  right\n"
    STDOUT.flush
  end #button1.connect
  @button1.connect(SEL_LEFTBUTTONPRESS) do |sender, selector, data|
    #STDOUT.print data.class,"\n"
    STDOUT.print "links left #{sender}\n"
    STDOUT.flush
  end #button1.connect
  @button2.connect(SEL_COMMAND) do |sender, selector, data|
    STDOUT.print "return  #{sender}    #{selector} #{data}\n"
    STDOUT.flush
  end #button2.connect
  @button3.connect(SEL_COMMAND) do |sender, selector, data|

  end #button3.connect
  @button4.connect(SEL_COMMAND) do |sender, selector, data|

  end #button4.connect
  @button5.connect(SEL_COMMAND) do |sender, selector, data|

  end #button5.connect
  @combobox1.connect(SEL_COMMAND) do |sender, selector, data|

  end
  @combobox2.connect(SEL_COMMAND) do |sender, selector, data|

  end
  @listbox1.connect(SEL_COMMAND) do |sender, selector, data|

  end
  @listbox2.connect(SEL_COMMAND) do |sender, selector, data|

  end
end #def cmmnd
durch einsetzen in die initialize methode der GUI

Anwendung entsteht das Programm

1
2
3
4
5
6
7
def initialize(app)
  text=Iconv.iconv('utf-8','iso-8859-15','Forum FXRubyTutorial').to_s
  super(app, text, :opts => DECOR_ALL, :width => 850, :height => 600)
  scrn
  cmmnd
  set
end #def initialize
Es entsteht Image:FXRUBY1.JPG