Bu yazımda, Twitter‘da arama yapan bir uygulama yazacağım. Siz de yazıyı baştan sona takip ederek, kendi twitter arama uygulamanızı yazabilirsiniz.
Hemen ekran tasarımımızı yapmakla işe başlayalım;
Sayfadaki elemanlar;
Search fonksiyonu geriye JSON formatında bilgi döndürüyor. Uygulamalarınızda JSON verilerini kullanabilmek için, şu sayfadan bulabileceğiniz JSON parser class’ını kullanabilirsiniz.
Şimdi, butonların (btnArama, btnGeri, btnIleri) Click olayını yazalım;
private void btnArama_Click(object sender, EventArgs e) { txtSayfa.Text = “1”; AramaYap(); }</pre>
private void btnGeri_Click(object sender, EventArgs e) { int Sayfa = Convert.ToInt32(txtSayfa.Text) - 1; txtSayfa.Text = Sayfa < 1 ? "1" : Sayfa.ToString(); AramaYap(); }
private void btnIleri_Click(object sender, EventArgs e) { txtSayfa.Text = (Convert.ToInt32(txtSayfa.Text) + 1).ToString(); AramaYap(); }
Butonların Click olaylarının kalbinde AramaYap() methodu yatıyor. Hemen yazalım;
private void AramaYap() { flowLayoutPanel1.Controls.Clear(); WebRequest wr = WebRequest.Create(string.Format("http://search.twitter.com/search.json?q={0}&rpp={1}&page={2}", txtArama.Text, txtSonucAdet.Value, txtSayfa.Text)); Stream s = wr.GetResponse().GetResponseStream(); StreamReader sr = new StreamReader(s); string Sonuc = sr.ReadToEnd(); Hashtable hs = (Hashtable)JSON.JsonDecode(Sonuc); foreach (Hashtable oItem in (ArrayList)hs["results"]) flowLayoutPanel1.Controls.Add(CreateTwitItem(oItem)); }
AramaYap() method’unda ilk iş, flowLayoutPanel’i temizliyoruz.
Daha sonra, Twitter Search API‘den öğrendiğimiz gibi, http://search.twitter.com/search.json adresine uygun parametreler ile sorgu atıyoruz.
Gelen bilgi JSON formatında olduğu için, JSON parser class’ımızı kullanıyoruz (JSON.JsonDecode) ve sonuç bilgisini Hashtable formatına çeviriyoruz.
Hashtable‘ın results öğesi ArrayList formatındadır ve arama sonucunun herbir satırını ifade etmektedir. Bu yüzden basit bir foreach döngüsü ile flowLayoutPanel’e ekleme yapıyoruz.
flowLayoutPanel’e ekleyeceğimiz her nesne CreateTwitItem fonksiyonunda oluşturuluyor;
private Panel CreateTwitItem(Hashtable TwitItem) { Panel p = new Panel(); string from_user = TwitItem["from_user"] != null ? TwitItem["from_user"].ToString() : ""; string to_user = TwitItem["to_user"] != null ? TwitItem["to_user"].ToString() : ""; string text = TwitItem["text"] != null ? TwitItem["text"].ToString() : ""; string profile_image_url = TwitItem["profile_image_url"] != null ? TwitItem["profile_image_url"].ToString() : ""; string tweet_id = TwitItem["id"] != null ? TwitItem["id"].ToString() : ""; DateTime created_at = TwitItem["created_at"] != null ? DateTime.Parse(TwitItem["created_at"].ToString()) : DateTime.Now; string twitter_url = string.Format("http://twitter.com/{0}/statuses/{1}", from_user, tweet_id); p.Size = new Size(flowLayoutPanel1.Width - 23, 60); p.BorderStyle = BorderStyle.FixedSingle; PictureBox pb = new PictureBox(); pb.Dock = DockStyle.Left; pb.Size = new Size(50, 50); pb.BorderStyle = BorderStyle.FixedSingle; pb.Load(profile_image_url); Label l1 = new Label(); l1.AutoSize = false; l1.Location = new Point(pb.Width, 2); l1.Size = new Size(300, 15); l1.Text = string.Format("@{0} -> @{1} ({2} {3})", from_user, to_user, created_at.ToShortDateString(), created_at.ToShortTimeString()); Label l2 = new Label(); l2.AutoSize = false; l2.Location = new Point(pb.Width, 19); l2.Size = new Size(flowLayoutPanel1.Width - pb.Width - 20, 38); l2.Text = text; LinkLabel l3 = new LinkLabel(); l3.Text = "Sayfaya Git"; l3.Location = new Point(flowLayoutPanel1.Width - (l3.Width - 10), 2); l3.Click += delegate { Process.Start(twitter_url); }; p.Controls.Add(pb); p.Controls.Add(l1); p.Controls.Add(l2); p.Controls.Add(l3); p.MouseEnter += delegate { p.BackColor = Color.LightYellow; }; pb.MouseEnter += delegate { p.BackColor = Color.LightYellow; }; l1.MouseEnter += delegate { p.BackColor = Color.LightYellow; }; l2.MouseEnter += delegate { p.BackColor = Color.LightYellow; }; p.MouseLeave += delegate { p.BackColor = SystemColors.Control; }; l2.MouseLeave += delegate { p.BackColor = SystemColors.Control; }; return p; } *CreateTwitItem()* fonksiyonunda bir **Panel** nesnesi oluşturup, içerisine bir picturebox, iki label, bir linklabel ekliyoruz ve geriye Panel nesnesini döndürüyoruz. Böylece foreach'in her adımında flowLayoutPanel'e yeni Panel nesnesi ekleniyor. Uygulamamızı çalıştırıyoruz ve işte örnek ekran görüntüsü; ![TwitterSearch_2](/assets/uploads/2009/12/TwitterSearch_2.png "TwitterSearch_2") İsterseniz uygulamanın kodlarını buradan indirebilirsiniz.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484