|
Mono ile Glade Kullanımı |
|
Gönderiliyor lütfen bekleyin... |
|
|
Mono ile program geliştirirken her şeyi container
kontrollerinin kodları ile geliştirmemiz beklenemez. Zaten böyle bir yaklaşım
hem anlamsız hem de zaman alıcı olur. Bu yüzden Mono ile form uygulamaları geliştiriken
Linux’ta GUI(Graphical Unit Interface)’leri düzenlemek için kullanılan Glade kütüphanelerini
kullanacağız. Şunu kesinlikle aklımızdan çıkarmamalıyız:Eğer Gnome,KDE gibi masaüstü
yöneticilerine görsel program geliştiriyorsak Glade olmazsa olmazlar arasındadır.
Bu yüzden ilk önce Glade’in ne olduğunu incelememiz gerekir.
Glade nedir?
Glade’in logosundan da gördüğünüz gibi gtk+ için
arayüz tasarlamadan bahsediyor. Gtk+ gnome için kullandığımız button, label,
ve window gibi kontrollerden başka bir şey değil. Fakat aklımıza şöyle bir soru
gelebilir. Biz mono’da Gtk# kullanmıyor muyuz? Evet biz mono’da gtk# kullanıyoruz
ama gtk# ,gtk+’dan farklı bir yapı değil. Gtk+’ın gelişmiş bir versiyonu olarak
düşünebiliriz.
Glade’in çalışma mantığı System.Windows.Form
isim uzayının kullanımından biraz farklı. Sonuçta biz windows formu kullandığımız
zaman System.Windows.Form kütüphanesini referans olarak belirtiyoruz. Kullanmak
istediğimiz kontrle ait nesneyi kaynak kod içinde yaratıp kullanıyoruz. Bu gerçekten
kullanım açısından şu andaki en kullanışlı durum. Glade ile arayüzü designer
kısmında tasarladıktan sonra bu arayüzü derliyoruz. Dikkat ederseniz
derliyoruz diyorum, çünkü gtk+ kontrollerinin de bir kaynak kodu var.
Bu kaynak kodlar şu an için C/C++,Ada95, Python & Perl dillerinde mevcut.
Fakat bunların hangi dilde derlendiğinden çok bizim kullandığımız programlama
dilinin glade’e desteğinin olup olmaması önemli. Peki destekten neyi kastediyoruz?
Glade ile derlediğimiz kaynak kodlar kendisine Xml’den oluşmuş bir harita da
oluşturur. Bu harita sayesinde kaynak kodumuz içinde kullandığımız sınıfı üzerinde
serilizasyon işlemi gerçekleştirerek bu işlemi yaparız. Bu serilizasyon işlemini
nasıl gerçekleştiriyoruz dediğinizi duyuyorum. Bunun için mono ile gelen Glade
isim uzayının XML sınıfının autoconnect methodunu kullanarak kolay
bir şekilde gerçekleştiriyoruz. Bu işlemleri adım adım diğer bölümde gerçekleştireceğiz.Burada
önemli olan çalışma mantığını anlamamızdır.
Glade ile Programımızı Geliştiriyoruz:
Eğer kullandığınız linuxta glade yüklü değilse
http://glade.gnome.org/download.html
adresine girerek ücretsiz olarak glade’i elde edebilirsiniz. Glade’i ilk açtıktan
sonra New project kısmını seçip yeni bir proje açalım. Bu ekranda proje tipinin
GTK+ mı yoksa GNOME’mu olduğu sorulmaktadır.
Gtk+ ile uygulama geliştireceğimiz için yeni
bir Gtk+ projesi açalım. Açtığımız projede artık tasarıma başlayabiliriz.Tasarıma
başlamadan önce bir Window eklememiz gerekli. Bunun için palette
menusunden aşağıdaki gibi window ekleyelim.
Bu window’a ekleyeceğimiz her kontrol’ün hizalarını
VBox(vertical box) ve HBox(horizantol box) koyarak ayarlıyoruz. VBox ile dikey
sutunlar, HBox ile yatay satırlar oluşturuyoruz.VBox ve HBox’lar buttonları,
labelleri içerisinde taşıyarak görünümü ayarlamamızı sağlar. VBox’ın ve HBox’ın
özelliklerini rahatlıkla ayarlayabilmemizi sağlayan properties penceresi ise
aşağıdaki gibidir.
Gerekli ekran tasarımını yaptıktan sonra formumuz(yani
window’umuz)aşağıdaki şekli aldı.
Glade ile yazılım geliştirirken en fazla kullandığımız
özelliklerden birisi de sinyaller yani windows’taki adıyla event’ler. Event’leri
de signals kısmından ekleyerek Handler’ımızı ve kullanacağımız olayı ekliyoruz.
Mesela örneğimizdeki button’a clicked eventini aşağıdaki gibi ekliyoruz.
Sinyal eklerken dikkat etmemiz gereken bir nokta
var; eğer eklediğimiz sinyalin handler’ ını kaynak kod içinde bulamazsa uygulama
serilizasyonu tamamlayamadan hata verir. Bu yüzden kullandığımız her sinyalin
mutlaka eventini belirtmemiz gerekir. Evet button’a clicked event’ini de eklediğimize
göre artık geliştirdiğimiz glade uygulamasını derleyebiliriz.
İstersek kaynak kodların hangi dil ile derleneceğini
seçebiliriz. Ama biz burada XML serilizasyonu yapacağımız için glade arayüzünün
kaynak kodları bizi pek ilgilendirmiyor. Derlediğimiz kaynak kodlar beraberinde
bir XML dosyası oluşturuyor demiştik. İşte bu dosya .glade uzantılı dosyadır.
Bu dosya ile serilizasyon işlemini gerçekleştireceğiz. Evet şimdilik glade ile
işimiz bitti. Şimdi monodevelop IDE’mizden bir glade uygulaması açarak programımızın
içini dolduralım.
Monodevelop ile açtığımız glade projesi beraberinde
resource’lara default(varsayılan) bir .glade dosyasını eklemektedir. Bu uygulamayı
derlediğimiz zaman boş bir pencerenin açılacağını görebiliriz. Varsayılan olarak
gelen bu .glade dosyasını kaldırıp yerine daha önce glade ile hazırlayıp derlediğimiz
dosyayı resource dosyalara ekliyoruz.
Evet resource Files kısmına kendi
.glade dosyamızı ekledikten sonra XML serilizasyonunu yapacak kodumuzu inceleyelim.
Bu işlemi Mono’daki Glade isim uzayının metotlarını kullanarak yapacağız. Bunun
için using Glade ifadesini aşağıdaki gibi eklememiz gerekir.
using System;
using Gtk;
using Glade;
public class GladeApp
{
public static void
Main(string[] args)
{
new
GladeApp(args);
}
public GladeApp(string[] args)
{
Application.Init();
Glade.XML gxml=new Glade.XML(null,"makale_glade.glade","window1",null);
gxml.Autoconnect(this);
Application.Run();
}
public void
OnWindowDeleteEvent(object o,DeleteEventArgs args)
{
Application.Quit();
args.RetVal=true;
}
} |
makale_glade.glade arayüzünü kodumuza
bağlarken, Glade isimuzayının XML class’ının resource olarak belirttiğimiz glade
dosyasınının ismini string olarak giriyoruz. Diğer parametreler ise (System.Reflection.Assembly,"glade
ismi.glade","window ismi","belirleyici adres"). Burada
bizim sadece glade ismi yazan kısma kendi glade projemizin ismini girmemiz yeterli.
Daha sonra yarattığımız nesnenin autoconnect metoduna this anahtar kelimesini
parametre olarak vererek bu arayüzü bağlamış oluyoruz. Uygulamayı bu hali ile
derleyip çalıştırırsak aşağıdaki sonuç ile karşılaşırız.
Peki neden hata aldık? Exception(istisna)’ı incelersek
handler bulamadığından bahsetmekte. Hatırlarsanız glade projesini hazırlarken,
buttonun clicked eventine bir metot bağlamıştık. Ama bu event’e ilişkin metodu
kaynak kodumuz içinde belirtmedik. Bu durum XML serilizasyonu sırasında ilgili
event’e ilişkin metot bulunmadığından bir exception oluşmasına neden oldu ve
uygulamamızın çalışması durdu. Bu yüzden aşadaki metodu kaynak kodumuza ekleyerek
bu hatayı önlüyoruz.
void on_OK_clicked(object o,EventArgs args)
{
//kodlar
}
|
Glade ile oluşturduğumuz projede clicked eventi
meydana geldiğinde çalaşacak metodun ismi on_OK_clicked olduğu
için aynı ismi kodumuzda da kullanmak zorundayız. Diyelimki on değilde
On şeklinde bir kullanım yaparsak sonuç olumsuz olacaktır. Kaynak kodumuza
eklediğimiz event’e ilişkin metottan sonra projemizi derledikten sonra aşadaki
gibi bir görüntü elde ederiz.
Evet ,glade ile tasarladığımız arayüzü programımızda
kullanmayı başardık. Diyelim ki isim kısmındaki Entry’den değer almak istersek
bu Entry hangisi gibi bir soru aklımıza gelmesi doğaldır. Bu işlemide serilizasyon
sırasında belirttiğimiz Entry’ler ile sağlıyoruz şöyle ki:
using System;
using Gtk;
using Glade;
public class GladeApp
{
[Widget]Gtk.Button OK;
[Widget]Gtk.Window
window1;
[Widget]Gtk.Entry
entry1;
[Widget]Gtk.Entry
entry2;
public static void Main(string[]
args)
{
new GladeApp(args);
}
public GladeApp(string[]
args)
{
Application.Init();
Glade.XML gxml=new Glade.XML(null,"makale_glade.glade","window1",null);
gxml.Autoconnect(this);
Application.Run();
}
void on_OK_clicked(object o,EventArgs args)
{
window1.Title=entry1.Text+" "+entry2.Text;
entry1.Text="isim windowun başlığında";
entry2.Text="soyad windowun başlığında";
OK.Label="Bitti";
}
}
}
|
Gördüğümüz gibi serilizasyona koyduğumuz widget’lere
niteliklerini kazandırdık. Widget’lerin isimleri glade içinde hazırladığımız
isimler ile aynı olmak zorundadır. Ayrıca glade ile hazırladığımız arayuzde
bulunmayan bir widgeti serilizasyona katarsak bu widgetin nitelik kazanmayacağı
açıktır.
Programın bitmiş kodlarını derleyip çalıştırdığımız
zaman sonuç olarak;
Mono ile Glade’in kullanımı bir hayli kolaylaşmış
durumda.Fakat ilerleyen zamanlarda Glade’in monodevelopa entegrasyonu sağlandığında
daha verimli çalışmasını beklemekteyim.
Makale:
Mono ile Glade Kullanımı Mono - Linux'ta .NET Caner Şahan
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|