December 30, 2017

Tabi burada da Ali hocanın gösterdiği yöntemi kullanabiliriz.

struct DüğmeBilgisi
{
   string isim;
   uint sıra;
   uint üstboşluk;
   uint genişlik;
   uint yükseklik;
}

DüğmeBilgisi[] düğmeBilgileri =
[
   { "Sil"  , 0, 0, 1, 1 },
   { "Geri" , 1, 0, 1, 1 },
   { "Kapat", 3, 0, 1, 1 },
   { "7"    , 0, 1, 1, 1 },
   { "8"    , 1, 1, 1, 1 },
   { "9"    , 2, 1, 1, 1 },
   { "/"    , 3, 1, 1, 1 },
   { "4"    , 0, 2, 1, 1 },
   { "5"    , 1, 2, 1, 1 }

];

İstersen bu yerleşimi programında kullanabilirsin :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 01, 2018

Nerde kalmıştık..
şimdi Erdem hocam hem bana antreman olsun hemde daha düzgün durduğu için programın görsel halini biraz değiştirip senin verdiğin örneğe benzettim.. Artık son konrolleri yapıp verdiğiniz bilgiler doğrultusunda akış diyagramı yardımıyla bir planlama yapacağım(Aslında yaptım sadece koda dökeceğim).. Buna göre programın son haline yavaş yavaş getiriyorum.. Bu işi bitirip D diline dönmek ve biraz daha ilerlemek istiyorum tabiki D diliyle beraber daha önceden bahsettiğim görsel arayüz ile beraber dosyadan bilgi alma verme vesaire mevzusunuda birlikte götüreceğim kısmetse :blush:
şimdi kod şu halde eh işte işlem yapıyor artık..

// Bu bir hesap makinası çalışmasıdır.. Henüz program çalışma aşamasındadır.
//
// Şu andaki hataları.
// --------------------
// 4 işlem şu an için eh işte çalışmaktadır. ancak henüz son aşamaya gelmemiştir
// Hesap makinası bu haliye sadece tamsayılarda işlem yapmaktadır.
// Hata kontrol mekanizmalarının bazıları programda varmış gibi gözüksede henüz çalışmamaktadır
// Sil, Geri, Kapat ve "," düğmeleri henüz çalışmamaktadır.

import gtk.Main;
import gtk.MainWindow;
import gtk.VBox;
import gtk.Grid;
import gtk.Label;
import gtk.Entry;
import gtk.Button;
import std.stdio : writeln;
import std.string : format;
import std.conv;

class Pencere : MainWindow {
	int rakam1,rakam2,işlem;
	string hafıza1,hafıza2;
   VBox kutu;
   Entry giriş1;
	Grid kalbur;
   Label etiket1;
   Button[] düğmeler;

