|
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
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
|
|
|
|
|
|
|