15 Aralık 2009 Salı

WxRuby uygulamanıza sağlam bir temel vermek

Bir WxRuby uygulamasının iki temel parçası vardır, uygulama nesnesi ve üst seviye pencere nesnesi (top level window). Uygulama nesnesi esas çevrim programını barındırır, bu yüzden uygulama nesnesi olmadan bir WxRuby uygulaması olamaz.
Üst seviye pencere ise kullanıcıya sunulacak en önemli kontrolleri ve verileri içerir. Örneğin bir kelime işlemci programında üst seviye pencere hem dökümanı gösterirken aynı zamanda dökümanla ilgili birçok veriyi de barındırır. Aynı şekilde bir web tarayıcının üst seviye penceresi hem sayfayı gösterir hem sayfa hakkında bilgiler barındırır. Aşağıdaki şekil bu iki temel nesnenin birbirleri ve uygulamanın geri kalanıyla bağlantılarını gösterir.

Bu diyagramda da göründüğü gibi uygulama nesnesi ana olay çevrimi ve üst seviye pencereyi içerir. Üst seviye pencere üzerindeki kontrolleri ve iliştirdiğiniz diğer veri nesnelerini içerir. Bu pencere ve içindeki kontroller kullanıcının hareketlerinden olayları tetikler.

Her WxRuby programı bir adet uygulama nesnesi bulundurmalıdır. Uygulama nesnesi Wx::App sınıfının bir oluşumu veya altsınıfıdır. Uygulama nesnesinin esas amacı ana olay çevrimini yönetmektir. Bu olay çevrimi pencere sisteminden gelen olay isteklerini işler ve ilgili olay işleyici rutinlere yönlendirir. Ayrıca bu uygulama nesnesi uygulama geneli nesneler de barındırabilir (veritabanı bağlantıları gibi).

Wx:App alt sınıfını üretmek

Bu altsınıfı üretmek kolay olduğundan ek bir özellik gerekmese bile bu altsınıfı üretmek yapısal olarak doğru olacaktır. Bu altsınıfı üretmek için dört adım yapılır :

  1. Altsınıf tanımlamasını yaparız.

  2. “on_init” metodunu bu tanımlama içine koyarız.

  3. Programımızın ana bölümünde bu sınıfın bir oluşumunu üretiriz.

  4. Bu oluşumun “main_loop” metodunu çağırırız ve kontrol WxRuby'ye geçer.

“on_init” metodu uygulama başlayınca ana çevrime girmeden önce çalışır. Bu metod parametre almaz ve bir bool değer döner. Eğer bu metod false dönerse uygulama hemen sona erer. Tipik olarak on_init metodu içinde enazından bir frame tanımlaması yapılır. Ayrıca bu frame'in show metoduda burda olur. Ayrıca bu frame'in uygulamanın üst seviye penceresi olduğunu da set_top_window ile tanıtabiliriz. Üst seviye pencere sahibi tanıtılmamış diyalog pencereleri için default “sahip” tir.

Wx::Frame nesnesi ile çalışmak

WxRuby'de frame kullanıcıların pencere diye isimlendirdiği GUI elemanıdır. WxRuby'de tüm pencerelerin üst sınıfı Wx::Frame dir. Frame altsınıfını üretirken initialize metodu içinde üst sınıf parametreleriyle çağırılır. Bu parametrele şöyledir :

Wx::Frame.new( parent , id , title , pos=DEFAULT_POSITION ,

size=DEFAULT_SIZE , style=DEFAULT_FRAME_STYLE , name=”frame”)

Bir çok kontrol de benzer parametreler alır.



Parametre

Açıklaması

parent

Frame'in içine yerleşeceği yer. Üst seviye pencereler için bu parametre nil değeri alır. Eğer frame bir pencere içine yerleşecekse parent o penceredir. Bu durumda frame parent'in içinde beraber büyüyecek ve hareket edecektir. Parent kapanırsa bu frame de kapanır.

id

Frame kontrolü id numarası. Buraya özel bir sayı girebilirsiniz ya da -1 girerek WxRuby'nin otomatik id üretmesini sağlayabilirsiniz.

title

Frame etiketi. Bir çok stilde frame üst kısmındaki barda gösterilir.

pos

Bir Wx::Point nesnesi boş bırakılırsa işletim sistemi bir yer belirler. Ekranın sol üst köşesi (0, 0) olarak düşünülerek frame'in ekrandaki yerini belirleyebilirsiniz.

size

Bir Wx::Size nesnesi frame'in ilk açılıştaki boyutunu tayin eder. Boş bırakılırsa default bir boyutla açılır.

style

Sabitlerden oluşan bir bitmask. Frame stilini belirler. Stil Sabitleri arasına | (bitwise or) işareti koyarak birçok stil sabiti kullanılabilir.

name

Frame'e verilen dahili isimdir. Daha sonra frame'i bulmak için kullanılabilir.


Frame stilleri sabitlerin birleşmesinden oluşmuştur. Örneğin DEFAULT_FRAME_STYLE şunlardan oluşur :

