Forum: Duyurular RSS
D ile görsel programlama
Sayfa:  1  2  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D ile görsel programlama
D ile görsel programlamaya başlangıç için ufak bir ders hazırladım.

D ile pencereli uygulama geliştirme
zafer #2
Üye Tem 2009 tarihinden beri · 695 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Eline sağlık Erdem çok güzel olmuş. Kaynak kodlar bağlantısı çalışmıyor galiba bu bağlantıya tıkladığım zaman hiç bir sayfa açılmadı.

Diğer bir  konu örnek kodlarda keşke orjinal kodları kullansaydın. "pencere" modülü orjinal kodları gizlemiş, öğrenme aşamasında bence bu çok uygun değil. Yinede güzel bir başlanğıç :)
https://github.com/zafer06 - depo
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkür ederim :)

Kaynak kod kısmında sadece kaynak kodun nasıl çalıştığını anlatmaya çalıştım. Kaynak kodu nasıl olsa github'tan indirmişlerdir diye koymadım. Yoksa koysa mıydım acaba.

Aslında Zafer senin söylediğin doğru. Bu haliyle kodların yarısı bir yerde gibi gözüküyor.

Asıl niyetim tamamen Türkçe kodlama yapmaktı.
import std.stdio;
 
import Ana;
import AnaPencere;
import Düğme;
import Olay;
 
class Pencere: AnaPencere
{
    Düğme düğme;
 
    this()
    {
        super("Merhaba Dünya");
        düğme = new Düğme("Bana tıklayın");
        this.ekle(düğme);
        düğme.tıklandığında(&iletiGöster);
        tümünüGöster();
    }
 
    void iletiGöster(Button düğme)
    {
        writeln("Bana tıkladınız");
    }
}
 
void main(string[] çorbalar)
{
    Ana.ilklendir(çorbalar);
    Pencere pencere = new Pencere();
    Ana.çalıştır();
}
Böylelikle yeni başlayan arkadaşlar D'ye daha kolay geçiş yapabilirler diye düşünmüştüm.

Ama şöyle bir durum var ki kaynak kodda ufak bir değişiklik yapıldığı zaman tekrar derlenmesi gerekiyor anladığım kadarıyla. Bu da tahmini yarım saat sürüyor. Eğer böyle olursa pek mümkün görünmüyor.

Bir süredir de bu ağaç görünümü örneği üzerindeki hatayı düzelteceğim diye uğraşıyorum.

Bu şekilde bir işlevi de yeni başlayan arkadaşlar görse ne derler diye merak ediyorum  :-D
 süz.setVisibleFunc(cast(GtkTreeModelFilterVisibleFunc)  &ağacıSüz, cast(void *) this, null);
Bu mesaj erdem tarafından değiştirildi; zaman: 2017-01-17, 00:22.
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Henüz kütüphanenin Türkçeleştirdiğim kısmını yüklemedim. Ama neye benzediğini göstermek için ufak bir örnek paylaşıyorum.
import gtk.Ana;
import gtk.AnaPencere;
import gtk.Kutu;
import gtk.İlerlemeÇubuğu;
import gtk.OnayKutusu;
import gtk.BasÇekDüğme;
import glib.Zamanlama;
 
import std.array;
 
class Pencere: AnaPencere
{
    Zamanlama zamanlama;
    Kutu dikeyKutu;
    İlerlemeÇubuğu ilerlemeÇubuğu;
    OnayKutusu düğme;
    bool işlemDevamEdiyorMu;
 
    this()
    {
        super("İlerleme Çubuğu");
        dışBoşluğuAyarla(10);
 
        dikeyKutu = new Kutu(DİKEY, 6);
        add(dikeyKutu);
 
        ilerlemeÇubuğu = new İlerlemeÇubuğu();
        dikeyKutu.atSepete(ilerlemeÇubuğu, true, true, 0);
 
        düğme = new OnayKutusu("Metni göster");
        düğme.seçildiğinde(&metinSeçildi);
        dikeyKutu.atSepete(düğme, true, true, 0);
 
        düğme = new OnayKutusu("İşlem devam ediyor");
        düğme.seçildiğinde(&işlemDevamEdiyor);
        dikeyKutu.atSepete(düğme, true, true, 0);
 
        düğme = new OnayKutusu("Sağdan sola");
        düğme.seçildiğinde(&sağdanSola);
        dikeyKutu.atSepete(düğme, true, true, 0);
 
        zamanlama = new Zamanlama(50, &ilerle, false);
        işlemDevamEdiyorMu = false;
 
        tümünüGöster();
    }
 
