Yasin DEMİR

#herseypaylasmakicin

———————————————————————————————————

C# da Yemekhane Programı ( REFECTORY 4.13 )

———————————————————————————————————

.

Programı buradan indirebilirsiniz.

PROGRAM HAKKINDA COK KISA BILGILER

Öncelikle programımızın yapım asamasında kullanıcı arayuzu cok sade, anlasılır ve şık bi dizayn yaparak tasarladık.
Butonların uzerlerine yazılar hafif derecede acıklayıcı olarak yapılmıştır.Sebebi hem C# diline yeni başlayanların farklı farklı açıları görebilmesini sağlamak hemde programı kullanacakların bilgisayar yada prog dili bilmiyor olarak dusunulmesidir.Bir baska onemli nokta C# ı yeni ögrenenleri düşünülerek C# daki birçok ogelerin programda kullanılmasıdır.(listview,datagridview,richtextbox,combobox,
radiobutton, checkbox,picturebox vs vs).Buna özellikle dikkat edildi.
Programımız  3 ana işlemden oluşuyor.Bunlar programımızda “Part1,Part2 ve Part3”
olarak acık ve net gosterilmiştir. Ekstra 6 işlem daha katılarak programımız cok fonksiyonlu bir hale getirilmiştir.
– What do you want  (aşçı menuyu hazırlamadan canı ceken bişi varsa once search yapabiliyor.
yemek neyli olsun istegine cevap veriliyor)
– Spices and their properties (aşçı için tum baharatlar ve özellikleri gösteriliyor)
– I’m Feeling Lucky (Programımıza ekstra olarak en güzel fonklarından biri random yemek ve tarifi geliyor)
– The best food of the world’s (dünyanın en guzel yemeklerini sıraladık.malzeme listesini,tarifleri ve resimlerini gösterdik)
– Easy-Medium-Hard-Veteran (Yemekleri zorluk derecelerine göre arama yaptırdık)
– Search meals from the Internet-Google (Aşçı için browser yaptık ve onu nete bagladık)

Ve formlar içinde daha bir çok ufak özellikler.(yapılışları itibariyle)

Şimdi isterseniz kısa kısa formlar üzerinden programımızı anlatalım…

Programımızda tüm formlarda timer tool unu kullanarak effect sağlamış olduk.Herhangi bir form u acarak timer ın kullanımını inceleyebilirsiniz…

Programımızın açılışında bizi Login ekranı karşılıyor. (bkz LoginForm)

Kullanıcı adı ve şifresi kaydedilmiş olan Xml den Login buton una basıldığında veriler check ediliyor dğoru ise izin veriliyor diil ise tejrardan giriş isteniyor..

/*

this.Hide(); // Login e bastığımız da LoginForm u gizledik.
XElement students = XElement.Load(“Users.xml”);

var user = from st in students.Descendants(“user”)
where st.Element(“username”).Value == txtUserName.Text && st.Element(“password”).Value == txtPassword.Text
select new { Username = st.Element(“username”).Value };

if (user.Count() == 0)
{
MessageBox.Show(“wrong Username or password”);

LoginForm lf = new LoginForm();
lf.Show();// Yanlış oldupu takdirde Gizlemiş olduğumuz LoginForm umuzu tekrardan açıyoruz
return;
}

MainForm frm1 = new MainForm();
frm1.Show(); // Doğru olaması durumunda MainForm açılıyor
WelcomeForm wf = new WelcomeForm();
wf.Show(); // Aynı şekilde WelcomeFrom u açılıyor.Ayrıca Welcome Form u için Timer tool unu kullanarak çok güzel bir efect uygulaması yaptık.

*/

Kullanıcı ismi ve şifre kontrolünün ardından Main imiz geliyor.(bkz MainForm)

Account ekleme silme update etmek için bir form oluşturduk buna ulaşmak için sol üst tarafa Account menustrip i koyduk. (bkz. AddAcoountForm)

Ana gövdeye sırasıyla Part1,Part2,Part3 butonları ile bunlara ait formları açtık ve fonksiyonlarını ayarladık.

