2008 Ramazan Özel Bölümü

Geri Dön   Forum Ti > Programlama Dilleri ve İnternet > Programlama & Geliştiriciler için
Üye Ol Bloglar Üye Listesi Takvim Forumları Okundu İşaretle

Cevap
 
Konu Araçları
Eski 28.05.2007   #1 (permalink)
 
staticiation  Görüntü Resmi
 
Katılma Tarihi: Şub 2006
Nereden: Bursa/es-es
Yaş: 23
Mesajlar: 1,765
Varsayılan Visual Studio.NET ile Smartphone Sözlük Uygulaması...

Ömer Çolakoğlu tarafından kaleme alınan bu makalede, Visual Studio.NET 2005'in getirdiği yenilikler, smartphone cep telefonu uygulamaları ve örnek ingilizce-türkçe sözlük uygulaması konuları hakkında bilgi sahibi olabileceksiniz...

Merhaba,

.Net ile 2001 yılında tanıştım ve o günden bugüne beni en çok etkileyen iki temel özellik ASP.Net ve özellikle mobil uygulamalar oldu. Bir kaç yıl öncesine kadar bir çoğumuza hayal gibi gelirdi bir cep bilgisayarı ya da cep telefonu üzerinde uygulama geliştirmek. Çünkü bunları yapabilmek için Java ya da C++ ı iyi şekilde bilmek gerekirdi ve bir çok üniversitede de malesef hakkıyla verilmiyor bu diller. Ta ki Microsoft .Net i çıkarana dek. Önce pocket pc 2002 işletim sistemi ile tanıştık. .Net ile compact framework exe leri üretebilir ve bu exe leri pocket pc üzerinde çalıştırabilir olduk. Pocket pc üzerinde database tutabilir hatta xml web servisleri ile çok rahat ve hızlı bir şekilde database server ile haberleştirebilir olduk. Hatta şu an çalıştığım firmada 30 dan fazla pocket pc xml web servisleri ve .Net Compact Framework tabanlı olarak sahada kullanılmakta. Daha sonra Microsoft Smartphone işletim sistemi ile cep telefonu sektörüne de girmiş oldu. İlk olarak Smartphone 2002 işletim sistemi ile tanıştı cep telefonları. Bu işletim sistemi default olarak .Net Compact Framework içermiyordu ve üzerinde C++ ile uygulama geliştirme imkanı sağlıyordu. Dolayısıyla çok yaygınlaşamadı. Ancak Microsoft’un önce üzerinde compact framework default olarak bulunan Windows Mobile 2003 işletim sistemini çıkarması ile sonra da Visual Studio.Net 2005 ile birlikte Vb.Net kullanarak bile doğrudan kolayca smartphone programlayabilir olduk.

Aslında .Net te smartphone da çalışacak uygulama yazmak için ille VS.Net 2005 gerekmiyor. Nitekim ben burda anlatacağım uygulamayı VS.Net 2003 te smart device application olarak yazdım. Bu konuda dikkat edilmesi gereken en önemli nokta smartphone uygulaması yazarken smartphone un desteklediği kontroller kullanmak. Bu konuda bir sıkıntı olmadığı müddetçe benim denemelerim neticesinde bütün pocket pc uygulamaları smartphone 2003 üzerinde direkt olarak çalışıyor. Örnek olarak smartphone da buton kontrolü yok. Çünkü zaten ekranda tıklanacak bir yer yok. Bunun yerine main menu kontrolü kullanabilrsiniz. VS.Net 2005 in en önemli artısı object browser da hangi kontrolleri kullanabileceğinizi görmeniz ve emülatör kullanabilmeniz.



Şekil-1 de görüldüğü gibi VS.Net 2005 ile yeni poje oluşturuken direkt olarak Smartphone 2003 uygulaması seçebiliyorsunuz.



Şekil-2 de görüldüğü gibi VS.Net 2005 te oluşan kullanıcı arayüzü VS.Net 2003 teki gibi sade bir form görünümünde olmayıp doğrudan emülatörün kendisi. Bu da oluşturacağınız formun daha derlemeden (derleme işlemi gerçekten çok sıkıcı) ekran üzerinde nasıl görüneceğini bilmenize olanak sağlıyor. Bunun dışında desteklenen kontrolleri kullanarak smart device application dan farklı olarak hiç bir şey yapmanıza gerek kalmıyor. Programı derliyorsunuz ve smartphone içine kopyalıyorsunuz. Tek yapmanız gereken programı smartphone üzerinden çalıştırmak.



Smartphone üzerinde İngilizce-Türkçe, Türkçe-İngilizce Sözlük Uygulaması

