D ile kaynak kullanımı

D ile kaynak kullanımı

Giriş

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.

Basit pencere tasarımı

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>

D kullanarak pencereye erişmek

Ö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.

D ile kaynak kullanımı

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.

Kaynakları D koduna gömme

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.

Kaynakları uygulamada onaltılı olarak saklamak

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

yorum yaz

Yorum yaz

Henüz yorum yok.