December 29, 2017

Çok faydalı oldu Erdem hocam bu yazdıklarınız.. Ali Hocam ve sizin tecrübeerinizin haklı olduklarını hobi olarak yaptığım her kodlama da dahada iyi anlıyorum.. Buton ve parametre olayını da tam olarak anladım bu arada..
şimdilik kod şu şekilde oldu.

import gtk.Main;
import gtk.MainWindow;
import gtk.Layout;
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;
   Layout düzen;
   Entry giriş1,giriş2,giriş3;
   Label etiket1;
   Button[] düğmeler;

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

       struct DüğmeBilgisi {
           string isim;
           int x;
           int y;
       }

       DüğmeBilgisi[] düğmeBilgileri = [
           { "0", 10, 210 },
			{ "1", 10, 165 },
			{ "2", 70, 165 },
			{ "3", 130, 165 },
			{ "4", 10, 120 },
			{ "5", 70, 120 },
			{ "6", 130, 120 },
			{ "7", 10, 75 },
			{ "8", 70, 75 },
			{ "9", 130, 75 },
			{ "+", 190, 75 },
			{ "-", 190, 120 },
			{ "*", 190, 165 },
			{ "/", 190, 210 },
			{ ".", 70, 210 },
			{ "=", 130, 210 },
       ];

       düzen = new Layout(null, null);
       etiket1 = new Label("İLKEL HESAPLAMA YAPIYORUZ..");
       giriş1 = new Entry();

       foreach (d; düğmeBilgileri) {
           düğmeler ~= new Button(d.isim);
           düzen.put(düğmeler[$-1], d.x, d.y);
			düğmeler[$-1].addOnClicked(&işle);
       }

       // Bileşen Ayarları..
       setSizeRequest(250, 275);
       move(300, 200);
       giriş1.setAlignment(1);
       düzen.setSizeRequest(50, 50);
       düzen.put(etiket1, 5, 5);
       düzen.put(giriş1, 10, 25);

       add(düzen);
       showAll();

       düğmeler[1].addOnClicked(&işle);
   }

	void işle(Button düğme) {   // Bu işlevde girilen değerler sayımı değilmi ve giriş kutusuna gelen değerler yan yana eklenerek yazılıyor..
		if(düğme.getLabel()=="+"||düğme.getLabel()=="-"||düğme.getLabel()=="*"||düğme.getLabel()=="/"||düğme.getLabel()=="=") {
			işlemYap(düğme);
		}
		else {
			writeln("Tıklama oldu",düğme.getLabel()); // fonksiyonun çalışıp çalışmadığının konrolünü sağlamak için vardır. Program bitimikaldırılacak!
			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: İki 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));
			}
		}
	}

	void işlemYap(Button düğme) {  // Bu işlevde  4 işlem ve "=" işlemleri komtrol edilecek böylece 4 işlem yapılabilecek


		if (rakam1!=0) {
		    rakam2=to!int(giriş1.getText());
			if (işlem==1) rakam1+=rakam2;
			if (işlem==2) rakam1-=rakam2;
			if (işlem==3) rakam1*=rakam2;
			if (işlem==4) rakam1/=rakam2;

			writeln("şimdi yeni hafıza",rakam1);
			giriş1.setText(to!string(rakam1));
			işlem=0;

			}

		else {
			rakam1=to!int(giriş1.getText());
			giriş1.setText(to!string(""));

			switch (düğme.getLabel()) {
				case "+":
					writeln("+ Tıklandı");
					işlem=1;
					break;
				case "-":
					writeln("- Tıklandı");
					işlem=2;
					break;
				case "*":
					writeln("* Tıklandı");
					işlem=3;
					break;
				case "/":
					writeln("/ Tıklandı");
					işlem=4;
					break;
				case "=":
					writeln("= Tıklandı");
					işlem=5;
					break;
				default:
					break;
			}
		}

		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();
}

bi noktaya geldi ama henüz tam olarak çalışmıyor.. hafta sonunu bekleyemeden birşeyler yaptım.. şimdi ilk rakkam deilde ikinci rakamdan sonra herhangi bir 4 işlem tıklandığında önceki tıklanan ile karışan switch() işlevini düzenleyeceğim.. şu haliyle doğru çalışmıyor ama kafaya taktım bu programı öyle yada böyle bitireceğim :-p Bu arada çok iyileştirme olacak onun farkındayım ancak bi kabasını alayım sonra ince işlerine bakacağım

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

December 29, 2017

Hata mesajını göstermeyi unutmuşsun ;) ama herhalde düğme'nin ne olduğu bilinmiyor, değil mi?

işle() işlevine parametre olarak gelen 'düğme' çağrılan başka her işleve otomatik olarak gitmez. Eğer aynı değişkeni işlemYap() içinde de kullanmak gerekiyorsa işlemYap'ın bir Button alması ve işle'nin de işlemYap'ı buna uygun olarak çağırması gerekir: 'işlemYap(düğme)'

Ali

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

December 29, 2017

Bence şimdilik işlemleri bir tarafa bırak sonra yaparsın.

Bir ipucu daha vereyim. Girilen işlecin türünü anlamak için 'canFind' kullanabilirsin.

import std.stdio;
import std.algorithm;

void main()
{
   auto sayılar = ['0', '1', '2' ];

   if (canFind(sayılar, '1'))
   {
       writeln("Sayıyı buldum");
   }
   else
   {
       writeln("Sayıyı bulamadım");
   }
}

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

December 30, 2017

süper oldu bu :-) Teşekkürler..
işlemleri bi tarafa bırak demişsin Erdem hocam da o zaman ne yapayım peki program bu hale geldi zaten ?

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