    void metinSeçildi(BasÇekDüğme düğme)
    {
        auto metniGöster = düğme.seçiliOlanıÖğren();
 
        string metin;
 
        if (metniGöster)
            metin = "bir şeyler";
        else
        {
            metin = metin.init;
            assert(metin == null);
 
        }
 
        ilerlemeÇubuğu.metinBelirle(metin);
        ilerlemeÇubuğu.üzerindeMetinGöster(metniGöster);
 
    }
 
    void işlemDevamEdiyor(BasÇekDüğme düğme)
    {
        işlemDevamEdiyorMu = düğme.seçiliOlanıÖğren();
 
        if (işlemDevamEdiyorMu)
            ilerlemeÇubuğu.ilerle();
        else
            // İlerleme çubuğu %0'da iken bu değer 0.0, % 100 iken 1.0
            // oluyor
            ilerlemeÇubuğu.yüzdeyiBelirle(0.0);
    }
 
    void sağdanSola(BasÇekDüğme düğme)
    {
        auto değer = düğme.seçiliOlanıÖğren();
        // İlerleme çubuğu normalde yukarıdan aşağıya ya da soldan sağa
        // hareket ediyor. Yönü değiştirdiğimiz zaman tam ters istikamette
        // hareket ediyor.
        ilerlemeÇubuğu.yönüDeğiştir(değer);
    }
 
    bool ilerle()
    {
        if (işlemDevamEdiyorMu)
            ilerlemeÇubuğu.ilerle();
        else
        {
            auto yeniDeğer = ilerlemeÇubuğu.yüzdeyiÖğren() + 0.01;
            if (yeniDeğer > 1)
                yeniDeğer = 0;
 
            ilerlemeÇubuğu.yüzdeyiBelirle(yeniDeğer);
        }
        return true;
    }
}
 
void main(string[] args)
{
    Ana.ilklendir(değişkenler);
    auto pencere = new Pencere();
    Ana.çalıştır();
}
zafer #5
Üye Tem 2009 tarihinden beri · 695 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Erdem, senden video dersleride bekliyoruz :) Malum görsel programlama anlatıyorsan kodlarla bu iş biraz soyut kalıyor. Şöyle youtube veya vimeoda 1080p video ile kısa zamanda çok daha fazla bilgi aktarabilirsin. Bu arada sese dikkat et bu tür videolarda en önemli etken temiz ve güzel bir ses kaydı.
https://github.com/zafer06 - depo
erdem (Moderatör) #6
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sanırım video dersleri pek olmaz çünkü bilgisayarım biraz eski. Ekran kartının sürücüsü de *.nix altında çok iyi desteklenmiyor.

Bu arada adres biraz değişti :)

http://www.erdem.tk/gtkd/
zafer #7
Üye Tem 2009 tarihinden beri · 695 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
erdem:
Sanırım video dersleri pek olmaz çünkü bilgisayarım biraz eski. Ekran kartının sürücüsü de *.nix altında çok iyi desteklenmiyor.

Bunlara biz Türkçe'de kısaca BAHANE diyoruz Erdem'cim. Böyle güzel bir site hazırlayan, böyle keyifli yazılar yazan benim bildiğim Erdem bunuda pekala yapabilir. Ben inanıyorum ;)
https://github.com/zafer06 - depo
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Geçenlerde Ali beye Emacs d modunda hizalamayla ilgili bir konu soracaktım. Dedim bir ekranı kaydedeyim. İşte sonuç bu  :-D

http://www.erdem.tk/resim/resim/emacs.ogg

Kullandığım bilgisayarda dahili İntel GMA3600 ekran kartı kullanılmış. Intel de bu kartı Linux ortamında desteklemiyor.

NOT SUPPORTED BY THE INSTALLER
Reproduced from the FAQ page:

Due to the complex package dependencies of the binary graphics drivers for the Intel® Graphics Media Accelerator 3600 Series used in the Intel® Atom™ Processor N2600 Series and Intel® Atom™ Processor N2800 Series, supported drivers are only available through your device manufacturer or through Linux distributions providing support for the Intel® GMA 3600.