(bkz FormPart1) Combobox tan yemek seçip yemek malzemelerini miktarlarıyla belirleme silme

/*

Combobox dan seçilmiş yemeği Xml üzerinden silme işlemi

XDocument xmlDoc = XDocument.Load(“Ingredients.xml”);
string a = comboBox1.SelectedItem.ToString();
XElement element = xmlDoc.Root.Elements(“meal”).Where(r => (string)r.Element(“name”) == a).FirstOrDefault();
if (element != null)
element.Remove();
xmlDoc.Save(“Ingredients.xml”);
comboBox1.Items.RemoveAt(comboBox1.SelectedIndex);

*/

ya da baştan yemek ekleme ve silme işlemleriyle yemek tarifleri, yemek pişme süreleri , zorluk derecelerini kayıt altına alma.

XML e veri kaydetme (yemek adı,id si,yemek tarifi,zorluk derecesi,yapım süresi  )(bkz. EatNameAddForm)

/*

XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Ingredients.xml”);
xmlDoc.Root.Add(
new XElement(“meal”,
new XElement(“name”, this.textBox1.Text),
new XElement(“tarif”, this.richTextBox1.Text),
new XElement(“id”, this.textBox2.Text),
new XElement(“level”, this.textBox3.Text),
new XElement(“time”, this.textBox4.Text)

));
xmlDoc.Save(Application.StartupPath + “/Ingredients.xml”);

*/

Part2Form la devam edelim.Burada programı kullanan kullanıcı haftalık yemek programını çok rahatlıkla cıkartabilir.incelediğinizde ne kadar kullanışlı bir yapıda hazırladığımı göreceksiniz.Comboboxdan seçimler konusunda günlerin,öğün ün otomotik olarak değişmesi ile kullanıcımıza hem zaman hem pratiklik kazandırdık.Aynı şekilde seçilen yemeğin içindekileri görerek ona göre portion belirleme yada günlerdeki yada öğündekileri silebilmeside cabası…

/*

if (comboBox1.SelectedIndex == 0)
{

if (comboBox2.SelectedIndex == 0)
{
XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Part2.xml”);
XElement selectedMeal = xmlDoc.Root.Elements(“monday”).Where(r => (string)r.Element(“name”) == cmb).FirstOrDefault();
selectedMeal.Add(
new XElement(“breakfast”,
new XElement(“portion”, textBox1.Text),
new XElement(“name”, this.comboBox3.Text)

));
xmlDoc.Save(Application.StartupPath + “/Part2.xml”);
listViewBreakFastRefresh();  //öğünleri eklediğimizde formda olan listview lerdeki güncelleme fonksiyonunu çağırma
listViewLunchRefresh(); // öğünleri eklediğimizde formda olan listview lerdeki güncelleme fonksiyonunu çağırma
listViewDinnerRefresh();  //öğünleri eklediğimizde formda olan listview lerdeki güncelleme fonksiyonunu çağırma

comboBox2.SelectedIndex = 1; // combobox ın değişimi

*/

ve sırasıyla devam ettiriyoruz.

Örnek olarak listViewDinnerRefresh() fonksiyonu

/*

private void listViewDinnerRefresh()
{
try
{
if (comboBox1.SelectedItem.Equals(“Monday”))
{
XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Part2.xml”);
var meals = from ann in (xmlDoc.Root.Elements(“monday”).Descendants(“dinner”))

select new
{
Name = ann.Element(“name”).Value,
Portion = ann.Element(“portion”).Value,
};

ListViewItem item;

this.listViewDinner.BeginUpdate();
this.listViewDinner.Items.Clear();

foreach (var items in meals)
{
item = this.listViewDinner.Items.Add(items.Name);
item.SubItems.Add(items.Portion);

}
this.listViewDinner.EndUpdate();

}

*/

Part3Form da ise Haftada gün gün (herhangi istediği bir gün) hangi malzeme ne kadar miktarda kullanılmış listview lerde bunu gösteriyoruz.

