Visual FoxPro ya Başlangıç
1 VFP'ya Başlarken
1.1 Standartlarınız Olsun
Hepimiz yazılım yaparken iyi kötü kendimize özgü standartlar oluşturmuşuzdur. Ancak bu standartları yazılı hale getirmek bir kurallar silsilesi oluşturmak için uğraşmamışızdır. Haser Yazılımda bir ekip çalışması yapmak zorunda olduğumuzdan yazdığımız kodların bir başka kişi tarafından anlaşılabilir ve devam ettirilebilir olması gerekmektedir. Aslında bu durum tek başına çalışanlar içinde geçerlidir. Hangimiz önceden yazmış olduğu kodun ne işe yaradığını anlamak için çaba harcamadı. Keşke buraya bir açıklama yazsaydım demedi.
Bu ve birçok önemli sebeplerden dolayı ekip olarak bir yazılım kuralı geliştirdik. Aslında piyasada bilinen birçok kural var ancak bizde kendimize özel kurallar geliştirdik ve geliştirmeye de devam ediyoruz. Burada bu kuralların tamamını yazamam ancak ana hatlarını sizlerle paylaşmak istiyorum.
Ayrıca oluşturacağınız kuralların kesinlikle yazılı olmasını tavsiye ederim. Yazdığınız kodların oluşturmuş olduğunuz kurallara uyup uymadığını kurallarınız oturana kadar kontrol edin. İlk başlarda bu size çok zor evet tekrarlıyorum çok zor gelecek sizi yavaşlatacak ancak lütfen yılmayın bu kurallara alışınca önceden nasıl yazıyormuşum diyeceksiniz.
Aşağıda bu standartları bulacaksınız.
1.1.1 Çalışma Klasörü
Projelerini takip edeceğiniz yöneteceğiniz klasörler oluşturun.
C:
Projeler
A Projesi
B Projesi
Gibi.
En son oluşturduğunuz A Projesi, B Projesi klasörleriniz altına ise şu alt klasörleri oluşturabilirsiniz.
A Projesi
Bmp Programınızda kullanacağınız resim dosyalarınızı koyacağınız klasör
Dokuman İlgili projeyle ilgili dokümanlarınızı koyacağınız klasör
Form Formlarınızı koyacağınız klasör
Menu Menu dosyalarınızı koyacağınız klasör
Rapor Rapor dosyalarınızı koyacağınız klasör
Setup Programın kurulumu oluşturacağınız klasör
Vcx Klaslarınızı koyacağınız klasör
VeriGenel Çok kullanıcılı programlarda kullanacağınız yani ana bilgisayarda yada başka bir bilgisayarda paylaşıma açacağınız veritabanı yada veritabanlarını koyacağınız klasör
VeriLokal Her bilgisayarın sadece kendisinin kullanacağı veritabanı yada veritabanlarını koyacağınız klasör
1.1.2 VFP Ayarları
Çalışmanızı kolaylaştıracak ayarlarınızı yapmalısınız. Bu konuda size şunları tavsiye edebilirim.
1.1.2.1 Seçenekler
Menüden Tools --> Options seçiniz. Açılan pencerede Data sayfasına geliniz. Ignore deleted redords seçeneğiniz işaretleyiniz. Bu sayede tablolarınızdaki silinmiş kayıtları devre dışı bırakmış olacaksınız. File Locations sayfasında Default Directory’yi çalışma yapacağınız projenin klasörünü seçiniz. Örneğin: C:ProjelerA Projesi gibi.
Forms sayfasından ise objelerinizi yerleştirirken size yardımcı olacak olan grid ayarlarınızı değiştirebilirsiniz. Benim tavsiyem 6 pixele 6 pixel. Ayrıca yine bu sayfadan form tasarımın boyutlarını seçebilirsiniz. Bu sayede formunuzun ekran boyutlarından taşıp taşmadığını anlayabilirsiniz. Bu konuda biz 1024x768’i tercih ediyoruz. Ancak unutulmamalıdır ki yapılacak projeye göre bu durum değerlendirilmelidir. Bir form tasarımı yapmak önemli bir olaydır. Formlarınız ne kadar kullanışlı olursa o kadar tutulur. Bir 1024x768 ebatlarında form tasarlayabilmek için sizde ekran ayarlarınızın yüksek çözünürlülükte olması iyi olur. Ben ekran çözünürlülüğümü 1680x1050 kullanıyorum. Tabiî ki bu çözünürlülük için 15” den daha büyük ekran tavsiye ediyorum. Form tasarımlarından bahsederken unutulmaması gereken en önemli nokta formun yüksekliğinin ekran çözünürlülüğün yüksekliğinden daha küçük tasarlanması gerektiğidir. Windows’un başlat çubuğu, formun başlığı, screen’daki menü ve durum çubuğu ekranda bir hayli yer kaplayacaktır. Tabi programınızda bir de araç çubukları kullanırsanız yüksekliğiniz bir hayli düşecektir.
Regional sayfasında Use System Settings’i işareterseniz bilgisayarınızın tarih, saat ve numaralarla ilgili ayarlarını VFP’da kullanacaktır.
Bu yapmış olduğunuz ayarları Set As Default düğmesine basarak kaydedin. Böylece her VFP’yu açtığınızda bu ayarları yapmak zorunda kalmazsınız.
Visual 1.1.2 VFP Ayarları
1.1.2 VFP Ayarları
Çalışmanızı kolaylaştıracak ayarlarınızı yapmalısınız. Bu konuda size şunları tavsiye edebilirim.
1.1.2.1 Seçenekler
Menüden Tools --> Options seçiniz. Açılan pencerede Data sayfasına geliniz. Ignore deleted redords seçeneğiniz işaretleyiniz. Bu sayede tablolarınızdaki silinmiş kayıtları devre dışı bırakmış olacaksınız. File Locations sayfasında Default Directory’yi çalışma yapacağınız projenin klasörünü seçiniz. Örneğin: C:ProjelerA Projesi gibi.
Forms sayfasından ise objelerinizi yerleştirirken size yardımcı olacak olan grid ayarlarınızı değiştirebilirsiniz. Benim tavsiyem 6 pixele 6 pixel. Ayrıca yine bu sayfadan form tasarımın boyutlarını seçebilirsiniz. Bu sayede formunuzun ekran boyutlarından taşıp taşmadığını anlayabilirsiniz. Bu konuda biz 1024x768’i tercih ediyoruz. Ancak unutulmamalıdır ki yapılacak projeye göre bu durum değerlendirilmelidir. Bir form tasarımı yapmak önemli bir olaydır. Formlarınız ne kadar kullanışlı olursa o kadar tutulur. Bir 1024x768 ebatlarında form tasarlayabilmek için sizde ekran ayarlarınızın yüksek çözünürlülükte olması iyi olur. Ben ekran çözünürlülüğümü 1680x1050 kullanıyorum. Tabiî ki bu çözünürlülük için 15” den daha büyük ekran tavsiye ediyorum. Form tasarımlarından bahsederken unutulmaması gereken en önemli nokta formun yüksekliğinin ekran çözünürlülüğün yüksekliğinden daha küçük tasarlanması gerektiğidir. Windows’un başlat çubuğu, formun başlığı, screen’daki menü ve durum çubuğu ekranda bir hayli yer kaplayacaktır. Tabi programınızda bir de araç çubukları kullanırsanız yüksekliğiniz bir hayli düşecektir.
Regional sayfasında Use System Settings’i işareterseniz bilgisayarınızın tarih, saat ve numaralarla ilgili ayarlarını VFP’da kullanacaktır.
Bu yapmış olduğunuz ayarları Set As Default düğmesine basarak kaydedin. Böylece her VFP’yu açtığınızda bu ayarları yapmak zorunda kalmazsınız.
1.1.2.2 Makrolar
Kod yazarken hazır makrolar oluşturabilirsiniz. Bunlar sizin işinizi bir hayli kolaylaştırır. Makro oluşturmak için;
Tools --> Macros seçin. (Bu pencerede işlemlerinizi kayıt düğmesini var ancak ben burada sizlere hazır makroları tanıtacağım)
New Düğmesine basınız.
Seçili satırları 'Comment' yapma (yazının başına *!* koyma)
Defined Key Bölümde F12 düğmesine basınız. Böylece F12 düğmesine bir makro atamış olacağız.
Macro Contents Kısmına {SHIFT+F10}m yazınız.
OK Düğmesinden sonra Set Default düğmesine basınız. Böylece bu macrolarınız her zaman geçerli olur.
Seçili satırları 'UnComment' yapma (yazının başındaki *!* işaretini kaldırma)
Defined Key Bölümde F11 düğmesine basınız. Böyle F11 düğmesine bir macro atamış olacağız.
Macro Contents Kısmına {SHIFT+F10}n yazınız.
OK Düğmesinden sonra Set Default düğmesine basınız. Böylece bu macrolarınız her zaman geçerli olur.
Object List penceresini açma (Form tasarımında kod yazarken Object List açma)
Defined Key Bölümde F10 düğmesine basınız. Böyle F10 düğmesine bir macro atamış olacağız.
Macro Contents Kısmına {SHIFT+F10}j yazınız.
OK Düğmesinden sonra Set Default düğmesine basınız. Böylece bu macrolarınız her zaman geçerli olur.
Projenizi çalıştırma
Programınız eğer ana.prg'den çalışıyorsa;
Defined Key Bölümde F9 düğmesine basınız. Böylece F9 düğmesine bir macro atamış olacağız.
Macro Contents Kısmına {CTRL+F2}do{SPACEBAR}ana.prg{ENTER} yazınız.
OK Düğmesinden sonra Set Default düğmesine basınız. Böyle bu macrolarınız her zaman geçerli olur.
1.1.3 Kodlama Standartları
Kodlama standartları tüm standartlar arasında en önemlisidir. Bu konuyla ilgili olarak kabaca şunları söyleyebilirim. Burada söyleyeceklerim bizim standartlarımızın temelleridir.
1.1.3.1 Yazma Standardı
- Komut yazımlarında her kelimenin baş harfi büyük yazılmak zorundadır.
Örneğin: THISFORM yerine ThisForm. Bu kullanım için IntelliSense Manager’in ayarlanması gerekmektedir. Tools-->IntelliSense Manager’i seçin. Açılan menüden FoxCode Default’u No auto-expansion seçiniz. Functions ve Commands seçeneklerini ise Use FoxCode Default olarak seçiniz.
- Lokal kullanılacak bütün değişkenler Local komutunu ile tanımlanmak zorundadır.
Bu noktada şöyle düşünebilirsiniz yazmış olduğun procedure içinde hiçbir yere dallanma yok ve eminim ki bu değişkenler başka bir yerde de kullanılmamaktadır ve kullanılmayacak o yüzden Local komutu ile uğraşmamın ne anlamı var ki. Evet belki de bunu düşündüğünüz an için bu durum doğrudur. Ancak aradan zaman geçip de kodu unuttuktan sonra yada bir başkası sizin yazmış olduğunuz kodu değiştirdiğinde yada kodda bir dallanma yaptığınızda local olarak tanımlamadığınız değişkenler sorun yaşama olasılığınız yükselir. Böyle bir durumda sorunu test aşamasında yakalama olasılığınız ise çok düşüktür. Ancak kullanıcılardan size verilerinde bir tuhaflık olduğu bilgisi geldiğinde uzun bir araştırmadan sonra hatayı bulma olasılığınız var. Bu durumu özellikle yeni başlayanlar için detaylı açıklamak istiyorum.
Local ya da public olarak tanımlanmayan (bir tanım yapılmadan kullanılan) tüm değişkenler Private değişken tipinde oluşturulur. Bu şu anlama gelmektedir. Bu değişken tanımlandığı procedure ve procedureden çağrılan tüm alt procedure’lerde kullanılabilir demektir. Bu işlem bilinç bir şekilde yapılmadığı takdirde büyük sorunlara yol açabilir. Bu durumu bir örnekle açıklamak gerekirse;
Procedureleriniz içinde kullandığınız bütün değişkenlerini kesinlikle tanıtınız. Local olarak tanımlanmış değişkenler sadece o procedure için geçerli olurlar. Bunu bir örnekle açıklayalım.
Local'siz
*!* *************************************************
m.lnI = 1
m.lnI = m.lnI + 1
MessageBox(Transform(m.lnI)) && 2 görünür
Do Deger
MessageBox(Transform(m.lnI)) && 5 görünür
Return
Procedure Deger
m.lnI = 1
For m.ln = 1 To 5
Wait Window Transform(m.lnI) NoWait
EndFor
Return
*!* *************************************************
Yukarıdaki örnekte 1.procedurede tanımlanan lnI değişkeni Deger alt procedureune gittiğinde değeri 5 olarak değişiyor. Alında bu durum istenmeyen bir şeydir. Çünkü 1.procedure ile 2. procedure arasındaki ilişkide lnI değişkenin bir önemi yok.
Local'li
*!* *************************************************
Local lnI
m.lnI = 1
m.lnI = m.lnI + 1
MessageBox(Transform(m.lnI)) && 2 görünür
Do Deger
MessageBox(Transform(m.lnI)) && 2 görünür
Return
Procedure Deger
Local lnI
m.lnI = 1
For m.ln = 1 To 5
Wait Window Transform(m.lnI) NoWait
EndFor
Return
*!* *************************************************
2. örnekte Local komutu ile bu sorunu ortadan kaldırılmıştır.
Public değişken kullanımı
Public değişken kullanımı sadece ana (yani programın başlayacağı) kodlama sırasında kullanılmak zorundadır. Hiçbir şekilde formlarda yada benzeri kodlarda public değişken kullanılmayacaktır.
Bu durumda garip görünebilir ancak bu da en az local değişken kullanımı kuralı kadar önemlidir. Bu durumda çok önemli hatalara yol açabilir. Yine yeni başlayan arkadaşlar için biraz daha detaylı bir açıklama yapalım.
Düşünülebilir ki formlarda bir procedureden bir başka procedure bilgi aktarmak yada formda istediğim zaman kullanacağım bir değişkene ihtiyaç duyulur. Bu gibi durumlarda public değişken dışında ne kullanılabilir ki. Bunu bir örnekle açıklayalım. Tasarlayacağımız formda ad soyad bilgilerinin girildiği iki textbox olsun ve yeni, sil, yükle ve kaydet diye düğmelerimiz olsun. Eğer kullanıcı yükle düğmesinden bir kayıt seçip yüklerse kaydet düğmesine bastığımızda değiştirme yeni düğmesini seçip kayıt girdiyse kayıt ekleme işlemini yapmalıyız.
Bu durumda elimizde öyle bir değişken olmalı ki yapılan işlemin kayıt eklememi yoksa değiştirmemi olduğu bilelim. Kaydet düğmesine bastığında işlemimizi ona göre yapalım. Bu işi public bir değişken çözebilir ama bu durum önceden bahsettiğimiz sebeplerden dolayı tehlikelidir. Bunun için formumuza bir özellik (property) eklememiz gerekmektedir. Bunun için menüden Form-->New Property’yi seçiniz. Açılan pencereye lYeniMi yazıp Add düğmesine basın. Artık elimizde yeni bir özellik var. Bu durumda Yeni düğmesinin Click eventine ThisForm.lYeniMi = .T. Yükle Düğmesinin Click evetine ThisForm.lYeniMi = .F. satırlarını ekleyebiliriz. Şimdi Kaydet düğmesinin Click eventinde
If ThisForm.lYeniMi
ThisForm.YeniKayit
Else
ThisForm.KayitDegistir
EndIf
Gibi bir kod yazabiliriz. Böylece public değişken kullanmaktan kurtulmuş oluruz.
- Kod hizalama yapılmak zorundadır.
Yazılan kodun rahat okunabilmesi için kod hizalama çok önemlidir. If, For, Do Case ve atama işlemlerinde TAB karakteri kullanılmalıdır. Bu durumu bir örnekle açıklayalım.
LParameters tnSecim As Integer
Local lnBaslangic As Integer, lnBitis As Integer, lnAraDegerSonucu As Integer
m.lnBaslangic = 3
m.lnBitis = 5
m.lnAraDegerSonucu = 0
*!* Yukarıda ki atamaya dikkat edecek olursanız = işaretleri hizalanmıştır.
*!* Bu durum kodun kolay okunmasını sağlar.
Do Case
Case m.tnSecim = 1
Replace cAd With "Tarkan",
cSoyad With "Haser" In Kisiler
*!* Replace komutunda cAd, cSoyad saha isimleri aynı hizadan başladığı gibi
*!* With komutlarıda aynı hizadan başlamaktadır.
*!* Ayrıca her saha için bir alt satıra geçilmiştir.
Bu ve benzeri durumlar gereksiz gibi görünse de bu tarz bir yazıma alışınca eski yazımlarınız size çok karışık gelecektir. Lütfen bu noktayı önemseyiniz. Sizlerde replace gibi diğer benzer komutların yazılma standardını oluşturabilirsiniz.
- With komutunun kullanım olabildiğince kullanma zorunluluğu.
With komutunu kodlamanızın daha kolay anlaşılır ve yazma işini kolaylaştır. Ancak en önemlisi kodunuzun hızlandırır. With parantezine alınmış her kod parçası parantezde tanımlanan kısmı sadece bir kere hafızaya alır. Bunu bir örnekle açıklayalım.
ThisForm.pgfAna.pagGenel.txtAd.Value = "Tarkan"
ThisForm.pgfAna.pagGenel.txtSoyad.Value = "Haser"
ThisForm.pgfAna.pagGenel.txtTelefon.Value = "(312) 479 10 50"
ThisForm.pgfAna.pagGenel.txtFaks.Value = "(312) 479 10 60"
ThisForm.pgfAna.pagGenel.txtSehir.Value = "Ankara"
Kodunda ThisForm.pgfAna.pagGenel objesi her satırda hafızaya yükleniyor ve komut bittiğinde siliniyor. Sonra bir sonraki satırda da benzer işlem yapılıyor. Oysaki bu sizin kodunuzu yavaşlatan bir durumdur. O yüzden bu kodu şu şekilde yazabiliriz.
With ThisForm.pgfAna.pagGenel
.txtAd.Value = "Tarkan"
.txtSoyad.Value = "Haser"
.txtTelefon.Value = "(312) 479 10 50"
.txtFaks.Value = "(312) 479 10 60"
.txtSehir.Value = "Ankara"
EndWith
Yukarıdaki durumda with parantezinde ThisForm.pgfAna.pagGenel objesi hafızaya bir kere alınır ve paranter EndWith ile kapanan kadar hafızada kalır. Böylece gereksiz kod işletilmemiş olur.
Proje analiz çalışması
2 Projeye Başlarken
2.1 Analiz Çalışması
Yeni bir projeye başlarken kodlamadan uzak ama programcılığın en önemli noktası analiz çalışmasıdır. Analiz çalışması yapılmadan başlanılan her program dümeni bozuk bir gemi gibi hedefe ilerlerken sürekli yön değiştirir.
Yapacağınız proje müşteriniz için özel bir çalışma olabilir. O zaman müşterinin neler istediğini, programdan ne beklediğini çok iyi analiz etmek lazım. Müşterinizle gidip konuştunuz. Konuşma sırasında onu zorlayın ne bekliyor iyice anlayın. Yapılacak program, müşteri için önemli bir sistem oluşturabilir. Bu durumda programın sihirli bir değnek olmadığını programla beraber sistemi kullanacak kişilerin de programı desteklemesi gerektiğini veri girişlerinin sağlıklı olması gerektiğini vurgulayın. Sadece bir kişi ile görüşerek analiz çalışması yapmayın. Programı kullanacak kişilerle de görüşünün. Onlarında sorunlarını beklentilerini öğrenin.
Analiz sonunda hiç sıkılmadan bir rapor hazırlayın. Rapor iki kısımdan oluşmalıdır. Bir müşteriye verilecek olan rapor iki kendimizin kullanacağı rapor. Müşteriye vereceğimiz raporda sistem akış diyagramları, yapılacak formların kaba ekran tasarımları ve bu formların nasıl çalışacağı (en önemlisi kayıt ekleme, düzenleme ve silme koşulları). Bu hazırlamış olduğunuz müşteri raporunu özel bir toplantı ile müşterinize anlatın. Sorun ve sıkıntıları konuşun. Açık ve net olun.
Sistem akışı ve programla ilgili konular kadar programın çalışacağı bilgisayarlar ve bilgisayar ağ yapısı da önemlidir. Programınızın çalışacağı minimum özellikleri belirleyin. Bu hem terminal bilgisayarlar hem ana bilgisayarlar hem de ağ yapısı olmalıdır. Bunları belirlerken bilgisayarın hafızasından ekran çözünürlüğüne, ana bilgisayarın domanin yapısına kadar yazılı olarak aynı raporda müşterine sunun. Tabi ki müşterinizin bu konuyu da iyice anlamasını sağlayın.
Müşterinizle kesinlikle ekinde hazırladığınız rapor olan bir sözleşme imzalayın.
Kendinize hazırlayacağınız rapor; veritabanı yapısal analizi, yapılacak olan formların çalışma mantığı ve ekran tasarımları, tüm programın sistem akış diyagramları ki dikkat edin diyagramı yazıp tek bir diyagram kastetmiyorum detaylı bir şekilde bir çok diyagram hazırlayın ve en önemlisi iş planını belirleyin.
İş planınızı gün gün hazırlayın. Hangi gün ne iş yapılacak ve ne kadar zamanda yapılacak ve kimin tarafından yapılacak? Bu iş planına projenin ara test aşamalarını ve proje sonunda tam test aşaması ile bu sıkıntıları çözecek zaman planlamasını da eklemeyi unutmayın. İş planınızda fazla mesai planlamayın. Günlük çalışma saatlerine uyun. İş planınıza gerçekleşen zamanları yazın. Erken ya da geç bitirimlerde neden olduğunu not düşün. Erken yada geç bitirmeler bir hatalı plan yapıldığını gösterir. Bu durumlardan ders alıp bir sonraki proje planlamasını ona göre yapın.
PROJE PLANLAMASIZ ÇALIŞMAYIN!..
Yukarıda bahsetmiş olduğum analiz çalışması sizlere büyük bir külfet gibi görünebilir. Ancak bu işlemden sonra projenizin yarısını bitmiş sayabilirsiniz. Projenizi bitirdiniz ve teslim ediyorsunuz. Müşterinizle; ben böyle istemedim, şunu yapmamışsın yada bunu neden böyle yaptın gibi konuşmalar olmasını istemiyorsanız, yada proje tesliminden sonra olabilecek her türlü sıkıntı için bu rapor size kaynak olacaktır.
Şu bir gerçek ki proje teslimlerinde her zaman müşterinizin fazladan istekleri ve talepleri olabilir. Bu istekler sizin için çok basit olabileceği gibi zorda olabilir. Bunları yapıp yapmamak size kalmıştır. Ancak projenin sıhhatli yürüyebilmesi için mantıklı en azından çok zaman almayacak istekleri yapın ancak müşterinizden bu istekleri yazılı ve imzalı olarak alın.
Son olarak tekrar vurgulamak istiyorum, bu tür analiz çalışması 1 gün, 1 hafta yada 2 hafta sürebilir bu projenin büyüklüğüne göre değişir ancak kesinlikle böyle bir çalışma yapılmalıdır. Lütfen bunu es geçmeyiniz
2.2 İlk Ayarların Yapılması
2.2.1 Veritabanı yaklaşımı
Programınız tek veya çok kullanıcılı olabilir ancak hep çok kullanıcılıymış gibi tasarım yapmanızı tavsiye ederim. Çok kullanıcılı bir tasarımda, veritabanın ana bilgisayarda tutulması gerekir ki tüm kullanıcılar ana bilgisayarda paylaşıma açılmış olan veritabanına bağlanabilsinler. Bu noktada konuyu biraz daha detaylandıralım. Tasarım sırasında herkesin kullanacağı bir veritabanına ihtiyaç duyulduğu gibi sadece o kullanıcının ihtiyaç duyabileceği veritabanı da olabilir. Şöyle ki o bilgisayarda yapılan ayarların saklanabileceği bir veritabanı olabilir. (Bu ayarlar bir ini dosyasında da tutulabilir ama bana göre veritabanından okumak ve yazmak çok daha kolay.)
Bu noktada anlaşılıyor ki en az iki veritabanına ihtiyacımız var. Haser Yazılım olarak biz bu iki veritabanın ismini Genel ve Lokal olarak sabitledik Bundan sonraki anlatımlarda ben de hep bu isimleri kullanacağım.
2.2.1.1 Lokal Veritabanı
Bu veritabanın amacı lokalde tutulması gereken ayarların saklanacağı veritabanıdır. Ben tabi ki burada minimum gereken bilgileri belirteceğim. En önemlisi ana bilgisayarda paylaşıma açılan veritabanın adresinin saklanacağı bilgidir. Bunun için Bölüm 01 - VFP Başlarken 1.1.1 Çalışma Klasöründe belirtmiş olduğum klasör yapısında VeriLokal klasörünün altına Lokal isminde bir veritabanı oluşturun. Bu veritabanına MakineAyar isminde bir tablo oluşturun ve tablo yapısı şu şekilde olsun. Saha Adı : mVeriYolu Saha Tipi M (Memo) Oluşan bu tabloya tek bir boş kayıt ekleyin. (Daha sonra bilgi gireceğiz)
2.2.1.2 Genel Veritabanı
VeriGenel klasörünün altına Genel adında bir veritabanı oluşturun. Bu veritabanın tabloları ise uygulamanıza bağlı olarak değişecektir. Bunu tabi ki sizler belirleyeceksiniz.
2.2.2 Programın İlk Kodlarının Oluşturulması
İlk kodlamadan önce tabi ki yeni bir proje oluşturmalısınız. Bunun için File-->New... seçiniz açılan pencereden Project seçip New file düğmesine basınız.Açılan Create penceresinde yapacağınız projenin kök klasörüne projenin adını vererek kaydedin. Şimdi karşınızda projenizi rahatlıkla yönetebileceğiniz bir Project Manager penceresi açılmıştır.
Bu pencereye önceden oluşturduğumuz Genel ve Lokal veritabanlarını ekleyin. Data sayfasında Databases'i seçip Genel ve Lokal veritabanlarını ekleyin. Şimdi ilk kodlama için hazırız. Code sayfasında Programs'ı seçip New... düğmesine basınız. VFP'da oluşturacağınız programın ilk satırlarını bu program code sayfasına yazacağız. Oluşturduğunuz exe çalıştığında ilk bu dosya içindeki kodları işletecektir. O yüzden bu prg dosyasına biz "Ana" ismini verdik. Bu Ana.prg dosyasını yine projenizin kök klasörüne kaydetmelisiniz.
Şimdi bu Ana.prg dosyası içindeki ilk satırları açıklamaları ile yazalım.
Ana.prg dosyasının başı
Set Escape komutu program çalışırken ESC tuşuna basıldığında
programın kırılıp kırılmamasını ayarlar.
Program exe'den çalışıyorsa kırılmasını istemeyiz.
Ancak programı VFP içinden çalıştırıyorsak kodlamamızda oluşabilecek bir
hata nedeni ile programı kırmak isteriz. O zaman ESC tuşuna ihtiyaç duyarız.
Bu yüzden bu ayarı otomatik seçimli olarak ayarladık.
Versiyon() fonksiyonu ile programın exe'den mi yoksa VFP içinden mi
çalışıp çalışmadığına bakıyoruz. Eğer exe ise ESC 'Off' konumuna
VFP içinden çalışıyorsa 'On' konumuna getiriyoruz.
If Versiyon(2) = 0
Set Escape Off
Else
Set Escape On
EndIf
Kullanıcıları özgür bırakın. Bunun ilk adımı kullanıcının ayarlarını kullanmaktır.
Kullanıcının yapmış olduğu tarih, saat, basamak ve dijit sembolünü sizde kendi
programınızda kullanın. Bunun için aşağıdaki komutu uygulamanız yeterlidir.
Set SysFormats On
VFP'nun bazı komutları sonuçlarını aktif ekranda gösterir.
Bizce bu durum tasarım aşamasında işe yarayabilir ancak
exe'den çalışan bir program için bu pek istenmez.
Örneğin Talk 'On' konumunda iken SUM komutunu kullandığınızda aktif ekrana sonucu
listeler. Bu sizin ekran tasarımızın üzerine çıkan çirkin yazılar demektir.
Bu yüzden Talk komutunu ağırlıklı olarak 'Off' konumunda kullanmanızı tavsiye ederim.
Ancak ufak bir hatırlatmada yapmak istiyorum bazı komutların işletilmesi uzun sürebilir.
Örneğin bir SQL Select komutu 5-10 saniye civarında sürebilir. Bu durumda ekrana
bir işlem ilerleyiş çubuğu (system progress bar) çıkmasını isteyebilirsiniz.
Bu durumda Talk komutunu 'On' yapmalısınız. Biz bu özel durumlar gerçekleştiğinde
ilk önce 'On' işlemden sonrada 'Off' hale getiriyoruz. Ancak varsayılan olarak hep
'Off' kullanıyoruz. Talk'u etkileyen komutları VFP'nun yardım menüsünde bulabilirsiniz.
Set Talk Off
Foxpro'nun bir tablosundan kayıt sildiğinizde o kayıt gerçek anlamda tablodan silinmez.
Sadece silindiğini belirten bir işaret konur. Bu işareti Browse penceresinde ve Grid'de
sağ taraftaki ince sütunda görebilirsiniz. Eğer Deleted 'Off' konumunda ise silinmiş
kayıtları tablo içinde görürsünüz ancak bu sağ taraftaki ince sütunda silinmiş kayıtları
için siyah görünür. Kaydı silmek için bu sütunu kullanabileceğiniz gibi silinmiş kaydı
geri almak içinde kullanabilirsiniz. Bunun ilgili kaydın bu sütununa tıklayabilirsiniz.
Özetle silinen kayıtlar özel komutlar uygulanıncaya kadar tablo içinde saklı kalır.
İşte bu kayıtlar üzerinde genelde işlem yapılmaz o yüzden görmemiz ve kullanmamız
pek gerekmeyecektir. (Orta ve ileri düzeylerde bu kayıtlar kullanılacaktır ama kullanmak
istediğimizde Deleted 'Off' 'On' yaparak işimizi çözebiliriz. Biz varsayılan olarak
'On' kullanıyoruz.
Set Deleted On
Programımızın çok kullanıcılı olmasına karar vermiştik. Bu yüzden kullanacağımız tabloları
kişiye özel değil de birden fazla kişi kullanacağından paylaşıma uygun olarak açmalıyız.
Aşağıdaki komut kişiye özel kullanımı kapatan komuttur. Bu durumu kapatarak çok kullanıcı
program ayarlarına giriş yapmış oluruz. Ancak unutmayın ki tablolarınızı yeniden yapılandırmak
indekslemek gibi işlemlerde kişiye özel komumun açık olması gerekir. Yada tablonuzu açarken
özel olarak kişiye özel olduğunu belirtmeniz gerekir. Bunun için Use komutunun yardımına
bakabilirsiniz.
Set Exclusive Off
Çok kullanıcılı programlarda aynı kayıt üzerinde birden fazla kullanıcı işlem yapabilir.
Kayıt üzerinde işlem yaparken o kayıt işlem bitene kadar o kullanıcı için kilitlenmelidir.
Diğer bir kullanıcı aynı kayıt üzerinde işlem yapabilmek için o kaydın kilidinin açılmasını
beklemek zorundadır. Aşağıdaki komut işte bu bekleme süresini ayarlar.
Set Reprocess To 3 Automatic
Çok kullanıcılı ortamlarda kayıtlar üzerinde işlem yaparken birden fazla kaydı kilitlemek istersiniz.
Paylaşıma açılmış tablolarda otomatik kilitleme yada elle kilitleme işlemleri için aşağıdaki
Komutu kullanmak zorundasınızdır.
Set MultiLocks On
Tablolarımızda rahatlıkla Türkçe karakter kullanabiliriz. Ancak bu tablolarda bir sıralama (index)
yaptığımızda Türkçe sıralamaya girebilmesi için aşağıdaki komutu kullanmamız gerekir. Eğer bu komutu
kullanmazsak İ, Ş vb. karakterler sıralamada sona kalırlar. Bu durumda kullanıcıların sıralı bir
tablodan bir şey bulması sıkıntı olur. Ancak Türkçe sıralamanın olabilmesi için programın
kurulu olduğu bilgisayarın Türkçe sıralama bilgisinin yüklü olması gerekmektedir. Bunu şu şekilde
kontrol edebilirsiniz. Denetim Masası (Contol Panel) - Bölgesel Ayarlar (Regional Settings) -
Gelişmiş (Advance) bölümünde Unicode kısmında Türkçe seçilmelidir. Tabi bu ayar her bilgisayarda
tanımlı olmayabilir bu yüzden Set Collate komutunu kullandığımızda programımızın bir hata mesajı
vermemesini isteyebiliriz. Bu yüzden Try Catch bloğu içinde bu komutu yazıyorum. Try Catch
VFP 8 ile gelen bir komuttur. VFP 8 öncesi için On Error komutu ile bir çözüm yapılabilir.
Yeni başlayan arkadaşlar için Try Catch bloğunu çok az anlatmak istiyorum. Komutun aşağıdaki gibidir.
Try
[Yapılmak istenen komutlar]
Cacth
[Hata oluştuğunda yapılmak istenen komutlar]
Finally
[Hata olsa da olmasa da yapılmak istenen komutlar]
EndTry
Try
Set Collate To "TURKISH"
Catch
EndTry
Kodlama sırasında yapılan en büyük yanlışlıklardan biri ise kodlamanın içine tam dosya yolunun
yazılmasıdır. Örneğin bir dosya açmak için kullanılan Use komutunu eğer şu şekilde olursa
Use C:DenemeVeriLokalAyarlar In 0 programın VeriLokal klasörünün C diskinde Deneme klasörünün
altında olma zorunluluğunu getirirsiniz. Kullanıcı programı farklı bir dizine kurabilir. Daha
kullanıcıya gelmeden siz projenizi başka bir klasöre taşıyabilirsiniz. Bu durumda program çalışmaz
hale gelir. Oysa ki sizin için önemli olan programın nerede çalıştığı değil VeriLokal klasörünün
altındaki Ayarlar dosyasının açılmasıdır. Sizin tek şartınız exe'nin çalıştığı klasör altında
VeriLokal klasörü olması ve bu klasörün altında Ayarlar dosyanızın olmasıdır. Bunun için varsayılan
klasörünüzü ayarlamanız gerekir. Eğer varsayılan klasörünüz exe'nin çalıştığı klasör olursa komutu
Use VeriLokalAyarlar In 0 şeklinde kullanabilirsiniz. Bu tarz bir kullanımda sizin sorunlarınıza
çözüm olur. Varsayılan klasörü ayarlamak için Set Default komutunu kullanmak gerekir. Ancak buradaki
önemli soru program o an hangi klasörde çalışmakta. Bunu da sys(16,1) komutu ile bulabiliriz.
Özetle varsayılan klasörü ayarlamak için aşağıdaki kodu yazmamız yeterli olur.
Set Default To (JustPath(Sys(16,1))
2.2.1 Veritabanı yaklaşımı kısmında açıkladığım üzere Lokal ve Genel isimli iki veritabanımız var.
Bu veritabanlarından Lokal olan exe'nin çalıştığı VeriLokal klasörünün altında olmak zorunda.
Genel veritabanımız VeriGenel klasörünün altında ve paylaşıma açılmış bir yerde olacaktır. Bu adres program kodlamasında bellidir.
|