December 30, 2017

Erdem Hocam ayrıca söylediğin parçalama işi çok mantıklı.. Ben tek D kodunda bunu anlamış oldum.. Yanlışım varsa düzelt hocam;
Bundan sonraki kodlarda ilk önce yapacağım iş; ne yapacağımı planlamak ardından kabaca bi akış diyagramını kağıda dökmek daha sonra bunları iş parçacıklarına bölerek dediğiniz gibi ayrı ayrı çalıştırarak ve çözümlemek en sonunda da bunları birleştirmek..

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

December 30, 2017

O şekilde de olur. Ben olsam ilkönce basılan tuşun sayı mı işleç mi olduğunu tespit etmeye çalışırdım.

Ama sanırım bir şekilde bu kontrolü yapman gerekebilir. Çünkü gösterdiğin örnekte ilk olarak bir işlece basılırsa hata veriyor.

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

December 30, 2017

Alıntı (erdem):

>

O şekilde de olur. Ben olsam ilkönce basılan tuşun sayı mı işleç mi olduğunu tespit etmeye çalışırdım.

doğru söylüyorsunuz hele bir deneyeyim bir yerlerde tıkanmazsam benimkiyle giderim baktım tıkanmaya başladı o zaman hemen dediğinize dönerim.

Alıntı (erdem):

>

Ama sanırım bir şekilde bu kontrolü yapman gerekebilir. Çünkü gösterdiğin örnekte ilk olarak bir işlece basılırsa hata veriyor.

evet onun farkındayım bilmiyorum forum kirliliğimi yapıyorum adım adım çözdükçe kodu paylaşarak ama program tam bitmediğinden her ne kadar bende bunların farkında olsamda bu hatalar gözükmüş oluyor :-)

Bu arada bu şekilde forumda yarım-pelek programları paylaşıp şimdilik 6 sayfayı işgal etmem normal değilse lütfen hemen uyarın ben kendimi kaptırdım gidiyorum çünkü :-D

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

December 30, 2017

Estağfurullah.

Aynı programı şurada diğer arkadaşlar yazmış olsa farklı çözümler gelebilir.

Ben daha çalışıp çalışmadığını bile bilmiyorum ama o an için aklıma gelen çözüm yoluna göre söyledim.

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

December 30, 2017

Bende buradaki örneği (http://zetcode.com/gui/pygtk/layout/) kullanarak ve tablo yerine kalbur kullanarak bir yerleşim yaptım.

Şuna benzedi :

http://www.programlama.tk/resim/resim/hesapmakinesi.png

Programın kaynak kodu da bu şekilde :

import gtk.Main;
import gtk.MainWindow;
import gtk.VBox;
import gtk.Kalbur;
import gtk.Button;
import gtk.Label;
import gtk.Entry;


class Pencere: MainWindow
{
   VBox kutu;
   Kalbur kalbur;

   this()
   {
       super("Hesap Makinesi");
       setSizeRequest(250, 230);
       setPosition(WindowPosition.CENTER);
       kutu = new VBox(false, 2);

       kalbur = new Kalbur();
       kalbur.setRowHomogeneous(true);
       kalbur.setColumnHomogeneous(true);

       kalbur.iliştir(new Button("Sil"),  0, 0, 1, 1);
       kalbur.iliştir(new Button("Geri"), 1, 0, 1, 1);
       kalbur.iliştir(new Label(""),      2, 0, 1, 1);
       kalbur.iliştir(new Button("Kapat"),3, 0, 1, 1);

       kalbur.iliştir(new Button("7"), 0, 1, 1, 1);
       kalbur.iliştir(new Button("8"), 1, 1, 1, 1);
       kalbur.iliştir(new Button("9"), 2, 1, 1, 1);
       kalbur.iliştir(new Button("/"), 3, 1, 1, 1);

       kalbur.iliştir(new Button("4"), 0, 2, 1, 1);
       kalbur.iliştir(new Button("5"), 1, 2, 1, 1);
       kalbur.iliştir(new Button("6"), 2, 2, 1, 1);
       kalbur.iliştir(new Button("*"), 3, 2, 1, 1);

       kalbur.iliştir(new Button("1"), 0, 3, 1, 1);
       kalbur.iliştir(new Button("2"), 1, 3, 1, 1);
       kalbur.iliştir(new Button("3"), 2, 3, 1, 1);
       kalbur.iliştir(new Button("-"), 3, 3, 1, 1);

       kalbur.iliştir(new Button("0"), 0, 4, 1, 1);
       kalbur.iliştir(new Button(","), 1, 4, 1, 1);
       kalbur.iliştir(new Button("="), 2, 4, 1, 1);
       kalbur.iliştir(new Button("+"), 3, 4, 1, 1);

       kutu.packStart(new Entry(), false, false, 0);
       kutu.packEnd(kalbur, true, true, 0);

       add(kutu);
       showAll();
   }
}

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

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

December 30, 2017

benimkinden daha güzel görünüyor ;-)
peki burada Butonların nesnelerini oluştururken bu butonlara isim vermediğimiz için programın ilerleyen bölümlerinde yapacağımız işlemler için bize sorun çıkarmazmı ? hepsi new ile oluşturulmuş hafızada yer açılmış sadece ? .. Gerçi yukarıdaki mesajlarda yazdığınız gibi hangi tuşa basıldığını artık anlayabilecek bilgiyi almıştım ama ilk bakışta isimsiz hafızada yer açmalar ilerde sanki bana sorun çıkartır gibi geldi bi an .. Yine de böyle bir kullanım tarzı daha sade duruyor bunu itiraf edebilirim :-)

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