XML e daha önce kaydetmiş olduğumuz haftalık yemek programızdaki veriler üzerinden hesaplamamızı yapıp listview lere gün gün aktarıyoruz.Biz XML imizi kaydederken öğün öğün veriler kaydettik bnun için burdada öğün öğün bakıp o sekilde hesaplamalarımızı yapıyoruz. ( isim & portion değerler üzerine)

/*

try
{
listView1.Items.Clear();
XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Part2.xml”);
var meals = from ann in (xmlDoc.Root.Elements(“monday”).Descendants(“breakfast”))

select new
{
Name = ann.Element(“name”).Value,
Portion = ann.Element(“portion”).Value,
};

List<string> nameList = new List<string>();
List<double> portionList = new List<double>();

foreach (var items in meals)
{
nameList.Add(items.Name);
portionList.Add(Int32.Parse(items.Portion));
}
var meals2 = from ann in (xmlDoc.Root.Elements(“monday”).Descendants(“dinner”))
select new
{
Name = ann.Element(“name”).Value,
Portion = ann.Element(“portion”).Value,
};

foreach (var items in meals2)
{
nameList.Add(items.Name);
portionList.Add(Int32.Parse(items.Portion));
}

*/

Kullanıcımızı (ahçıyı) internete bağladık.Browser hazırladık. (bkz.GoogleFrom)

Bunun için WebBrowser tool unu kullanıp herhangi bir butona girilecek adresi atamak yeterli.

/*

webBrowser1.Navigate(“www.meals.com”);

*/

Programımızı kullanan kişinin canı domatesli birşey çekiyor ancak aklına direkt yemek ismi gelmiyor mu?  NeyliForm devrede… 🙂

XML den search yaptırıyor ve datagridview de yemekleri listeletiyoruz.Xml den search yapma teknikleri farklı şekillerde yapılabilir. ister direkt kelime üzerinden yapabilir ya da daha kullanışlı olması adına harf harf eleyerek search yapar bu şekilde listeleme yaptırılabilir.Bu tamamen size kalmış. (bkz. NeyliForm)

En hoş özelliklerden biri. I’mFeelingLucky.Form : ) Kullanıcın en ufak bir uğraşa girmeden bir buton a basarak random olarak yemek ismi ve tarifinin Xml den çekilip richtextbox larda gösterimi.

İlk olarak random olarak yemekleri çağırabilmek için yemekleri daha kaydederken herbirine id atadık. Sonrasında bu form da ilk id ile son id yi alarak ikisi arasında random olarak bir değer atamak için random fonksiyonunu kullandık.

/*

Random rnd = new Random();
int a, b, c;

a = Convert.ToInt32(textBox1.Text); // ilk id li yemek
b = Convert.ToInt32(textBox2.Text); // son id li yemek
c = rnd.Next(a, b);  // ikisi arasında random olarak bir sayı ataması ve bunu c variable ına eşitlenmesi
label2.Text = Convert.ToString(c);

*/

Ve sonrasında random atanmış olan değer ile Xml den ki yemek listesindeki id leri kontrol ettirip aynı id li yemegi ve yemek tarifini richtextbox lara çağırdık.

/*
XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Ingredients.xml”);
var meals = from ann in xmlDoc.Descendants(“meal”)

where ann.Element(“id”).Value == label2.Text.ToString()
select new
{
Name = ann.Element(“name”).Value,
Tarif = ann.Element(“tarif”).Value,

};
richTextBox1.Text = “”;
richTextBox2.Text = “”;

foreach (var items in meals)
{
richTextBox1.Text = items.Name;
richTextBox2.Text = items.Tarif;
}

*/

Kullanıcı için tüm baharatları ve  tüm özelliklerini Xml e kaydettik ve comboxdan seçip richtextbox a çağırdık.

Combobox da secilmiş olanın verisini Xml den okumak