Daha önceden şu sürücüleri kurmuştum sanırım ama o da Emacs için değişik görünüm efektleri oluşturuyordu hatırladığım kadarıyla.

Belki bu sürücüyü kurunca video kalitesi iyileşebilir. Ama diğer taraftan bu seferde bazı programlar ekran çözünürlüğünü yanlış algılıyordu hatırladığım kadarıyla. Örneğin Arduino geliştirme ortamı.

Sonra çekirdek güncellemesi sırasında uçtu mu sildim mi hatırlamıyorum.

Bir de benim günlük programımda programlamaya nispeten az vakit kalıyor sanırım.

Ama diğer taraftan fansız, sessiz çalışan minik bir bilgisayarım var. Allah'a şükür. Elhamdülillah.

Tam programcı bilgisayarı  ;-)

Güzel yorumlar için teşekkürler :) Tüm bu nimetleri de Cenab-ı Allah'ın (c.c) bir lütfu olarak düşünmek gerekir.

Cenab-ı Rabbül Alemin (c.c) bizlere sayısız nimet ikram buyurmuş. Bunlardan da en büyüğü iman nimeti. Sonra Allah'u A'lem namaz ve Kur'an nimeti. Rabbimiz lütüf ve Keremiyle bizim üzerimizdeki nimeti tamamlayı nasip buyursun inşaAllah.

Bizler sıcak evlerde kalıyoruz, sıcak yemek yiyebiliyoruz. Ama üzerimizdeki bu nimetlerin de hem şükrünü ifa etmek gerekir hem de bu nimetlerin bir sorumluluğu var. Allah'u A'lem yarın bize sorulacak.

Bu nedenle ekmeğimizi imtihan gereği bu nimetlere sahip olamayan Müslüman kardeşlerimizle bölüşmek gerekir. Ülkemizde kafirin zülmünden kaçıp sığınmış Somalili, Iraklı Suriyeli kardeşlerimiz var. Bu soğukta, kışta dışarıda aç bilaç gezen garip kardeşlerimizle ekmeğimizin bir parçasını bölüşmek elimizden gelmiyorsa bir gönül almak gerekmez mi.

Yunus Emre Hazretleri (k.s) ne güzel söylemiş:
Dürüş kazan ye yedir bir gönül ele getir
Yüz Kâbe'den yigrektir bir gönül ziyareti
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Örneklere devam ediyorum.

Biraz kodlar zorlaşıyor mu bilmiyorum ama bir tane örnek paylaşayım dedim. Eğer kodla ilgili önerileriniz, fikirleriniz varsa paylaşabilirsiniz.

İçerisinde çeşitli yazılımların hangi yıl programladığı ve hangi programlama dilleri kullanıldığını gösteren bir kütüğümüz var. veriler.txt

"Firefox", 2002,  "C++",
"Eclipse", 2004, "Java" ,
"Pitivi", 2004, "Python",
"Netbeans", 1996, "Java",
"Chrome", 2008, "C++",
"Filezilla", 2001, "C++",
"Bazaar", 2005, "Python",
"Git", 2005, "C",
"Linux Kernel", 1991, "C",
"GCC", 1987, "C",
"Frostwire", 2004, "Java"

Bu ağaç örneği de seçilen programlama diline göre yazılımları süzüyor.