Kendime smartphone işletim sistemli bir telefon aldığımda üzerinde bir takım uygulamalar geliştirmeye karar verdim. Aklıma gelen ilk fikir bir sözlük yazmak oldu. Sonra internetten biraz araştırdıktan sonra bir arkadaşımın da yardımıyla yaklaşık 40 bin kelimelik bir sözlük database i buldum. Bu database de bütün kelimeler bir tabloda tutuluyordu. İlk olarak bu database i xml olarak kaydedip smartphone üzerinde bir dataset oluşturup xmlread() ile okuyup sonra bir dataview oluşturup bu dataview üzerinde filter özelliğini kullanarak arama yapmak istedim. Tahmin edebileceğiniz üzere tablonun hepsini xml olarak yazmak yerine bütün harfler için bir xml dosyası olarak (a.xml,b.xml...) kaydettim ve kullanıcı hangi kelimeyi girdiyse ilk harfine bakıp ona göre xmlread(ilkharf+”.xml”) olarak dataseti doldurdum. Bu şekilde 40 bin kelimelik bir dataseti ortalama 2000 kelimeye düşürmüş oldum. Fakat buna rağmen bir xml dosyasının okunup bir combobox içine doldurulmasının bile yaklaşık 45-60 saniye zaman aldığını gördüm. Zaten daha önceki tecrübelerime dayanarak mobil uygulamlardaki yavaşlığın en büyük nedenlerinden birinin xml dosyayı parse etmek olduğunu biliyorum. Örneğin bir web servisten bir string ifade döndüğünde bu ifadenin alınması ve ekrana yazdırılması işlemi 1 saniyeden az sürerken aynı string ifade tek kolonlu ve tek satırlı bir dataset içinde döndüğünde 2 saniyeden fazla sürüyor. Kayıt sayısı fazla olduğunda bu performans çok daha düşüyor.

Sonuç olarak xml ve dataset kullanmak yerine herhangi bir text dosya kullanmak daha mantıklı geldi. Çünkü bir sözlükte benim aradığım şey sonuçta bir kelimenin karşılığı yani maximum 255 karakter uzunlukta bir string. Bunun bir dataset üzerinde aramaya çalıştığımda “dataset.tables(0).rows(0).items(0).tostring” nesnesini oluşturuyorum. Bu kadar kalabalığa gerek varmı? Sonuçta aradığım alt tarafı bir string. Buradan yola çıkarak bütün harfler için bir text dosya oluşturdum ve girilen kelimenin ilk karakterine göre ilgili dosyayı okutup bir stringe atadım ve bu string üzerinde sıralı arama yaptırdım. Gerçekten çok performanslı çalışıyor. Dosya okuma yaklaşık 1 sn aranılan kelime ile başlayan kelimeleri bulma 1 sn den daha az sürüyor.

Dosya üzerinde arama yapabilmek için çok basit bir yol izledim. Database den SQL ile kelimeye göre sıralı bir sorgu çektim ve satır satır text dosyaya yazdırdım. Yeni bir satırın başlangıcı olarak “{“, bitişi olarak “}” işaretini kullandım. Türkçe kelimenin karşılığı olarak ingilizce kelimenin başlangıç noktasına “#” karakterini kullandım.

...