   this() {
       super("İlkel Hesap Makinası..");

		// düğmelerin isim ve konumlalarını tutan DüğmeBilgisi adında bir yapı tasarlanıyor..
       struct DüğmeBilgisi {
			string isim;
			uint sıra;
			uint üstboşluk;
			uint genişlik;
			uint yükseklik;
       }

		// bu yapıdan düğmeBilgileri adında nesnemizi oluşturuyoruz.
       DüğmeBilgisi[] düğmeBilgileri = [
			{ "Sil"  , 0, 0, 1, 1 },
			{ "Geri" , 1, 0, 1, 1 },
			{ ""	 , 1, 0, 1, 1 },
			{ "Kapat", 3, 0, 1, 1 },
			{ "7"    , 0, 1, 1, 1 },
			{ "8"    , 1, 1, 1, 1 },
			{ "9"    , 2, 1, 1, 1 },
			{ "/"    , 3, 1, 1, 1 },
			{ "4"    , 0, 2, 1, 1 },
			{ "5"    , 1, 2, 1, 1 },
			{ "6"	 , 2, 2, 1, 1 },
			{ "*"	 , 3, 2, 1, 1 },
			{ "1"	 , 0, 3, 1, 1 },
			{ "2"	 , 1, 3, 1, 1 },
			{ "3"	 , 2, 3, 1, 1 },
			{ "-"	 , 3, 3, 1, 1 },
			{ "0"	 , 0, 4, 1, 1 },
			{ ","	 , 1, 4, 1, 1 },
			{ "="	 , 2, 4, 1, 1 },
			{ "+"	 , 3, 4, 1, 1 },
		];

		// Görsel bileşenlerin nesnelerini oluşturuyoruz
       kutu = new VBox(false, 2);
       kalbur = new Grid();
       giriş1 = new Entry();

		// düğmeler nesnelerimizi oluşturup düğme isimlerini bunlara atıyoruz Ayrıca düğmeleri ekrana, daha önceden
		// tanımladığımız düğmeBilgileri yapısına göre yerleştiriyoruz..
       foreach (d; düğmeBilgileri) {
           düğmeler ~= new Button(d.isim);
           kalbur.attach(düğmeler[$-1], d.sıra, d.üstboşluk,d.genişlik,d.yükseklik);
			düğmeler[$-1].addOnClicked(&işle);
       }

       // Bileşen Ayarları..
       setSizeRequest(250, 230);
       move(200, 120);
       giriş1.setAlignment(1);
		kalbur.setRowHomogeneous(true);
       kalbur.setColumnHomogeneous(true);
		kutu.packStart(giriş1, false, false, 0);
       kutu.packEnd(kalbur, true, true, 0);

		// görsel bileşenleripenceremize ekleyip tümünün ekranda görünmesini sağlıyoruz
       add(kutu);
       showAll();

		// Herhangi bir tıklama olduğunda &işle işlevine yönlendirme yapılıyor..
       düğmeler[1].addOnClicked(&işle);
   }


	// Bu işle işlevinde tıklanan düğme sayımı değilmi işlemleri yapılır ve giriş kutusuna gelen değerler yan yana eklenerek yazılır..
   void işle(Button düğme) {
		if(düğme.getLabel()=="+"
		   ||düğme.getLabel()=="-"
		   ||düğme.getLabel()=="*"
		   ||düğme.getLabel()=="/"
		   ||düğme.getLabel()=="="
		   ||düğme.getLabel()=="Sil"
		   ||düğme.getLabel()=="Geri"
		   ||düğme.getLabel()=="Kapat"
		   ||düğme.getLabel()==""
 		   ||düğme.getLabel()==",")
		{
			işlemYap(düğme); // tıklanan düğme bir sayıyı temsil etmiyor ise(+ - * / gibi) işlemYap() işlevini çalıştır...
		}

		// tıklanan düğme sayı ise bir önceki sayıya eklenerek yola devam edilir..
       else {
           writeln("Tıklama oldu",düğme.getLabel());  // Kontrol...
           auto ekran = giriş1.getText();
           giriş1.setText(ekran ~ düğme.getLabel());
           try {
               int ilk = to!int(giriş1.getText());
               giriş1.setText(to!string(ilk));
           } catch (ConvException hata) {
               // Hatayı bildiriyoruz
               etiket1.setLabel("HATA: tamsayı girmelisiniz");
               writeln("Uyarı!! Hata fırlatıldı!!");

           } catch (Exception hata) {
               // Başka çeşit bir hata oluştu
               etiket1.setText(format("HATA: %s", hata.msg));
           }
       }
   }

	  // Bu işlevde  4 işlem ve "=" işlemleri komtrol edilecek böylece 4 işlem yapılabilecek
   void işlemYap(Button düğme) {
       if (rakam1==0) {	// ilk sayımı girildinin kontrolü eğer rakam1=0 ise henüz ilk sayıyı girdik ve ona göre işlem yapıyoruz
			hafıza1=düğme.getLabel();
			writeln("hafıza1",hafıza1);   // Kontrol...
			rakam1=to!int(giriş1.getText());
			giriş1.setText("");
		}

		else  {  // ilk sayı 0 olmadığı için 2.yada daha çok bir sayı girdiğinde burda
			hafıza2=düğme.getLabel();
			writeln("hafıza2",hafıza2);  // Kontrol...
			rakam2=to!int(giriş1.getText());

			switch (hafıza1) {
				case "+":
					writeln("+ Tıklandı");  // Kontrol...
					rakam1+=rakam2;
				break;
				case "-":
					writeln("- Tıklandı");  // Kontrol...
					rakam1-=rakam2;
					break;
				case "*":
					writeln("* Tıklandı");  // Kontrol...
					rakam1*=rakam2;
					break;
				case "/":
					writeln("/ Tıklandı");  // Kontrol...
					rakam1/=rakam2;
					break;
				default:
					break;
			}

			rakam2=0;
			hafıza1=hafıza2;
			giriş1.setText("");

			if (hafıza2=="=") {
				giriş1.setText(to!string(rakam1));
				rakam1,rakam2=0;
				hafıza1,hafıza2="";
			}
		}

       writeln("işlemYap Tıklandı işlem yapıyorum... ilk rakam=",rakam1); // fonksiyonun çalışıp çalışmadığının konrolünü sağlamak için vardır. Program bitimikaldırılacak!
   }
}