[Resim: http://www.erdem.tk/resim/resim/agacprogramlamadili.png]

import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.ListStore;
import gtk.TreeView;
import gtk.TreeViewColumn;
import gtk.CellRendererText;
import gtk.TreeModelFilter;
import gtk.Grid;
import gtk.Button;
import gtk.ScrolledWindow;
import gtk.TreeModel;
import gtk.TreeIter;
 
import gobject.Value;
 
import std.format: formattedRead;
import std.stdio: File, writeln;
 
class Pencere: MainWindow
{
    Button[] düğmeler;
    string seçiliProgramlamaDili;
    TreeModelFilter süz;
 
    this()
    {
        super("Ağaç örneği");
        setBorderWidth(10);
        auto ızgara = new Grid();
        ızgara.setColumnHomogeneous(true);
        ızgara.setRowHomogeneous(true);
        add(ızgara);
 
        auto model = new VeriModeli();
 
        seçiliProgramlamaDili = "Hiçbiri";
 
        süz = new TreeModelFilter(model, null);
        süz.setVisibleFunc(cast (GtkTreeModelFilterVisibleFunc) &dilleriSüz,
                           cast(void *)this, null);
 
        auto görünüm = new GörünümModeli(model);
        görünüm.setModel(süz);
        
        string[] programlamaDilleri = ["Java", "C++", "C", "Python", "Hiçbiri"];
 
        foreach (i, dil; programlamaDilleri)
        {
            düğmeler ~= new Düğme(dil);
            düğmeler[i].addOnClicked(&seçimDüğmesiTıklandı);
        }
        
        auto kayarPencere = new ScrolledWindow();
        kayarPencere.setVexpand(true);
        ızgara.attach(kayarPencere, 0, 0, 8, 10);
        ızgara.attachNextTo(düğmeler[0], kayarPencere, GtkPositionType.BOTTOM, 1, 1);
 
        foreach (i, düğme; düğmeler[1..$])
            ızgara.attachNextTo(düğme, düğmeler[i], GtkPositionType.RIGHT, 1, 1);
        kayarPencere.add(görünüm);
 
        showAll();
    }
 
    void seçimDüğmesiTıklandı(Button düğme)
    {
        seçiliProgramlamaDili = düğme.getLabel();
        if (seçiliProgramlamaDili != "Hiçbiri")
            writeln(seçiliProgramlamaDili, " dili seçildi!");
        else
            writeln("Hiç bir dil seçilmedi.");
        süz.refilter();
    }
 
    static extern(C) int dilleriSüz(GtkTreeModel * gtkModeli,
                                    GtkTreeIter * gtkErişici, void * veriler)
    {
        auto model = new TreeModel(gtkModeli, false);
        auto erişici = new TreeIter(gtkErişici, false);
        Pencere pencere = cast(Pencere) veriler;
 
        string dil = model.getValue(erişici, 2).dupString();
 
        if (pencere.seçiliProgramlamaDili == "Hiçbiri")
            return true;
        else
            return dil == pencere.seçiliProgramlamaDili;
    }
}
 
struct Yazılım
{
    string isim;
    uint yıl;
    string dil;
}
 
class VeriModeli: ListStore /* model */
{
    Yazılım[] yazılımlar;
 
    this()
    {
        yazılımOku();
        super([GType.STRING, GType.INT, GType.STRING]);
 
        foreach (yazılım; yazılımlar)
        {
            yazılımEkle(yazılım);
        }
 
    }
 
    void yazılımOku()
    {
        auto kütük = File("veriler.txt", "r");
        foreach (satır; kütük.byLine())
        {
            string isim, dil;
            uint yıl;
            formattedRead(satır,"\"%s\", %d, \"%s\"", &isim, &yıl, &dil);
            yazılımlar ~= Yazılım(isim, yıl, dil);
        }
    }
 
    void yazılımEkle(Yazılım yazılım)
    {
        auto erişici = createIter();
        setValue(erişici, 0, yazılım.isim);
        setValue(erişici, 1, yazılım.yıl);
        setValue(erişici, 2, yazılım.dil);
    }
}
 
class GörünümModeli: TreeView /* görünüm */
{
    this (ListStore model)
    {
        auto isimSütunu = new TreeViewColumn("İsim", new CellRendererText(), "text", 0);
        appendColumn(isimSütunu);
        auto yılSütunu = new TreeViewColumn("Yıl", new CellRendererText(), "text", 1);
        appendColumn(yılSütunu);
        auto dilSütunu = new TreeViewColumn("Dil", new CellRendererText(), "text", 2);
        appendColumn(dilSütunu);
    }
}
 
void main(string[] args)
{
    Main.init(args);
    auto pencere = new Pencere();
    Main.run();
}
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4448 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Güzel. :) Sırf bir şeyler söylemiş olmak için:

  • Düğmeyi ekleyip sonra ekleneni ayarlamak yerine zaten hazır düğme eklemeyi yeğlerim. Yani, şunu değil:
    düğmeler ~= new Düğme(dil);
    düğmeler[i].addOnClicked(&seçimDüğmesiTıklandı);