{abartili#exaggerated.}

{abartilmak#to be exaggerated.}

{abartma#exaggeration, overstatement.}

{abartmaci#1. habitually exaggerating. 2. exaggerator.}

{abartmacilik#the habit of exaggerating.}

{abartmak#/i/ to exaggerate.}

{abartmali#exaggerated.}

.....

Bu kadar girişten sonra artık programı yazma zamanıdır herhalde.

Bunun için eğer VS.Net 2005 kullanıyorsanız yeni bir smartphone application oluşturun. Eğer VS.Net 2003 kullanıyorsanız yeni bir smartdevice application oluşturun. Formunuzun üzerine bir text box onun altına bir treeview, onun da altına bir label kontrolü yerleştirin. Eğer formunuzda otomatik olarak menuitem kontrolü oluşmamışsa bir menuitem kontrolü ekleyin ve aşağıdaki gibi menüleri oluşturun. Burada treeview kullanmamızdaki amaç, örneğin elma yazdığınızda elma ile başlayan tüm kelimelerin bir listbox üzerinde göstermek istiyorum fakat smartphone listbox ı desteklemiyor. Ona en yakın kontrol ben treview i seçtim ama siz combobox da kullanabilirsiniz.



Şekil-3 VS.Net 2005 Smartphone Application Şekil-4 VS.Net 2003 SmartDevice Application

Tasarımı bu şekilde gerçekleştirdikten sonra sıra şimdi kod yazmakta.

Namespace ler

Imports System.Drawing

Imports System.IO

Imports System

Programda kullanılacak global değişkenler

Dim ilkHarf As String = "a" 'okunacak dosya adı için kelimenin ilk harfi

Dim str As String = "" 'Okunan dosyanın içeriğinin atandığı string değişken

Dim words(2000) As String 'Treeview e doldurulacak kelime ‘karşılıklarının tutulduğu dizi 2000 değeri rastgele verilmiştir. Dinamik ‘olarak da uzunluğu değişen dizi tanımlanabilirdi.

Dim dil As String = "TR-EN" 'Hangi dilde çeviri yapılacağını belirleyen değişken

Dim klasor As String = "\mounted volume" 'sozluk dosyalarının bulunduğu klasor

Menüler>Başka Kelime

Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click

TextBox1.Text = ""

TextBox1.Focus()

TreeView1.Visible = False

Label1.Visible = False

Update()

End Sub

Menüler>Çıkış

Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

Close()

End Sub

Menüler>Dil Değiştir

Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click

If dil = "EN-TR" Then

dil = "TR-EN"

Text = "TR-İNG SÖZLÜK"

Else

dil = "EN-TR"

Text = "ENG-TR GLOSSARY"

End If

TreeView1.Visible = False

Label1.Visible = False

TextBox1.Text = ""

TextBox1.Focus()

Update()

End Sub

Kelimenin aranması (Textbox1 e aranılacak kelimenin yazılması ve enter tuşuna basılması olayı. Smartphone larda enter tuşu joistick in ortsındaki mavi tuş.)

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown

If e.KeyCode = Keys.Enter Then

bul()

End If

If e.KeyCode = Keys.Down Then

TreeView1.Focus()

End If

End Sub

Kelimeyi bulma ve treeview’a doldurma işlemi

Sub bul()

Dim len As Integer

Dim i As Integer

Dim lindex As Integer = 0 'Last index aranılan kelimenin str içindeki son bulunan pozisyon değeri

Dim findex As Integer = 0 'First index aranılan kelimenin str içindeki ilk bulunan pozisyon değeri

Dim findexNew As Integer = 0

Dim aranan As String = TextBox1.Text

Dim kayit As String = "" 'bulunan kayıt

Dim strtmp As String = str 'aradığımız kelime ile başlayan kelimelerin bulunduğu bölüm dosya içeriğinin filtrelenmiş hali.

Dim tr As String

Dim en As String

Dim diyez As Integer '# karakterinin index numarası

'Her seferinde dosya okumamak için eğer bir sonraki girilen kelimenin ilk harfi bir önceki girilen kelimeninilk harfi ile aynı ise dosya okumuyor yoksa dosya okuyor. Dosya okuma işleminde dosyanın içeriği global değişken olan str’ye atanıyor.

If TextBox1.Text.Substring(0, 1) <> ilkHarf Then

ilkHarf = TextBox1.Text.Substring(0, 1)

dosyaOku(ilkHarf)

End If

'Treeview in içeriği ve aranılan kelimelerin karşılıklarının tutulduğu words dizisi temizleniyor.

TreeView1.Nodes.Clear()

For i = 0 To words.Length - 1

words(i) = ""

Next

TreeView1.Visible = True

TreeView1.Focus()

Update()

strtmp = str

lindex = 0

findex = -2

TreeView1.Nodes.Clear()

While findex <> -1 'aranılan kelime bulunamamıssa -1 değeri dönüyor.

findex = strtmp.IndexOf("{" + aranan)

len = strtmp.Length

If findex = -1 Then

Return

End If

'Aranılan karakter il kez bulunduktan sonra strTmp’ye str nin bu index noktasından sonuna kadar olan kısım olmak üzere değer atanıyor ve bundan sonraki arama işlemi strTmp üzerinde yapılıyor.

strtmp = strtmp.Substring(findex, strtmp.Length - findex - 1)

findex = strtmp.IndexOf("{" + aranan)

If findex = -1 Then

Return

End If

len = strtmp.Length

'Satırın sonu bulunuyor.

lindex = strtmp.IndexOf("}")

If lindex <> -1 And findex <> -1 Then

'Türkçe kelime ve ingilizce karşılığının olduğu bölüm bulunuyor ve kayit değişkenine atanıyor.

kayit = strtmp.Substring(findex, lindex)

'Türkçe ve ingilizce kelimeyi ayıran # karakterinin yeri bulunuyor ve buna göre Türkçe ve İngilizce kelime birbirinden ayrılıyor.

diyez = strtmp.IndexOf("#")

If diyez <> -1 Then

'Eğer # işareti bulunmuşsa Türkçe değişken tr ye ingilizce değişken en ye atanıyor.

words(TreeView1.Nodes.Count) = ""

tr = kayit.Substring(1, diyez - 1)

en = kayit.Substring(diyez, lindex - diyez)

words(TreeView1.Nodes.Count) = Replace(en, "#", "")

End If
TreeView1.Nodes.Add(tr)

'Türkçe kelimeler treeview a ekleniyor. İngilizce karşılıkları da words dizisine atanıyor. Böylece treeview üzerinde yukarı aşağı dolaşırken bu dizinin index numarasına göre karşılığı label üzerinde yazdırabileceğiz.

strtmp = strtmp.Substring(lindex, strtmp.Length - lindex -

End If

End While

End Sub

Dosya Okuma İşlemi

Dosya okurken aslında dosyamızda kelimeler satır satır tutulduğu için readline ile okuyup Türkçe kelimeleri ve ingilizce karşılıklarını birer dizide tutayım rahat rahat çalışayım diye düşünmüştüm ama burada iki sorun çıktı karşıma birincisi readline() çok yavaş ikincisi diziler üzerinde for döngüleri çok yavaş. Dolasyısıyla text dosyalarımız satır satır tutuyor bilgiyi ama bunun bize sağladığı bir avantaj yok şu anda.

Sub dosyaOku(ByVal ilkharf As String)

Dim dosya As String

Text = "yukleniyor...."

Dim i As Integer = 0

If dil = "EN-TR" Then

dosya = klasor + "\sozluk\en2tr\" + ilkharf + ".txt"

Text = "ENG-TR GLOSSARY"

End If

If dil = "TR-EN" Then

dosya = klasor + "\sozluk\tr2en\" + ilkharf + ".txt"

Text = "TR-İNG SÖZLÜK"

End If

Dim sr As StreamReader = New StreamReader(dosya)

str = sr.ReadToEnd

TextBox1.Focus()

End Sub

TreeView ın After Select Olayı

TreeView üzerinde oklarla dolaşırken focuslandığımız kelimenin karşılığını label’a yazdırıyoruz.

Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect

Label1.Visible = TreeView1.Visible()

If TreeView1.Visible = True Then

Label1.Text = words(TreeView1.Nodes(e.Node.Index).Index)

Update()

Dim kelime As String

Try

kelime = TreeView1.SelectedNode.Text

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

End If

End Sub

Ve son olarak sıra programımızı smartphone üzerine deploy etmeye geldi. Ben bütün datalar ve program dosyaları için telefonuma takılı olan sd kartımı kullandım Çünkü yaklaşık 10 mb alana ihtiyacınız var. Bunun için programda sabit olarak tanımladığım klasör değişkenine “\mounted volume\” değişkenini atadım. Böylece ekteki sözlük klasörünü olduğu gibi sd karta kopyalamak ve programın exesini de telefonun herhangi bir yerine kopyalamak yeterli. Sonuçlar aşağıda.



Sağlıcakla…

Ömer Faruk ÇOLAKOĞLU

kaynak:teknohaber.com ömer faruk çolakoğlu
staticiation Şuanda Forumda Değil   Alıntı yaparak cevapla
Cevap


Şu Anda Konuyu İnceleyen Aktif Kullanıcılar: 1 (0 üye ve 1 misafir)
 
Konu Araçları


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Visual Studio Acil Yardim! at-mac Yazılım 6 04.08.2007 03:03
Toshiba G500 Smartphone nefretnet Diğer Markalar 1 13.07.2007 10:00
Visual C#.NET ile Labirent Uygulaması... staticiation Programlama & Geliştiriciler için 0 28.05.2007 20:43
Trade Mal Hesapla Uygulaması Squibb Silkroad Online 0 26.03.2007 17:01
Visual Studio 2005 pro CCCCarpeDiem U-V-W-X-Y-Z 0 08.01.2007 21:02


Şu anki forum saati: 10:47.


cnt hizmet sağlayan firma
ForumTi.com'un yapımı ve yayınlanması CNT'ye aittir.
Sitedeki içerikleri foruma ücretsiz şekilde üye olabilen ziyaretçiler oluşturur. Bu içeriklerin sorumluluğu yazana aittir.
Eğer yasak ve aykırı içerik tespit edilirse site yöneticilerine bu konular bildirilir ve kaldırılır. Site yönetimi haberdar edildiğinde sonuç alınamaz ise servis sağlayıcı CNT'ye bildiride bulunabilirsiniz.
vBulletin® v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Search Engine Friendly URLs by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258