rubyforen.de
http://forum.ruby-portal.de/

[ Tk ] Einfache Select Box
http://forum.ruby-portal.de/viewtopic.php?f=11&t=35
Seite 1 von 1

Autor:  nilzn [ 06 Dez 2002, 01:42 ]
Betreff des Beitrags:  [ Tk ] Einfache Select Box



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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191

require 'tk'


class TkLayer
attr_writer :x, :y
attr_reader :layer
def initialize( base = nil )
@layer = TkToplevel.new( 'takefocus' => 1 )
@layer.withdraw
@layer.overrideredirect(true)
# Default Position des Layers
if base
@x = TkWinfo.rootx base
@y = TkWinfo.rooty base
else
@x = 80
@y = 80
end
end
# :: PUBLIC METHODS

def hide object = @layer
@layer = object
object.withdraw
end
# :: Show
# Zeigt den 'Layer', mittels deiconify wieder an, und positioniert ihn
def show object = @layer, x = @x, y = @y
@layer = object
object.geometry("+#{ x }+#{ y }")
object.deiconify
end
end



class TkSelectBox
attr_reader:x, :y, :selectBox, :baseFrame, :auswahl
attr_writer :root, :values, :options, :x, :y
def initialize
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :: Public Properties ::
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# uebergebenes Root Fenster
@root = String::new
@values = Array::new
@options = Array::new
@x = 10
@y = 10
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :: Private Properties ::
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@open = false
@baseList = String::new
@pfeilbutton = String::new
@auswahl = String::new
end
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :: PUBLIC METHODS ::
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
def selectBox root = @root, vals = @values, opt = @options, x = @y, y = @x
if root == ''
root = nil
@root = root
else
root.update
end
@root = root
# Frame in der die Listbox liegt
@baseFrame = TkFrame.new( root ).pack
@baseFrame.place( 'x' => x, 'y' => y )
# Anzeige List, eine Zeile
@baseList = TkListbox.new( @baseFrame, *opt).grid( 'colum' => 0, 'row' => 0)
@baseList.height( 1 )
# Listbox Pfeil
# Mit Bild :
#img = TkPhotoImage.new( 'file' => 'pfeil.gif' )
#@pfeilbutton = TkButton.new( @baseFrame, 'image' => img, 'height' => 12 ).grid( 'colum' => 1, 'row' => 0)
# Ohne Bild:
@pfeilbutton = TkButton.new( @baseFrame, 'text' => '.', 'height' => 1 ).grid( 'colum' => 1, 'row' => 0)
# Base Frame neu Zeichnen, um die kordinaten zu bekommen
@baseFrame.update
klappeX = TkWinfo.rootx( @baseFrame ).to_i
klappeY = TkWinfo.rooty( @baseFrame ).to_i
# :: Layer Klasse
# erzeugt ein TopLevel das man verstecken und anzeigen kann
@auswahl = TkLayer.new( @baseFrame )
@auswahl.x = klappeX
@auswahl.y = klappeY + TkWinfo.height( @baseFrame ).to_i
# Initialiesierung der Auswahl Optionen
list = self.setListOptions( @auswahl.layer, 3, vals, opt )
bindCommands()
return [ @baseList, list[0] ]
end
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :: PRIVATE METHODS ::
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# :: setListOptions
# Initialiesierung der Auswahl Options Felder
def setListOptions root, row, vals = [], options = []

# Scrollbar
bar = TkScrollbar.new( root )

# Auswahl ListBox wird erzeugt...
list = TkListbox.new( root, *options ) {
yscrollcommand proc{|first,last| bar.set first,last}
}
# ... und bekommt seine Werte zugewiesen...
vals.each do |val,cmnd|
list.insert( 'end', val )
end
list.pack( 'side' => 'left' )

# Scrollen Initialiesieren
bar.pack( 'side' => 'right', 'fill' => 'y' )
bar.command(proc { |args|
list.yview(*args)
})
list.bind( 'MouseWheel',
proc {|args| list.yview( *args ) }
)
list.configure( 'selectmode' => 'single' )
# Auswhal wieder zuklappen wenn man was ausgewaehlt hat
list.bind( 'ButtonRelease-1' ) do |x|
val = list.get( list.curselection )
@baseList.delete( 0, 1 )
@baseList.insert( 0, val )
@baseList.update
self.hide()
@open = false
end
# Damit die Liste + die Scrollbar als Object ansprechbar sind
return [list, bar]
end
# :: show
# Zeigt die Auswahl Optionen
def show
@auswahl.show()
end
# :: hide
# Versteckt die Auswahl Optionen
def hide
@auswahl.hide()
end
# :: bindCommands
# Buttons zum Anzeigen
def bindCommands
@pfeilbutton.command {
if !@open
self.show()
@open = true
else
self.hide()
@open = false
end
}
@baseList.bind( 'ButtonRelease' ) do
if !@open
self.show()
@open = true
else
self.hide()
@open = false
end
end
end
end
r = TkRoot.new( )

r.geometry("+#{ 100 }+#{ 100 }")


sb = TkSelectBox::new


sb.root = r

vals =[ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o','p','q','r','s','t','u','v','w','x','y','z' ]

opt = [ 'height' => 4, 'width' => 20 ]

sb.values = vals

sb.options = opt
sb.selectBox
r.bind( 'Control-w' ) do
r.destroy
end
Tk.mainloop


mit bild als pfeil ( pfeilbutton ) sieht das nartuerlich netter aus,
einfach ein gif 10x8 pixel als pfeil im selben verzabspeichern
und die zwei zeilen im code auskommentieren

mfg

Autor:  leobm [ 16 Dez 2002, 18:09 ]
Betreff des Beitrags: 

komisch.. irgendwie bekomme ich Fehler.. wenn ich Deinen Source Copy/Paste von hier kopiere....Wollte das jetzt mal testen...
Vielleicht Irgendein Problem mit Sonderzeichen ?

Autor:  nilzn [ 16 Dez 2002, 18:32 ]
Betreff des Beitrags:  hmm

kann das hier bei der arbeit grad nich testen, hab grad kein ruby installiert
ich schaus mir heut abend mal an,
iss aber komisch, hab das getestet bevor ich es gepostet hab

ich schau nachher mal
mfg

Autor:  nilzn [ 16 Dez 2002, 22:02 ]
Betreff des Beitrags: 

also bei mir gehts
bei mir gibts ne warnung ( tk.rb:198: default 'to_a' will be obsolete )


ich hab das nicht auf linux getestet

was gibt es denn fuer eine fehlermeldung bei dir?

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/