D ile kaynak kullanımı
Genel olarak C benzeri diller hoşumuza gidiyor.
Bunlara örnek olarak C++, D, Vala, C# gibi dilleri verebiliriz. Dilin kendi iç olanaklarından çok yazım şekli ile kıyas yapıyoruz.
D de bu dillerden bir tanesidir.
Hatta D konusunda Ali Çehreli Bey tarafından yazılmış Türkçe bir kitap bile var.
Ancak ne yazık ki D diğer diller kadar yaygınlaşamadı.
Diğer taraftan D programlama dilini ciddi olarak kullananlar da var.
Bu derste daha önce Vala kaynak kullanımı dersinde yaptığımız uygulamayı D ile yapmaya çalışacağız.
Daha önce kullandığımız pencere tasarımını rize.glade ismi ile kaydediniz.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkWindow" id="pencere">
<property name="can-focus">False</property>
<property name="title" translatable="yes">Çay</property>
<property name="window-position">center</property>
<property name="default-width">320</property>
<child>
<object class="GtkBox" id="kutu">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="saat">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-top">69</property>
<property name="margin-bottom">69</property>
<property name="label" translatable="yes">00:00</property>
<property name="justify">center</property>
<attributes>
<attribute name="scale" value="5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Öncelikle saatinde isimli bir dizin oluşturalım.
mkdir saatinde
Burada uygulamanın ismi saat idi. Saat ve D birleşince saatde benzeri saatinde olarak uygulama ismini seçtik.
Oluşturduğumuz dizinin içine girelim.
cd saatinde
Bu dizinin içinde iken dub.sdl isimli bir kütük oluşturalım.
name "saatinde"
targetType "executable"
sourcePaths "kaynak"
dependency "gtk-d" version="~>3.11.0"
Burada uygulama ismini ve kaynak dizini belirtiyoruz.
Bu dizinin altında, saatinde isimli dizinin altında kaynak isimli bir dizin oluşturalım.
mkdir kaynak
Bu kaynak dizinin içinde yukarıda paylaştığımız pencere tasarımını rize.glade ile kaydediniz.
Gene kaynak dizininde ana.d isimli bir kütük oluşturalım.
import gtk.Window;
import gtk.Main;
import gtk.Widget;
import gtk.Label;
import gtk.Builder;
abstract class AnaPencere
{
Builder kurucu;
Window pencere;
Label saat;
this()
{
kurucu = new Builder();
kurucu.addFromFile("kaynak/rize.glade");
pencere = cast(Window) kurucu.getObject("pencere");
saat = cast(Label)kurucu.getObject("saat");
pencere.addOnDestroy(delegate void(Widget w) { çıkış(); } );
pencere.showAll();
}
}
class Pencere : AnaPencere
{
this()
{
saat.setLabel("07:10");
}
}
void çıkış()
{
Main.quit();
}
void main (string[] seçenekler)
{
Main.init(seçenekler);
auto anaPencere = new Pencere();
Main.run();
}
Uygulamayı saatinde dizinine gelip dub ile derleyip çalıştıralım.
Uygulama çalıştığında saatin gerçekten değiştiğini görebilirsiniz.

Pencere sınıfında
saat.setLabel("07:10");
bölümünü yorum yaparak
// saat.setLabel("07:10");
ile değiştirir ve dub ile uygulamayı derlerseniz saatin aslında 00:00 olduğunu görebilirsiniz.
Bu yöntemdeki bir eksiklik *.glade uzantılı pencere tasarımı ile uygulamayı farklı yerlere taşırsanız uygulama çalışmayacaktır.
Vala ile kaynakları koda gömebiliyorduk. D ile bu yapılabilir mi?
Evet.
Kaynak dizininde kaynak.d isimli bir kütük oluşturalım.
module kaynak;
string desen = `
<?xml version='1.0' encoding='UTF-8'?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib='gtk+' version='3.24'/>
<object class='GtkWindow' id='pencere'>
<property name='can-focus'>False</property>
<property name='title' translatable='yes'>Çay</property>
<property name='window-position'>center</property>
<property name='default-width'>320</property>
<child>
<object class='GtkBox' id='kutu'>
<property name='visible'>True</property>
<property name='can-focus'>False</property>
<property name='orientation'>vertical</property>
<child>
<object class='GtkLabel' id='saat'>
<property name='visible'>True</property>
<property name='can-focus'>False</property>
<property name='margin-top'>69</property>
<property name='margin-bottom'>69</property>
<property name='label' translatable='yes'>00:00</property>
<property name='justify'>center</property>
<attributes>
<attribute name='scale' value='5'/>
</attributes>
</object>
<packing>
<property name='expand'>False</property>
<property name='fill'>True</property>
<property name='position'>0</property>
</packing>
</child>
</object>
</child>
</object>
</interface>`;
Bu kaynak kütük yukarıdaki pencere tasarımının hemen hemen aynısıdır.
Tek farkla ki çift tırnak işaretlerini " " tek tırnakla ' ' değiştirdik.
kaynak dizinindeki ana.d kütüğünü de aşağıdaki gibi değiştiriyoruz.
import gtk.Window;
import gtk.Main;
import gtk.Widget;
import gtk.Label;
import gtk.Builder;
import kaynak;
abstract class AnaPencere
{
Builder kurucu;
Window pencere;
Label saat;
this()
{
kurucu = new Builder();
kurucu.addFromString(desen);
pencere = cast(Window) kurucu.getObject("pencere");
saat = cast(Label)kurucu.getObject("saat");
pencere.addOnDestroy(delegate void(Widget w) { çıkış(); } );
pencere.showAll();
}
}
class Pencere : AnaPencere
{
this()
{
saat.setLabel("07:10");
}
}
void çıkış()
{
Main.quit();
}
void main (string[] seçenekler)
{
Main.init(seçenekler);
auto anaPencere = new Pencere();
Main.run();
}
Hatta kaynakların D koduna gerçekten gömüldüğünü sınamak için kaynak dizininde bulunan rize.glade kütüğünü sildik ve aynı sonucu aldık.
Bu yöntemin faydalı yönü uygulamayı farklı yerlere kopyalasanız bile kaynaklardan bağımsız olarak çalışacaktır.
D ile sıkıştırılmış bir kütüğü ya da resim dosyasını uygulamada saklayabilirsiniz.
template aktar(string kütükİsmi)
{
private string veriOku()
{
return Base64.encode(cast(ubyte[])import(kütükİsmi));
}
enum aktar = veriOku();
}
template çevir(string veri)
{
private ubyte[] geriÇevir()
{
return Base64.decode(veri);
}
enum çevir = geriÇevir();
}
void main()
{
enum çevrilmiş = aktar!("deb.zip");
writeln(çevrilmiş);
ubyte[] klasörler = çevir!(debianPaketi);
auto kütük3 = File("deb.zip","w");
kütük3.rawWrite(klasörler);
}
Kaynaklar derleyiciye -J seçeneği ile geçilebiliyormuş.
D dilinin paket yöneticisi ayar kütüğü olan dub.sdl kütüğünde aşağıdaki gibi, bir dizini kaynak dizini olarak belirleyebiliyorsunuz.
stringImportPaths "resim"
Yorumlar