MAXIMIZE_BOX | MINIMIZE_BOX | RESIZE_BORDER |

SYSTEM_MENU | CAPTION | CLOSE_BOX

Bu birleşik stil içinden bir ya da birkaçını istemezsek özel veya ile çıkarabiliriz :

DEFAULT_FRAME_STYLE ^ ( RESIZE_BORDER | MINIMIZE_BOX | MAXIMIZE_BOX )


Tavsiye edilen üst seviye pencerede default stili kullanmaktır. Böyle olunca kullanıcı hangi pencerenin asıl olduğunu daha rahat anlar.


Stil

Açıklaması

CAPTION

Frame üzerine bir bar ekler buraya frame'in title parametresindeki string yazılır.

CLOSE_BOX

Frame etiket barına bir kapatma düğmesi ekler işletim sisteminden aynı şekliyle pencere kapatma düğmesi eklenir.

DEFAULT_FRAME_STYLE

Yukarda açıklamıştık.

FRAME_SHAPED

Bu stilde olan frame'ler set_shape metoduyla dikdörtgenden başka şekillerde olabilirler.

FRAME_TOOL_WINDOW

Frame'in toolbox penceresi olarak görünmesini sağlar. Daha küçük bir etiket barı olur sadece kapatma düğmesi olur ve görev yöneticide bu pencere görünmez.

MAXIMIZE_BOX

Pencereye tam ekran düğmesi ekler.

MINIMIZE_BOX

Pencereye aşağı küçültme düğmesi ekler.

RESIZE_BORDER

Pencerenin boyutu değiştirilebilir olmasını sağlar.

SIMPLE_BORDER

Gölgelendirmesiz düz ekran her işletim sisteminde çalışmaz.

SYSTEM_MENU

Pencereye system menüsü ekler. İlgili düğmelerin seçilmediği işlemler bu menüden de yaplamaz. (Tam ekran, minimize gibi)




Frame'e Widget Eklemek

Aşağıdaki programda frame ortasında bir buton konmuş ve butona tıklanınca uygulama sona eriyor.



1 #!/usr/bin/env ruby 
2 # Widget.rb Frame'e Buton Eklemek

3

4 require 'rubygems'

5 require 'wx'

6 include Wx

7

8 class InsertFrame < style="color: rgb(0, 0, 255);">
9 def initialize

10 super nil, -1, "Butonlu Frame", :size=>Size.new(300, 100)

11 panel = Panel.new self #1 Panel eklenmesi
12 button = Button.new panel, -1, "Close",
Point.new(125, 25), Size.new(60, 50) #2 Panele buton eklenmesi
13 evt_button(button) {on_close_me} #3 Butona tıklanınca

14 evt_close {on_close_window} #4 pencere kapanınca

15 end
16

17 def on_close_me
18 close

19 end

20

21 def on_close_window
22 destroy

23 end
24 end

25
26 class MyApp < style="color: rgb(0, 0, 255);">
27 def on_init

28 insert_frame = InsertFrame.new

29 insert_frame.show

30 end

31 end

32
33 if __FILE__ == $0
34 my_app = MyApp.new
35 my_app.main_loop

36 end
37

InsertFrame sınıfının iki alt window'u var. İlki panel, bu panel diğer windowları içine yerleştirmek için kullanılır. İkincisi de sıradan bir buton. Bunlar 1 ve 2 işaretli satırlarda gösterilmiştir. Daha sonra 3 nolu işaretli satırda butona tıklanınca çağırılacak kod bloğu tanıtılıyor. 4 nolu işaretli satırda pencere kapatma işlemi çağırılınca uygulmanın kapatılması için gerekli kod bloğu çağırılıyor.

Çoğu durumda frame içinde aynı boyutu kaplayacak bir panel koyarız ve diğer kontrolleri bu panel üzerine yerleştiririz. Ayrıca windows işletim sisteminde frame nesnesinin arkaplan rengi standart dışıdır ve gridir. Rengi beyaz olan bir panel ile daha güzel görüntü olacaktır. Ayrıca panel nesnesi içinde kontroller arasında tab butonu ile ezilebilir ama frame'de bu olmaz. Birçok diğer UI sistemlerde kontrol üretildikten sonra bir insert komutuyla ana taşıyıcıya eklenir. WxRuby de ise sadece kontrol üretilirken parent parmetresine taşıyıcı adı yazılır.

Ayrıca dikkat edersek buton için bir boyut girdik ve konacağı pozisyonu belirttik ama panel için böyle bir tanımlama yapmadık. WxRuby'de bir frame içine tek bir window yerleştirirsek (burada panel yerleştirilmiş, buton panelin içinde) bu window frame içinin tamamına otomatik olarak yayılır ve beraber boyut değiştirir. Panele boyut versek de bir şey değişmeyecekti. Ekrana konan her kontrole bir boyut vermek ve pencere boyutu değiştirilince olacaklara hükmetmek için rutinler yazmak oldukça zordur. Bunun için Sizer adı verilen nesneler kullanırız ama daha sonra açıklarız nasipse.



Hiç yorum yok:

Yorum Gönder