void main(string[] args)
{
   Main.init(args);
   Pencere pencere= new Pencere();
   Main.run();
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 01, 2018

Oh be çözümlere bak :-) süper bu bilgiler..

Alıntı (acehreli):

>

işle() işlevinin başındaki uzun if ifadesi yerine şu yöntemi kullanabilirsin:

>     const işlemDüğmeleri = [ "+", "-", "*", "/", "=", "Sil", "Geri", "Kapat", "", "," ];
>     // ...
>     import std.algorithm : canFind;
>     if(işlemDüğmeleri.canFind(düğme.getLabel())) {
>         // ...
>     }
> ```

> Ali
>
Bunu Erdem hocamda dediydi zaten kullanacaktım ama siz hazır lokmayı verdiniz bana  :-p ama çok faydası oldu artık tam olarak anlamış oldum çok güzel bir olanakmış canFind() işlevi..

Alıntı (acehreli):
>
> ...........
> Kodu hemen böyle değiştirmene gerek yok ama aklında bulunsun...
> Ali
>
Ali hocam sonuçta değiştirdikçe gelişimim artıyor hem Erdem Hem de sizin ve söylediğiniz şeyleri uygulayınca aslında bi tık daha ileri gittiğimi hissediyorum.. Gerçi şu an bu kadar karışık ( Elbette size göre değil ama bana göre) bir program olacağını ve bunu başarabileceğimi pek sanmıyordum ama her ikinizin sayesinde çok şeyler öğrendim Allah razı olsun ikinizdende aslında takip eden birileri varsa onlar da buna dahil sonuçta herkesin işi var gücü var katılmamaları ilgilenmedikleri anlamına gelmiyor elbette  :-)

Alıntı (acehreli):
>
> Ek olarak, Düğme kurucusunun sonundaki 'düğmeler[1].addOnClicked(&işle)' ifadesi gereksiz, değil mi? Çünkü aynı ifade az yukarıdaki foreach döngüsünde 1 için zaten işletiliyor.
> Ali
>
Ah evet orda sırıtıp duruyordu farkındaydım ama daha öncede dediğim gibi henüz programın ana hatlarıyla uğraştığımdan şimdilik dokunmamıştım.. şimdi bir el atma vakti geldi sanırım.

Bu arada kafam çok karışıyor herşey iç içe geçmeye başlıyor bu normalmidir bilmiyorum ama mesela son kodları yazarken artık kendimce yaptığım şekilli akış diyagramı planladım yoksa altından kalkamıyorum artık (diktörtgen, dörtgen vesaire şekilli bildiğiniz eski usül akış diyagramı işte)
sevgi ve saygılarımla..

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
January 01, 2018

Gerçekten Ali hoca hoş çözümler göstermiş :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 01, 2018

Alıntı (erdem):

>

Gerçekten Ali hoca hoş çözümler göstermiş :)

Evet ama dediğim gibi sizin kadar uzman olmadığımdan kafam allak bullak oluyor ancak 1 yada 2 günde hazmedebiliyorum :blush:

Bu arada Erdem hocam Benim gelişimimdeki en büyük emekte sizindir lütfen hakkınızı yemeyelim :-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 01, 2018

işle() işlevinin başındaki uzun if ifadesi yerine şu yöntemi kullanabilirsin:

   const işlemDüğmeleri = [ "+", "-", "*", "/", "=", "Sil", "Geri", "Kapat", "", "," ];
   // ...
   import std.algorithm : canFind;
   if(işlemDüğmeleri.canFind(düğme.getLabel())) {
       // ...
   }

Çok daha kısa. ;) (Kapat'tan sonraki boş dizgi doğru mu?)

Ama ondan daha iyisi, düğmelerin tıklandıklarında hangi işlevin işletileceğini de DüğmeBilgisi yapısına eklemek olabilir. Kodda switch gibi deyimler belirdiğinde çoğunlukla bunun gibi yöntemler kullanılabilir.

Öncelikle, Gtkd tarafından herhalde zaten tanımlanmış olan işlev göstergesini bir kere de biz tanımlayalım:

alias Tıklamaİşlevi = void function(Button);
// Anlamı: Parametre olarak Button alan ve hiçbir şey döndürmeyen işlev türüne
//         okunaklı olsun diye Tıklamaİşlevi diyelim...

Artık her düğmenin işlevini düğmeleri tanımlarken belirtebiliriz:

       struct DüğmeBilgisi {
           string isim;
           uint sıra;
           uint üstboşluk;
           uint genişlik;
           uint yükseklik;
           Tıklamaİşlevi işlev;    // <-- EKLEDİM
       }

       DüğmeBilgisi[] düğmeBilgileri = [
           { "Sil"  , 0, 0, 1, 1, &sil },    // <-- İŞLEVLERİ DE BELİRTİYORUZ
           { "Geri" , 1, 0, 1, 1, &geri },
           { ""     , 1, 0, 1, 1, &buNedir }, // :)
           { "Kapat", 3, 0, 1, 1, &kapat },
           { "7"    , 0, 1, 1, 1, &rakam },
           { "8"    , 1, 1, 1, 1, &rakam },
           { "9"    , 2, 1, 1, 1, &rakam },
           // vs.
       ];

Artık addOnClicked için hep işle'yi değil, her düğmenin kendi işlevini vereceğim:

       foreach (d; düğmeBilgileri) {
           düğmeler ~= new Button(d.isim);
           kalbur.attach(düğmeler[$-1], d.sıra, d.üstboşluk,d.genişlik,d.yükseklik);
           düğmeler[$-1].addOnClicked(d.işlev);        // <-- d.işlev OLARAK DEĞİŞTİRDİM
       }

Tabii bütün o işlevleri tanımlamak gerek:

void sil(Button düğme) {
   // Buraya geldiysek "Sil"e basılmış demektir
   // ...
}
void geri(Button düğme) {
   // Buraya geldiysek "Geri"ye basılmış demektir
   // ...
}

// vs.

Kodu hemen böyle değiştirmene gerek yok ama aklında bulunsun...

Ek olarak, Düğme kurucusunun sonundaki 'düğmeler[1].addOnClicked(&işle)' ifadesi gereksiz, değil mi? Çünkü aynı ifade az yukarıdaki foreach döngüsünde 1 için zaten işletiliyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2018

Ali Hocam verdiğiniz bilgiler doğrultusunda kodda denemeler yapmaya başladım.. şu kodda;

import gtk.Main;
import gtk.MainWindow;
import gtk.VBox;
import gtk.Grid;
import gtk.Label;
import gtk.Entry;
import gtk.Button;
import std.stdio : writeln;
import std.string : format;
import std.conv;

class Pencere : MainWindow {
	int rakam1,rakam2,işlem;
	string hafıza1,hafıza2;
   VBox kutu;
   Entry giriş1;
	Grid kalbur;
   Label etiket1;
   Button[] düğmeler;
	alias Tıklamaİşlevi = void function(Button);

   this() {
       super("İlkel Hesap Makinası..");
       struct DüğmeBilgisi {
			string isim;
			uint sıra;
			uint üstboşluk;
			uint genişlik;
			uint yükseklik;
			Tıklamaİşlevi işlev;
		}

			DüğmeBilgisi[] düğmeBilgileri = [
				{ "Sil"  , 0, 0, 1, 1,&Sil},
				{ "Geri" , 1, 0, 1, 1,&Geri},
				{ ""	 , 1, 0, 1, 1,&Boş },
				{ "Kapat", 3, 0, 1, 1,&Kapat },
				{ "7"    , 0, 1, 1, 1,&Rakam },
				{ "8"    , 1, 1, 1, 1,&Rakam },
				{ "9"    , 2, 1, 1, 1,&Rakam },
				{ "/"    , 3, 1, 1, 1,&Bölme },
				{ "4"    , 0, 2, 1, 1,&Rakam },
				{ "5"    , 1, 2, 1, 1,&Rakam },
				{ "6"	 , 2, 2, 1, 1,&Rakam },
				{ "*"	 , 3, 2, 1, 1,&Çarpma },
				{ "1"	 , 0, 3, 1, 1,&Rakam },
				{ "2"	 , 1, 3, 1, 1,&Rakam },
				{ "3"	 , 2, 3, 1, 1,&Rakam },
				{ "-"	 , 3, 3, 1, 1,&Çıkarma },
				{ "0"	 , 0, 4, 1, 1,&Rakam },
				{ ","	 , 1, 4, 1, 1,&Virgül },
				{ "="	 , 2, 4, 1, 1,&Eşittir },
				{ "+"	 , 3, 4, 1, 1,&Toplama },
			];

       kutu = new VBox(false, 2);
       kalbur = new Grid();
       giriş1 = new Entry();
       setSizeRequest(250, 230);
       move(200, 120);
       giriş1.setAlignment(1);
		kalbur.setRowHomogeneous(true);
       kalbur.setColumnHomogeneous(true);
		kutu.packStart(giriş1, false, false, 0);
       kutu.packEnd(kalbur, true, true, 0);

       add(kutu);
       showAll();

       foreach (d; düğmeBilgileri) {
           düğmeler ~= new Button(d.isim);
           kalbur.attach(düğmeler[$-1], d.sıra, d.üstboşluk,d.genişlik,d.yükseklik);
           düğmeler[$-1].addOnClicked(d.işlev);
       }
   }
	void Rakam(Button düğme)  {	}
	void Çıkarma(Button düğme)  {	}
	void Toplama(Button düğme)  {	}
	void Çarpma(Button düğme)  {	}
	void Bölme(Button düğme)  {	}
	void Eşittir(Button düğme)  {	}
	void Sil(Button düğme)  {	}
	void Geri(Button düğme)  {	}
	void Boş(Button düğme)  {	}
	void Virgül(Button düğme)  {	}
	void Kapat(Button düğme)  {	}
}

void main(string[] args)
{
	Main.init(args);
	Pencere pencere= new Pencere();
	Main.run();
}

çalıştığında

main.d(48): Error: cannot implicitly convert expression `&this.Sil` of type `void delegate(Button düğme)` to `void function(Button)`
main.d(49): Error: cannot implicitly convert expression `&this.Geri` of type `void delegate(Button düğme)` to `void function(Button)`
main.d(50): Error: cannot implicitly convert expression `&this.Boş` of type `void delegate(Button düğme)` to `void function(Button)`
..........
.........

türü hatalar alıyorum.. Sizide fazla yük olmama adına sadece buradaki hata bendenmi kaynaklı yoksa "alias Tıklamaİşlevi = void function(Button);" ile "void Sil(Button düğme)" arasında bir sorunmu var ? bunu söylemeniz yeterli eğer hata bende ise büyük ihtimal parametre hatası yapıyorumdur onu mutlaka kendim çözerim..

Birde hocam ısrarla ;

{ ""     , 1, 0, 1, 1, &buNedir }, // :)

diye sormuşsunuz ancak görebildim.. Bu aslında hiçbirşey değil sadece hesap makinasında Grid modülünde boşluk gösteremediğimiz için o bölgeyi boş bir Label olarak tanıttık.. Onu sileceğim sadece şekil olarak kalacak :blush:

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2018

Estağfurullah.

Benim için de programcılık öğrenirken sanırım 2000'li yılların başından beri C Dili Grubundan ddili.org'a gelene kadar Ali hocanın çok yardımı olmuştur.

Allah razı olsun.

Hatta zamanında C++ konusunda yaptığımız hararetli tartışmaların fazlamesai gibi başka sitelere taştığını hatırlıyorum. ;-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2018
   alias Tıklamaİşlevi = void delegate(Button);

olarak değiştirip 'showAll() 'işlevini en sona aldığında sanırım çalışıyor. Örneğin sil işlevine ekrana bir şeyler yazdırarak deneyebilirsin.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2018

tamamdır çalıştı ;-)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]