/*

XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Spices.xml”);
var spices = from ann in xmlDoc.Descendants(“spice”)
where ann.Element(“name”).Value == comboBox1.Text.ToString()
// where ann.Parent.Element(“name”).Value == comboBox1.Text.ToString()
select new
{
Properties = ann.Element(“properties”).Value,

};
richTextBox1.Text = “”;
foreach (var items in spices)
{
richTextBox1.Text = items.Properties;
}

*/

Dünyanın en güzel yemeklerini  SpecialFoodFrom da gösterdik. (bkz SpecialFoodFrom) Kullanıcı RadioButton da yemeğini seçiyor bununla beraber richtextbox a o yemeğin malzemleri ve tarifi getiriliyor, ayrıca picturebox kullanarakda o yemeğin resmini çağırıyoruz.

/*

if (radioButton12.Checked) // tıklanan radiobutton eğer bu ise
{
XDocument xmlDoc = XDocument.Load(Application.StartupPath + “/Special.xml”);
var specials = from ann in xmlDoc.Descendants(“special”)

where ann.Element(“name”).Value == radioButton12.Text.ToString() // eşit olan yemek isminden
select new
{
Properties = ann.Element(“properties”).Value, // o yemeğin özelliklerini

};
richTextBox1.Text = “”;
foreach (var items in specials)
{
richTextBox1.Text = items.Properties; // o özellikleri yazdırıyoruz…
}
pictureBox1.ImageLocation = “sarma.jpg”; // location ından resmi çağırıyoruz
}

*/

Bir başka özellik daha. Kullanıcının zamanı kısıtlı ya da epey zamanı var. Duruma göre yemeklerin zorluk dereceleri ve yapım sürelerini göz önünde bulundurarak yemek seçimi yapabilmesini sağlıyor. Seçimi yapmadan önceki Checkbox ların ve Datagridview in görünümü;

Seçimi yaptığımızda diğer seçenekleri görünemz kılma ve datagridview e yemek isimleri ve yapım sürelerini çağırıyoruz…

CheckBox seçimi ile diğerlerini görülmemesini sağlamak için

/*

if (checkBox1.Checked)
{
checkBox2.Hide();
checkBox3.Hide();
checkBox4.Hide();
label2.Hide();
label3.Hide();
label4.Hide();
}
else
{
checkBox2.Show();
checkBox3.Show();
checkBox4.Show();
label2.Show();
label3.Show();
label4.Show();
}

*/

Ve  seçimi yapılanların değerini Xml den okuyup Datagridview e çağırmak için

/*

pn = new DataSet();
XDocument xmlDoc = XDocument.Load(“Ingredients.xml”);
var meals = from ann in xmlDoc.Descendants(“meal”)
where ann.Element(“level”).Value == textBox1.Text.ToString()
select new
{
Name = ann.Element(“name”).Value,
Time = ann.Element(“time”).Value,

};
DataTable table = new DataTable();
DataColumn idColumn = table.Columns.Add(“Meal”, typeof(string));
table.Columns.Add(“Make Time”, typeof(string));

foreach (var user in meals)
{
table.Rows.Add(new object[] { user.Name.ToString(), user.Time.ToString() });

}
table.AcceptChanges();
pn.Tables.Add(table);
pn.Tables[0].TableName = “test”;
pn.DataSetName = “tests”;
dataGridView1.DataSource = pn.Tables[0];

*/

Bizden ne istendi bunu FormAboutProject de sizlere taktim ettim.

Genel olarak hafif bir anlatımla programın tanıtımını yapmaya çalıştım. Detaylara girmek epey zor olacaktı açıkçası.Bundan dolayı artık sizin çabanıza ve anlam isteğinize kalıyor bundan sonrası.Herşeyin açık olduğunagüzel bir çalışma olduğuna inanarak faydalanmanızı tavsiye edip kolay gelsin diyorum şimdiden.

Unutmayın programın detaylarında çok şey var, tadını çıkartın : )

İyi günlerde kullanın ve bizi takip etmeye devam edin. Teşekkür ederiz…

Yorumlarınızı bekliyorum…

Yasin DEMİR