Bir uygulamanın içindeki kaynaklar neler olabilir;
resimler, müzikler ve yazılar(string). Bu makalede bu tür kaynakların, harici
olarak programımıza nasıl ekleneceğini öğreneceğiz. Derlenmiş bir program
içerisinde bir yazıyı değiştirmek çok zordur. Bu yüzden sonradan değişme
ihtimali bulunan kaynakları yönetmek için .NET platformu bizim için büyük
kolaylıklar sağlamıştır. Bazı durumlarda da programımızın farklı dillerdeki
versiyonları olabilir. Bu durumda her dil için bir string kaynak dosyası(resource
file) hazırlamamız yetecektir.
Bu makalede, .NET ile birlikte gelen ve kaynak dosyaları oluşturmada kullanılan resgen.exe adlı programı, System.Resources isimalanında bulunan ResourceWriter isimli sınıfı, ve bu oluşturulan kaynak dosyaları kullanmak için yine System.Resources isimalanında bulunan ResourceManager adlı sınıflarının kullanımını göreceğiz. Ve tabiki bunları anlatırken basit bir uygulama üzerinden anlatacağım.
Yukarıda da bahsettiğim gibi kaynak dosyalarda resim ve yazılar bulunabilir.İlk adımda basit bir .txt dosyasına istediğimiz yazıları alt alta yazalım. Resgen.exe yardımıyla bu txt dosyasından .NET platformu için özel bir kaynak dosyası oluşturacağız. Yalnız dikkat etmemiz gereken nokta şu : bu şekilde hazırlanacak bir kaynak dosyasına resimleri ekleyemiyoruz. Eğer kaynaklarımız sadece yazılar ise bu yöntemi kullanıyoruz. Eğer kaynak olarak resim eklemek istiyorsak birazdan anlatacağım ResourceWriter sınıfını kullanarak basit bir program yazacağız. Şimdi aşağıdaki terimler.txt dosyasını oluşturun.
Bu makalede, .NET ile birlikte gelen ve kaynak dosyaları oluşturmada kullanılan resgen.exe adlı programı, System.Resources isimalanında bulunan ResourceWriter isimli sınıfı, ve bu oluşturulan kaynak dosyaları kullanmak için yine System.Resources isimalanında bulunan ResourceManager adlı sınıflarının kullanımını göreceğiz. Ve tabiki bunları anlatırken basit bir uygulama üzerinden anlatacağım.
Yukarıda da bahsettiğim gibi kaynak dosyalarda resim ve yazılar bulunabilir.İlk adımda basit bir .txt dosyasına istediğimiz yazıları alt alta yazalım. Resgen.exe yardımıyla bu txt dosyasından .NET platformu için özel bir kaynak dosyası oluşturacağız. Yalnız dikkat etmemiz gereken nokta şu : bu şekilde hazırlanacak bir kaynak dosyasına resimleri ekleyemiyoruz. Eğer kaynaklarımız sadece yazılar ise bu yöntemi kullanıyoruz. Eğer kaynak olarak resim eklemek istiyorsak birazdan anlatacağım ResourceWriter sınıfını kullanarak basit bir program yazacağız. Şimdi aşağıdaki terimler.txt dosyasını oluşturun.
Pointer = Gösterici
Function = Fonksiyon
Array = Dizi
Template = Şablon
Function = Fonksiyon
Array = Dizi
Template = Şablon
yazilar.txt
Şimdi resgen.exe yardımıyla yazilar.txt den yazilar.resources adlı kaynak dosyayı oluşturalım. resgen.exe yi çalıştırmak için Start-> Programs -> Microsft Visual Studio.NET -> Visual Studio.NET Tools -> Visual Studio.NET Command Prompt yolunu kullanabilirsiniz.
Konsol ekranına
resgen yazilar.txt
yazarak yazilar.resources dosyasının oluşmasını sağlayan. yazilar.resources dosyasını bu şekilde kullanabileceğimiz gibi XML formatında bir kaynak dosyası da oluşturabiliriz. Bunun içinde konsol ekranına aşağıdaki komutu yazın.
resgen yazilar.resources yazilar.resx
Kaynak dosyalarının nasıl kullanıldığına geçmeden önce resimlerin de eklenebileceği bir kaynak dosyası hazırlayan bir program yazalım. Bu programda yukarıda da dediğim gibi System.Resources isimalanı altında bulunan ResourceWriter sınıfını kullanacağız. Bunun için aşağıdaki programı yazıyorum.
Şimdi resgen.exe yardımıyla yazilar.txt den yazilar.resources adlı kaynak dosyayı oluşturalım. resgen.exe yi çalıştırmak için Start-> Programs -> Microsft Visual Studio.NET -> Visual Studio.NET Tools -> Visual Studio.NET Command Prompt yolunu kullanabilirsiniz.
Konsol ekranına
resgen yazilar.txt
yazarak yazilar.resources dosyasının oluşmasını sağlayan. yazilar.resources dosyasını bu şekilde kullanabileceğimiz gibi XML formatında bir kaynak dosyası da oluşturabiliriz. Bunun içinde konsol ekranına aşağıdaki komutu yazın.
resgen yazilar.resources yazilar.resx
Kaynak dosyalarının nasıl kullanıldığına geçmeden önce resimlerin de eklenebileceği bir kaynak dosyası hazırlayan bir program yazalım. Bu programda yukarıda da dediğim gibi System.Resources isimalanı altında bulunan ResourceWriter sınıfını kullanacağız. Bunun için aşağıdaki programı yazıyorum.
using System;
using System.Drawing;
using System.Resources;
class Class1
{
static void Main(string[] args)
{
ResourceWriter resw = new ResourceWriter("yazilar2.resources");
Image resim = Image.FromFile("logo.gif");
string anahtar,deger;
{
static void Main(string[] args)
{
ResourceWriter resw = new ResourceWriter("yazilar2.resources");
Image resim = Image.FromFile("logo.gif");
string anahtar,deger;
for(int i=0 ; i<=3 ;
i++)
{
Console.Write("Kaynak için anahtar kelime girin: ");
anahtar = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("Girdiginiz anahtarin degerini girini: ");
deger = Console.ReadLine();
resw.AddResource(anahtar,deger);
}
resw.AddResource("Cslogo",resim);
resw.Close();
}
}
{
Console.Write("Kaynak için anahtar kelime girin: ");
anahtar = Console.ReadLine();
Console.WriteLine();
Console.WriteLine("Girdiginiz anahtarin degerini girini: ");
deger = Console.ReadLine();
resw.AddResource(anahtar,deger);
}
resw.AddResource("Cslogo",resim);
resw.Close();
}
}
Biraz programı açıklamakta fayda var. Visual Studio.NET 'de yeni bir Console Uygulaması açın. Resimlerle iş yapabilmek için daha doğrusu Image sınıfını kullanabilmek için System.Drawing isimalanını eklememiz gerekir. Bunun için Project->Add Reference menüsünü kullanıp System.Drawing.dll i için projemize referans verelim. Kaynak dosyayı oluşturmak için ise System.Resources isimalanında bulunan ResourceWriter sınıfını kullanıyoruz. Programımızın başında yeni bir ResourceWriter nesnesi oluşturuyoruz. Varsayılan yapıcı işlevine ise oluşturacağımız kaynak dosyasının ismini veriyoruz. Daha sonra kaynak dosyasına ekleyeceğimiz bir resim dosyasından Image türünden bir nesne tanımlıyoruz. Yine aynı şekilde Image sınıfının yapıcı işlevine resim dosyasının adını gönderiyoruz. Dosyanın çalışan programla aynı klasör içinde olmasına dikkat edin. Aksi halde FileNotFoundException hatası alırız. Daha sonra bir for döngüsü yardımıyla 4 defa kullanıcıdan kaynak için anahtar ve değer girilmesini istiyoruz. Kaynak dosyasına kaynakları eklemek için ResourceWriter sınıfının overload edilmiş iki üye işlevini kullanıyoruz. Bu iki üye işlevinin prototipi aşağıdaki gibidir.
public void AddResource(string, object); // bu fonksiyonu kaynağa Image nesnesini eklemek için kullanıyoruz.
public void AddResource(string, string); // bu fonksiyonu ise iki string anahtar-değer ikilisini kaynak dosyasına girmek için kullanıyoruz.
Son olarak Close işlevi ile hafızada bulunan bilgiler yazilar.resource dosyasına yazılır. Bu işlevi kullanmadığımızda bilgiler dosyaya kaydedilmeyecektir.
Bu şekilde oluşturduğumuz kaynak dosyasının resgen.exe ile oluşturduğumuzdan tek farklı kaynak dosyasına bir resim bilgisinin binary olarak yerleştirilmesidir. Kaynak dosyası oluşturmanın iki yöntemini gördükten sonra şimdi bu kaynak dosyaları bir uygulamada nasıl kullanacağımızı görelim. Bu amaçla yeni bir Windows Uygulaması başlatalım. Amacımız bir picturebox yardımıyla kaynak dosyadaki binary resim bilgilerini göstermek ve yazıları da bir label kontrolu üzerinde göstermek. Öncelikle Visual Studio.NET 'de bulunan solution explorer penceresinden projemize hazırladığımız kaynak dosyasını eklememiz gerekir. Bunun için solution explorer'daki projemize sağ tıklayıp Add->Add Existing Item 'dan yazilar2.resource adlı kaynak dosyasını seçelim. Bu yöntemle kaynak dosyası projemize Embed Resource olarak eklenecektir. Properties penceresindeki Build Action özelliğini kullanarak bu ayarı değiştirebiliriz. Kaynak dosyasını ekledikten sonra aşağıdaki gibi bir form penceresi tasarlayın. Form üzerine bir picturebox ve 4 tane label kontrolu ekleyin.
private void Form1_Load(object sender, System.EventArgs e)
{
ResourceManager rsm = new ResourceManager("winAppRes.yazilar2",Assembly.GetExecutingAssembly());
pictureBox1.Image = (Image)rsm.GetObject("Cslogo");
{
ResourceManager rsm = new ResourceManager("winAppRes.yazilar2",Assembly.GetExecutingAssembly());
pictureBox1.Image = (Image)rsm.GetObject("Cslogo");
label1.Text = rsm.GetString("Pointer");
label2.Text = rsm.GetString("Function");
label3.Text = rsm.GetString("array");
label4.Text = rsm.GetString("Template");
}
label2.Text = rsm.GetString("Function");
label3.Text = rsm.GetString("array");
label4.Text = rsm.GetString("Template");
}
Yukarıdaki
metotda form1 yüklendiğinde ResourceManager yardımıyla kaynak dosyadaki
bilgileri ,form üzerindeki kontrollere yerleştiriyoruz. Bu kodun çalışabilmesi
için System.Reflection(Assembly sınıfı için) ve
System.Resources(ResourceManager sınıfı için) isimalanlarının projeye using ile
eklenmesi gerekir. İlk olarak o an üzerinde çalışılan assembly için bir
ResourceManager nesnesi oluşturuyoruz. Yeni bir ResourceManager nesnesi oluştururken
ResourceManager 'in yapıcı işlevine kaynak dosyanın projedeki göreceli yolunu
ve o an üzerinde çalıştığımız Assembly nesnesini geçiyoruz. Benim oluşturduğum
projenin ismi winAppRes olduğu için 1. parametre "winAppres.yazilar2"
olmalıdır. (Dikkat edin 1. parametrede kaynak dosyasının uzantısı olan
.resource ekini yazmadık ). 2. parametreye ise Assembly(System.Reflection) sınıfının
statik üye işlevi olan GetExecutingAssembly ile dönen Assembly nesnesini
geçiyoruz. Kaynak dosyasındaki verileri formun üzerindeki kontrollere yerleştirirken
ResourceManager sınıfının iki ayrı üye işlevini kullanıyoruz. Bunlardan
GetObject işlevi ile picturebox 'a kaynaktaki resmi aktarıyoruz. GetObject işlevinin
parametresi kaynak dosyasındaki resime ait verinin anahtar adını geçiyoruz. Hatırlarsanız
kaynak dosyayı oluşturuken resim için "Cslogo" anahtarını kullanmıştık.
GetObject ile geriye dönen nesne object türünden olduğu için resim bilgisini
picturebox 'a yerleştirebilmek için (Image)rsm.GetObject("Cslogo")
ifadesiyle tür dönüşümü yapıyoruz. GetString işlevi ile de kaynak dosyasındaki
yazıları alıyoruz. Bu işlevden geriye dönen değer parametre olarak verilen
anahtara ait string değeri olduğu için label kontrollerinin text özelliğine
atayabiliriz.
Programı derledikten sonra aşağıdaki ekran görüntüsünü elde etmelisiniz.
Programı derledikten sonra aşağıdaki ekran görüntüsünü elde etmelisiniz.
Not : Eğer
kaynak dosyasını resgen.exe ile XML formatında hazırlasaydık yukarıdaki işlemlerin
aynısı yine geçerli olacaktı. Benim tavsiyem kaynak dosyalarını XML formatında
hazırlamanız yönündedir. Hem Visual Studio.NET ortamında kaynak dosyayı daha
rahat düzenleyebilirsiniz hem de XML formatındaki dosyaya istediğiniz
ortamlardan rahatlıkla ulaşabilirsiniz.
Hiç yorum yok:
Yorum Gönder