Şunu yeğlerim:
    düğmeler ~= düğmeYap(dil);

  • Kendi adıma, tek deyim içeren bloklara bile kesinlikle küme parantezi kullanırım.
  • VeriModeli'ndeki bazı üye işlevleri yanılmıyorsam yalnızca kurulumu sırasında kullanılıyor. Dolayısıyla, arayüzünde görünmelerine gerek yok. En basiti, yazılımEkle() ve yazılımOku() this()'in içinde iç işlev olabilirler. Ama daha iyisi, this() parametre olarak Yazılım[] almalı... Böylece "veriler.txt"e bağımlı kalmamış olur. (Örneğin, böylece unittest sırasında dosyaya bağlı kalmadan istediğimizi verebiliriz.) Ek olarak, genel bir ilke olarak, kurucu işlev fazla karmaşık işlemlerle uğraşmamış olur.

Ali
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
En basiti, yazılımEkle() ve yazılımOku() this()'in içinde iç işlev olabilirler. Ama daha iyisi, this() parametre olarak Yazılım[] almalı... Böylece "veriler.txt"e bağımlı kalmamış olur.

Ali bey bu kısmı açabilirmisiniz. yazılımOku() sizce serbest işlev ya da Pencere sınıfının bir üyesi mi olmalı? O zaman MVC tasarımını bozmuş olmaz mıyız. Gerçi kütükten okuma yapma belki veri modelinin içinde olarak düşünülmeyebilir.

İç işleve bir örnek verebilir misiniz.
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4448 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Koda tekrar bakıyorum... Ben olsam, "veriler.txt"i main'e (veya onun çağırdığı bir işleve) okuturum ve Yazılım[] dizisini Pencere.this'e veririm, ve o da VeriModeli'ne geçirir.

Aslında, VeriModeli'ni Pencere'nin oluşturması bile garip değil mi? O zaman bence VeriModeli'ni bile main oluşturmalı ve Pencere'ye onu vermeli.

Dediğim gibi, MVC kullanıcısı değilim ama her şeyin sınıflarla yapılması gerektiğini düşünmüyorum. Örneğin, yazılımlar'ın VeriModeli'nin üyesi olması gerekiyor mu? Sanki yalnızca setValue'ya veriliyor gibiler. (Belki ileride kullanılacaktır ama kodun bu haliyle ilerisi için saklanmasına gerek yok.)

İç işlevler kapsam içlerinde tanımlanan ve o kapsamlardaki değişkenleri kullanabilen işlevlerdir (yapılar ve sınıflar da var):

  http://ddili.org/ders/d/ic_tanimlar.html

Çok yararlı bir olanak.

Ali
erdem (Moderatör) #13
Üye Tem 2009 tarihinden beri · 906 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #10
acehreli:
  • Düğmeyi ekleyip sonra ekleneni ayarlamak yerine zaten hazır düğme eklemeyi yeğlerim.
[...]
    düğmeler ~= düğmeYap(dil);

O zaman bu işlevin de pencere sınıfının işlevleri arasında görünmesine gerek olmayabilir diye düşünüyorum.
class Pencere: MainWindow
{
    /* ... */
 
    this()
    {
        /* ... */
 
        string[] programlamaDilleri = ["Java", "C++", "C", "Python", "Hiçbiri"];
 
        Button düğmeYap(string dil)
        {
            Button düğme = new Düğme(dil);
            düğme.addOnClicked(&seçimDüğmesiTıklandı);
            return düğme;
        }
 
        foreach (dil; programlamaDilleri)
        {
            düğmeler ~= düğmeYap(dil);
        }
 
        /* ... */
 
    }
}
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4448 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bana sorduğuna göre, kendi düşündüğüm gibi yanıtlıyorum: Kesinlikle! Önce normal işlev... Eğer verinin daha sonradan kullanılmak üzere saklanması gerekiyorsa, üye değişken... Eğer işlev veriyle doğrudan ilişkiliyse ve örneğin, Pencere kullanıcısı tarafından çağrılacaksa, bir başka deyişle, onun arayüzünün parçasıysa, ancak o zaman üye işlev...

Ali
acehreli (Moderatör) #15
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4448 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
düğmeYap() bu konuda ilginç çünkü farklı düşünülebilir:

  • Düğmenin nasıl olduğunu program belirliyorsa, yani Pencere'ye ait değilse, normal işlevi main dolaylı olarak çağırabilir.

  • Öte yandan, seçimDüğmesiTıklandı() Pencere'ye bağlı olduğundan burada aslında bu özel pencere tarafıdan oluşturulmalı. O yüzden bence Pencere'de kalması daha doğru.

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Forum: Duyurular RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-08-16, 20:51:13 (UTC -07:00)