T.C. MİLLÎ SAVUNMA BAKANLIĞI HARİTA GENEL KOMUTANLIĞI HARİTA YÜKSEK TEKNİK OKULU ANKARA MÜHENDİSLİKTE İLERİ PROGRAMLAMA DERS NOTLARI Dr.Müh.Yb. Tayfun ÜNLÜ Müh.Yzb. Feyzi KANTAR ANKARA 2005 İÇİNDEKİLER 1. Bilgisayar Programlaması Mantığı a. Algoritma Kurma b. Akış Diyagramı c. Akış Diyagramı Örnekleri 2. Yapısal Programlama Dilinin(Pascal) Temel Elemanları a. Dilin Özellikleri b. Program Yapısı c. Değişkenler ve Sabitler d. Tanımlama Bloğu e. İcra Bloğu f. Veri Tipleri, Operatörler ve Öncelikleri g. İfadeler 3. Yapısal Programlama Dilinin Cümleleri a. Atama Cümleleri b. Giriş/Çıkış Cümleleri c. Kontrol Cümleleri d. Döngü Cümleleri 4. Yapısal Programlama Dilinin Diğer Elemanları a. Dosya İşlemleri b. Alt Programlar c. Sıralı Veri Tipleri d. Diziler e. String İşlemleri f. Records 5. Görsel Programlama Ortamı ve Temel Kavramlar a. Projeler ile Çalışma b. Kontrollerin Kullanımı c. Özellik,Metod ve Olay Kavramları 6. Görsel Programlama Dilinin (Visual Basic) Temel Elemanları a. Veri Tipleri, Sabitler ve Değişkenler b. String ve Tip Dönüşümü İşlemleri 7. Görsel Programlama Dilinin Diğer Elemanları a. Temel İşlemler b. Blok Kontrol Deyimleri c. Diziler d. Alt Yordam Hazırlamak ve Kullanmak e. Dosya İşlemleri f. Dosya ve Dizinler Üzerinde İşlem Yapmak 8. Görsel Programlama Dili İle Kullanıcı Ara Yüzü Hazırlama a. Formlar ve Özellikleri b. Formlara Uygulanan Olaylar c. Formlara Uygulanan Metotlar d. MDI Özellikli Formlar i e. f. g. h. i. j. Hazır Formlar ve Şablonlar Kontroller Menü Hazırlamak Araç Çubuğu Hazırlamak Ortak Diyalog Kutuları Hata Ayıklama 9. Görsel Programlama Dili İle Veritabanı Uygulamaları a. Veritabanı Dosyası Hazırlamak b. Veri Kontrolü c. Veri Form Sihirbazı İle Form Hazırlamak d. Birden Fazla Tablo Üzerinde İşlem Yapmak e. Program Kodu Yazarak Veritabanı Dosyası Hazırlamak f. Recordset Nesnesi g. Sorgu Hazırlamak ve Sql Dili h. ADO Kontrolü i. Data Environment j. Crystall Report ile Rapor Hazırlamak k. Data Report ile Rapor Hazırlamak l. Yazıcıyı Kullanmak 10. Görsel Programlama Dili İle İleri Uygulamalar a. API Fonksiyonları b. Yardım Dosyası Hazırlamak c. Proje Hazırlama Sihirbazı d. Exe Dosya ve Kurulum Hazırlama e. ActiveX Hazırlamak ve DHTML Projeleri f. Nesneye Yönelik Program Hazırlama ii 1.Bilgisayar Programlaması Mantığı a.Algoritma Kurma Algoritma, verilen herhangi bir sorunun çözümüne ulaşmak için uygulanması gerekli adımların hiç bir yoruma yer vermeksizin açık, düzenli ve sıralı bir şekilde söz ve yazı ile ifadesidir. Algoritmayı oluşturan adımlar özellikle basit ve açık olarak sıralandırılmalıdır. Programlamanın temeli olan algoritma hazırlanmasında dikkat çekici bir nokta, aynı sorunu çözmek için hazırlanabilecek olası algoritma sayısının birden çok olmasıdır. Başka deyişle, bir sorunun çözümü için birbirinden farklı birden fazla sayıda algoritma hazırlanabilir. Bu da gösteriyor ki herhangi bir problemin çözümü için birbirinden farklı yüzlerce bilgisayar programı yazılabilir. Bir bilgisayar programı için hazırlanacak olan algoritma da aynı şekilde çözüm yolunu bilmeyen bir kişiye, çözüme ulaşmak için neler yapması gerektiği anlatılıyormuş gibi hazırlanmalı ve eksik bir nokta bırakmaksızın gerekli tüm adımları açık ve düzenli olarak içermelidir. Çözüm için kullanılacak bilgilerin nereden alınacağı, nerede saklanacağı ve çözümün program kullanıcısına nasıl ulaştırılacağı algoritma adımları arasında belirtilmelidir. Aşağıda değişik işlemlere ilişkin algoritma örnekleri verilmiştir. Örnek 1: İki sayıyı toplamak için gerekli programa ait algoritmanın oluşturulması. Algoritma: A1 :Birinci sayıyı gir A2 :İkinci sayıyı gir A3 :İki sayının toplamını yap A4 :Toplamın değerini yaz A5 :Bitir. Bu tam bir algoritmadır. Sözcüklerin ortaya çıkaracağı yanlış anlamaların ortadan kaldırmak amacıyla semboller ve matematik dilini gerektiren bazı kısaltmalar kullanmak daha uygun olacaktır. Bir algoritma yazılırken şu metot izlenmelidir: 1. 2. 3. 4. 5. 6. Programda kullanılacak elemanları temsil etmek üzere uygun isimler veya değişkenler seç. Bazı isimlere başlangıç değeri olarak çözümün gerektirdiği uygun değerler ver. Gerekirse programa girilecek verileri düzenle. Cebirsel notasyon ve kararlar kullanarak aritmetik işlemleri gerçekleştir. Çıkışı düzenle. Bitir. 1 Yukarıda iki sayının toplanması için oluşturduğumuz algoritmayı bu yeni gereksinimlere uyarak yeniden yazalım. Toplam adı için Z Birinci Sayı için X İkinci Sayı için Y değerleri kullanılırsa; Algoritma: A1 :X değerini gir A2 :Y değerini gir A3 :Z ¬ X+Y A4 :Z’ yi yaz A5 :Bitir Görüldüğü üzere bu şekilde bir algoritma ile çözüm yolunu izlemek daha kolaydır. Bundan sonra bu tip algoritma kullanılacaktır. Örnek 2: Verilen bir sayının faktöriyelini hesaplayan programın algoritmasının oluşturulması Sayının faktöriyeli :Fak Faktöriyel degişkeni :X Faktöriyeli hesaplanacak sayı :Y Algoritma: A1 :Fak¬ 1, X¬ 0 A2 :Y’i gir A3 :Y<0 ise 2. adımı tekrarla A4 :X¬ X+1 A5 :Fak¬ Fak*X A6 :X<Y ise 4. adıma geri dön A7 :Fak değerini yaz A8 :Bitir 2 Bu algoritmada 1. adımda X e 0 ve Fak değişkenine 1 değeri atanıyor. 2. adımda Y değeri giriliyor ve 3. adımda Y değerinin 0 dan küçük bir değer olup olmadığı denetleniyor ve denetim sonucuna göre gerekli komut veriliyor. 4. adımda X’in değeri 1 arttırılıyor ve 5. adımda X için Fak değeri hesaplanıyor. 6. adımda X in değerinin faktöriyeli hesaplanacak sayıdan küçük olması durumunda 4. adımdan itibaren işlemlerin tekrarlanması komutu veriliyor, X’ in değerinin Y’ye eşit olması durumunda işlemler tamamlanarak hesaplanan değerin yazdırılması işleminden sonra programın çalışması sona ermektedir. b. Akış Diyagramları Geliştirilecek olan yazılımın genel yapısının şematik gösterimine akış diyagramı veya blok diyagramı adı verilir. Akış diyagramları, yazılımı oluşturacak program parçalarını ve bu parçaların birbirleri ile olan ilişkilerini belirler. Bir bilgisayar programının oluşturulmasında akış diyagramlarının hazırlanması, algoritma oluşturma aşamasından sonra gelmektedir. Bilgisayar programının oluşturulması sırasında algoritma aşaması atlanarak, doğrudan akış diyagramlarının hazırlanmasına başlanabilir. Programlama tekniğinde önemli ölçüde yol almış kişiler bu aşamayı da atlayarak direkt olarak programın yazımına geçebilirler. Akış diyagramlarının algoritmadan farkı, adımların simgeler şeklinde kutular içinde yazılmış olması ve adımlar arasındaki ilişkilerin (iş akışı) oklar ile gösterilmesidir. Akış diyagramlarında kullanılan semboller, anlamları ve kullanış amaçları aşağıdaki tabloda verilmiştir. Tablo 1. İş akış diyagramlarında kullanılan semboller ve anlamları Simge Simgenin Adı ve Anlamı 3 Elips Akış diyagramının başlangıç ve bitiş yerlerini gösterir. Başlangıç simgesinden çıkış oku vardır. Bitiş simgesinde giriş oku vardır. Paralel Kenar: Programa veri girişi ve programdan elde edilen sonuçların çıkış işlemlerini gösterir. Dikdörtgen Aritmetik işlemler ve değişik atama işlemlerinin temsil edilmesi için kullanılır. Eşkenar Dörtgen Bir karar verme işlemini temsil eder. Altıgen Program içinde belirli blokların ard arda tekrar edileceğini gösterir. Oklar Diyagramın akış yönünü ,yani her hangi bir adımdaki işlem tamamlandıktan sonra hangi adıma gidileceğini gösterir. Ayrıntılı bir akış diyagramı, yazılımı oluşturan işlemleri ve ilişkilerini en küçük detayına kadar belirler. Bir bilgisayar programının geliştirilmesinde kullanılan programlama dili ne olursa olsun bu programların akış diyagramlarında genel olarak yalnız üç basit mantıksal yapı kullanılır. Bu mantıksal yapılardan en basiti sıralı yapıdır. Sıralı yapı, hazırlanacak programdaki her işlemin mantık sırasına göre nerede yer alması gerektiğini vurgular. Bu yapı sona erinceye kadar ikinci bir işlem başlayamaz. Şekil 1: Sıralı Yapı Mantıksal yapılardan ikincisi Karar Verme yapısıdır (Şekil 2). Programlama sırasında If...Then... Else yapısı ile tanıyacağımız bu mantıksal yapılar, birden fazla sıralı yapı seçeneğini kapsayan modüllerde, hangi şartlarda hangi sıralı yapının seçileceğini belirler. 4 Şekil 2: Karar Verme Yapısı Üçüncü mantıksal yapı çeşidini tekrarlı yapılar oluşturmaktadır. Bu yapılara Pascal programlama dilinde For(Şekil 3.a), While ve Repeat..Until (Şekil 3.b), yapısı adı da verilir. Şartlara göre değişik işlem gruplarının yapılmasını sağlar. Bu yapı yukarıda sözü edilen iki yapının çeşitli kombinezonların tekrarlanmasından oluşmuştur. Söz konusu üç değişik yapı, değişik kombinezonlarda kullanılarak istenilen işlevleri yerine getirecek programlar hazırlanabilir. Programların bu üç basit yapı ile sınırlandırılması program modüllerinin daha kolay tasarlanmasını sağlar. (b) (a) Şekil 3: Tekrarlı Yapı c.Akış Diyagramı Örnekleri Bu bölümde yazılım oluşturma evrelerinden biri olan akış diyagramları ile ilgili örnekler verilmiştir. Sözlü veya yazılı olarak oluşturduğumuz algoritmanın programa dönüştürülmesi sırasında programın çalışma sırasını da gösteren akış diyagramlarıyla ilgili örnekler aşağıda verilmiştir. Örnek 1: İki sayının toplamını ve ortalamasını yapan bilgisayar programının akış diyagramını çiziniz. 5 Örnek 2: 1’den 100’e kadar olan sayıların toplamlarını ve ortalamalarını veren programın akış diyagramını çiziniz. Örnek 3: Ax+b=0 şeklinde verilen 1.derece denklemin çözümünü veren programa ait akış diyagramını çiziniz. 6 Örnek 4: Ax²+Bx+C=0 şeklinde verilen 2. derece denklemin köklerini bulan programın akış diyagramını çiziniz. Yukarıdaki örnekte A=0 girilmesi durumunda denklem 1.derece olmaktadır. Bu durumu dikkate alarak gerekli çözümü de gösterecek şekilde akış diyagramını değiştiriniz. Örnek 5: 1’ den 100’e kadar sayıların karelerini, kareköklerini, küplerini, küpköklerini toplamlarını ve ortalamalarını veren programın akış diyagramını çiziniz. 7 Örnek 6: Yukarıda karar mantığı yapısı ile çözümlediğimiz problemi döngü yapısı ile çözümleyelim. 8 Örnek 7:10 tane N sayısının faktöriyelini hesaplayan programın akış diyagramını çiziniz. 9 Örnek 8: Yukarıdaki örneği tekrarlı yapı olarak tanımladığımız döngü yapısı ile çözelim. 10 Örnek 9: Elimizde bulunan A,B, ve C gibi 3 adet sayıdan en büyüğünü ve en küçüğünü bulan programın akış diyagramını çiziniz. 11 Örnek 10: Elimizde bilinmeyen sayıda koni bulunmaktadır ve koniye ait yarıçap (R) ve yükseklik (H) değerleri klavyeden girilmek suretiyle V=p .R².H/3 formülü ile hacim hesabı yapılacaktır. Koniye ait yarıçap değeri 0 girildiğinde programın çalışması duracaktır. Programda her girilen veri için hacim değeri rapor edilecek, programın çalışması bittiğinde toplam kaç koni için hacim hesabı yapıldığı da belirtilecektir. Verilen akış diyagramında R ve H değerlerinin negatif girilmesine engel olacak şekilde akış diyagramını yeniden düzenleyiniz. Örnek 11: F(x) kesikli fonksiyonunun değeri X’in aldığı değerlere göre aşağıda verilmiştir. X’in değeri 0-10 arasında 0.5 aralıklarla arttığına göre her bir X değeri için F(x) fonksiyonunu hesaplayan programın akış diyagramını çiziniz. · · · · 0< X < 2 f(x)= X 2< X < 3 f(x)=X 3-X2-2 3< X < 4 f(x)=X 2-2X+13 4< X f(x)=X 4-3X2-43 12 Örnek 12: p sayısının formülü olduğuna göre serinin paydasındaki ifade 100 oluncaya kadar pi sayısını hesaplayan bilgisayar programının akış diyagramını çiziniz. 13 2.Yapısal Programlama Dilinin(Pascal) Temel Elemanları a.Dilin Özellikleri · · · · · · · Pascal programlama dili mantıklı bir şekilde bir araya getirilmiş program bloklarından oluşan blok yapılı bir dildir. Satır numaraları kullanılmaz. Tüm değişken isimlerinin program veya alt programın başlangıcında tanımlanması gerekir. Her bir değişkenin veri tipi açıkça tanımlanmalıdır. Genel kural olarak pascal kendiliğinden bir veri tipinden diğerine otomatik dönüşüm yapmaz. Pascal derleyicisi veri tipi kontrolünü atama ve karşılaştırma cümleleri ile parametre geçişlerinde yapar. Alt programlar(functions, procedures) ana program ile aynı yapıya sahiptir. Program satırları okunurluğu sağlayacak şekilde hizalanır(indentation). Pascal Programı Program Başlığı Program Bloğu Tanımlama Bloğu Label Bölümü CONST Bölümü İcra Bloğu TYPE Bölümü VAR Bölümü AltProgram Bölümü Şekil 4: Bir Pascal Programının Şematik Görünümü 14 b.Program Yapısı Bir pascal programının yapısı aşağıda görüldüğü gibidir. PROGRAM NAME1(INPUT,OUTPUT) LABEL { GOTO deyiminde kullanılan referanslar } CONST { Sabitler } TYPE { Kullanıcı tarafından tanımlanan veri tipleri } VAR { Genel(Global) Değişkenler } FUNCTION NAME2(Parametre Listesi):TYPE; Label Const Type Var {Varsa bu altprogramın kullanacağı diğer altprogramlar} BEGIN Pascal Cümleleri; END; PROCEDURE NAME3(Parametre Listesi) Label Const Type Var {Varsa bu altprogramın kullanacağı diğer altprogramlar} BEGIN Pascal Cümleleri; END; Label Const Type Var BEGIN Pascal Cümleleri; END; Ana Program c.Değişkenler ve Sabitler Değişkenler ve sabitler bir harf ile başlarlar. İsimlerinin uzunluğu kullanılan derleyiciye bağlıdır. · Standart pascalda isim uzunluğu 8 karaktere kadar olabilir. · Turbo pascalda isim uzunluğu 127 karaktere kadar olabilir. İlk 63 karakteri benzersiz olmalıdır. Pascal deyim ve komutlarında kullanılan sözcükler isimlendirmede kullanılamaz. (Reserved words) Geçersiz 7 1X FARUK-K Geçerli A X1 FARUK (1). Tamsayı Sabitler 25 025 +25 -25 (2). Reel Sabitler (a). Ondalık Sayılı 2.5 –2.5 15 (b). Bilimsel Notasyonda -1.234x10 15 -> -1.234E+15 veya -1.234E15 (c). Normalleştirilmiş Formda 25.34E2 -> 0.2534 E4 (3). String veya Karakter Sabitler ‘HYTO’ ‘HO’ ‘TC’ (4). Mantıksal Sabitler True False (5). Küme Sabitleri Sayılabilir değerlerden oluşan topluluğa küme denir. [1..12] 1 ile 12 arasındaki sayılardan oluşan alt küme(subrange) [1,3,5,7,9] ilk beş tek sayıdan oluşan küme [‘A’..’Z’] d.Tanımlama Bloğu (1). Label Bölümü Label bölümü program içerisinde GOTO cümlesi kullanıldığında gereklidir. İyi bir yapısal program GOTO cümlesi içermemelidir. Örn: LABEL 10,EXIT,459,99 (2). Constant Bölümü CONST Pwd=’HYTO’ Bosluk=’ ‘ Yildiz=’***’ E= 2.718283 PI=3.14 ALPHA=[‘A’..’Z’] (3). Type Bölümü TYPE Tip İsmi 16 = Tip Tanımı ; TYPE WeekDays = (MON, TUE, WED, THUR, FRI) ;à Sıralı(Enumarated) tip Indis = 1..50; DiziTipi = ARRAY[Indis] OF INTEGER Line = STRING[80] RENKLER = SET OF (RED,BLUE); Isim = RECORD First : STRING[10]; Last : STRING [15]; END; (4). Var Bölümü VAR X,Y,Z : INTEGER; J,K : REAL; Q : BOOLEAN; Words : ARRAY [1..100] OF STRING[10]; Days : WeekDays; Kullanıcı tanımlı tip adları TYPE Satır : Line; bölümünde tanımlanmış olmalıdır. Ad : Isim; e.İcra Bloğu · Tüm icra edilebilir cümleler BEGIN/END arasına yazılır. o Programla ilgili açıklamalar {...} veya (*...*) arasına yazılır. o Boşluklar okumayı arttırmak için semboller, değişkenler ve operatörler arasına konulabilir. C := A + B; C := A + B; o Okumayı arttırmak için kodun içine boş satırlar eklenebilir. 17 · Kod Yazmada dikkat edilecek hususlar: o Pascala ait sözcükler büyük harfle yazılır. o Her bir cümle ayrı bir satıra yazılır. o Kullanıcı tanımlı isimlerin ilk karakteri büyük diğerleri küçük harf ile yazılır. o Devam eden cümlenin kalan kısmını aynı hizada yazın. o Her BEGIN sözcüğü bir END sözcüğü ile bitirilmelidir. · Kullanıcı tarafından tanımlanan isimler aşağıdaki Pascal sözcüklerinden farklı olmalıdır. *ABSOLUTE ABS AND ARRAY BEGIN CASE CONST DIV DO DOWNTO ELSE AND *EXTERNAL FILE FORWARD FUNCTION GOTO IF *IMPLEMENTATION IN *INLINE *INTERFACE *INTERRUPT LABEL MOD NIL NOT OF OR PACKED PROCEDURE PROGRAM RECORD REPEAT SET *SHL *SHR *STRING THEN TO TYPE *UNIT UNTIL *USES VAR WHILE WITH *XOR NOT: (*) ile işaretlenen sözcükler sadece TURBO PASCAL için geçerlidir. f.Veri Tipleri Operatörler ve Öncelikleri · Veri Tipleri o Tamsayı Tipleri 18 Pascalda değişkenleriniz için tanımlayabileceğiniz veri tiplerini aşağıda bulabilirsiniz. İşaretli veya işaretsiz tamsayıları ifade etmek için kullanabileceğiniz çeşitli aralıkları kapsayan değişken tipleridir. Programlarınızda en çok kullanacak olduğunuz tipler de yine bu tiplerdir. Tip Değer Açıklama Byte 0..255 İşaretsiz tamsayılar (8 bit). Shortint -128..127 İşaretli tamsayılar (8bit). Integer -32768..32767 İşaretli tamsayılar (16 bit) Word 0..65535 İşaretsiz tamsayılar (16 bit). Longint -2147483648..2147483647 İşaretli tamsayılar(32 bit). o Kesirli Sayı Tipleri Bu sayı tipleri sabit veya ondalıklı gerçel sayıları ifade etmekte kullanılırlar. Özellikle büyük rakamlarla veya bilimsel araştırmalarla uğraşıyorsanız bu tip değişkenlere çok işiniz düşecek demektir. Tip Değer Real 2.9e-39..1.7e38 Single 1.5e-45..3.4e38 Double 5.0e-324..1.7e308 Extended 3.4e-4932..1.1e4932 Comp -9.2e18..9.2e18 Basamak 11-12 7-8 15-16 19-20 19-20 Açıklama 6 bytelık yer tutar 4 bytelık yer tutar 8 bytelık yer tutar 10 bytelık yer tutar 8 bytelık yer tutar Aşağıdaki değerler bilimsel notasyonda yazılmıştır. Düzgün görüntüsü için şu örnekten yararlanabilirsiniz : 2.9e-39 = 2.9 * 10-39 o Karakter ve Alfanümerik Tipler Bu tip değişkenlerin içinde isim, adres gibi sayısal olmayan değerler tutulur. Tip Değer Char ‘a’,’z’... String (0..254 karakter) o Açıklama Tek karakterlik değişkenler (8 bit). Karakterlerden oluşan dizidir Mantıksal Tip Sadece doğru veya yanlış değerini tutabilen değişkenlerdir. Karar vermenizde size yardımcı olacaklarına emin olabilirsiniz. Doğru için 1, yanlış için 0 olarak düşünebilirsiniz. Tip Değer Boolean True,False (1,0) · Operatörler o Aritmetik Operatörler 19 Operator + * / Div Mod o Operator Not And Or Xor Shl Shr İşlemi Toplama Çıkarma Çarpma Bölme Tamsayı Bölme Kalan İşlem Tipleri integer,real integer,real integer,real integer,real integer,real integer Sonuç tipi integer,real integer,real integer,real real,real integer,real integer Mantıksal Operatörler İşlem Değil Ve Veya 1 sayacı Sola kaydırma Sağa kaydırma İşlem Tipi integer integer integer integer integer integer Sonuç Tipi integer integer integer integer integer integer Karşılaştırma Operatörleri Bu operatörlerin sonucu daima boolean döner. Operatör = <> < > <= >= o Açıklaması Eşit olup olmadığını kontrol eder Farklı olup olmadığını kontrol eder Küçük mü? Büyük mü? Küçük veya eşit mi? Büyük veya eşit mi? Küme Operatörleri * : İki kümenin kesişimini verir. +: İki kümenin birleşimini verir. - : Soldaki kümenin sağdaki kümeden fark kümesini verir. · Operatörlerin Önceliği o 1nci Öncelik: Parantez içindeki işlemler. o 2nci Öncelik: Yordam çağrıları o 3ncü Öncelik: Tekli operatörler (-A) 20 o 4ncü Öncelik: Mantıksal NOT o 5nci Öncelik: * , / , DIV , MOD , AND o 6ncı Öncelik: + , - , OR , XOR o 7nci Öncelik: Karşılaştırma operatörleri g.İfadeler · Aritmetik İfadeler o Her aritmetik ifade bir satıra yazılmalıdır. (x1+x2)/(x3+x4) vb. o Bir aritmetik ifade uzunsa birden fazla satıra bölünebilir. A:=B+SIN(X)+...................................+B*C +D*TAN(Y); gibi. o İki aritmetik operatör yan yana yazılamaz. Yanlış Doğru -------------------- A*-B A/-B A*(-B) A/(-B) o Açılan parantez sayısı kadar kapanan parantez sayısı olmalıdır. o Üs alma operatörü yoktur. · · Karşılaştırma İfadeleri o Birden fazla karşılaştırma operatörü parantezler aracılığı ile kullanılabilir. –10<B<10 => (B>-10) AND (B<10) o Karşılaştırma ifadeleri mantıksal ve karşılaştırma operatörleri ile değişken ve sabitlerin uygun birleşiminden oluşur. İfade Örnekleri o 7 * 10 – 5 MOD 3 * 4 + 9 70 2 8 21 62 71 o (7 * (10 – 5) MOD 3) * 4 + 9 5 35 2 8 17 o NOT (( A>B) OR K) AND L {A=2; B=5; K=TRUE; L=FALSE;} F T F F 3.PASCAL CÜMLELERİ Pascal cümleleri yapılarına göre basit ve blok cümleler olarak ikiye ayrılabilir. Basit cümleler: · Atama Cümleleri · Giriş/Çıkış Cümleleri · Alt Program Çağrıları · GOTO Cümlesi · Boş Cümle(vb.) Blok Cümleler: Birden fazla olup alt alta bir yapı içerisinde yer alırlar. · Sıralı Cümleler: BEGIN/END bloğu içerisinde yer alan cümlelerdir. · Kontrol Cümleleri: IF THEN ELSE ve CASE yapıları içerisinde yer alan cümlelerdir. · Döngü Cümleleri: FOR, WHILE veya REPEAT yapıları içerisinde yer alan cümlelerdir. 3.a.Atama Cümleleri A := B + C := Operatörü atama operatörü olup sağındaki ifadenin değerini solundaki değişkene aktarır. 22 3.b.Giriş/Çıkış Cümleleri Bir bilgisayar işlemi genel olarak üç temel bölümden oluşur bunlar giriş - işlem - çıkış'tır. Pascal'da giriş ve çıkış işlemleri için Readkey, Read, Readln, Write ve Writeln fonksiyonları kullanılır. Şimdi bu fonksiyonlara sırasıyla göz atalım. 3.b.1.Readkey: Klavyeden bir karakter okumak için kullanılır. Readkey ile okunan karakter ekranda görünmez. Fonksiyon sadece bir karakteri bir değişkenin içine girmek için kullanılır. Readkey fonksiyonu Crt.Tpu Pascal kütüphanesi içinde tanımlı olan bir fonksiyon olduğu için bu fonksiyonu kullandığımızda programımıza "uses Crt;" satırını mutlaka eklemek zorundayız. Bu satır, readkey fonksiyonunun yazdığımız program tarafından tanınmasını sağlıyor. Örnek : Uses Crt; var C: Char; Begin Writeln('Lutfen bir tusa basin'); C := Readkey; Writeln(' Bastiginiz tus ', C, '); end. 3.b.2. Read-Readln: Pascal 'da okuma işlemi için kullanılan komutlar READ ve READLN olup genel kullanım yapısı şu şekildedir; Read(A1,A2,A3,...,An) Readln(A1,A2,A3,...,An) Read ile Readln arasındaki fark: Read, okuma işlemi tamamlandıktan sonra aynı satırda kalınmasını, Readln ise yeni bir satıra gelinmesini sağlar. Bir Pascal programı içerisinde bu iki komutun kullanımı aşağıdaki program parçasında verilmiştir. Var s,a,n:real; begin 23 Read(s,a,n) end. Okunacak değerlerin düzeni; 12.45 43.543 62.12 Aynı değerleri Readln ile okutturmak istersek; Var s,a,n:real; begin Readln(s,a,n) end. Okunacak değerlerin düzeni yukarıdaki okuma düzeni ile aynı olabileceği gibi her değer ayrı bir satırda verilebilir, her hangi satırlarda verilebilir, örnek olarak s, a ve n değerleri aşağıdaki okuma düzeninde okutturulmuştur. 12.45 43.543 62.12 3.b.3. Write-Writeln: Pascal programlama dilinde yazma işlemi için WRITE ve WRITELN komutları kullanılmaktadır. Bu komutların genel kullanım yapısı şu şekildedir Write(A1,A2,A3,...,An) Writeln(A1,A2,A3,...,An) İki kullanım şekli arasındaki fark, Read ile Readln arasındaki fark gibidir. İfadeler Write ile yazdırıldıktan sonra imleç aynı satırda bekleyecektir, Writeln ile yazdırılması durumunda ise imleç bir sonraki satıra geçecektir. Var s,a,n:integer; ...... 24 begin s:=3;a:=9;n:=5; Write(s); Write(a); Write(n); End. Programın çalıştırılmasıyla elde edilen sonuç 395 olacaktır. Aynı değişkenleri Writeln ile yazdırdığımızda; Var s,a,n:integer; ...... begin s:=3;a:=9;n:=5; Writeln(s); Writeln(a); Writeln(n); End 3 9 5 elde edilecektir. 3.b.3. Pascal’da Çıktı Düzeni: Pascal'da değişken tanımları bölümünden de hatırlayacağınız gibi sayıları ifade etmek için real, integer gibi tip tanımları kullanıyoruz. Fakat bu tip tanımları ile tanımlanan değişkenlerin 25 içerdiği sayısal ifadeler bizim günlük hayatta kullandığımız ve ihtiyaç duyduğumuz şekilde değil bilgisayarın saklayabileceği şekillerde bulunmaktadır. Örneğin sizin "birim" diye real tipinde tanımladığınız bir değişkene "4.5" değerini girdiğimizi düşünelim bu değişkeni ekranda görüntülemek istediğimizde elde edeceğimiz görüntü şu şekilde olacaktır. 4.5000000000E+00 İşte bu tür görüntüleri düzgün hale sokmak ve çıktı düzenini sağlamak için aşağıda anlatılan yöntem kullanılır. Tip Yöntem Açıklama Integer tipindeki bir değişkenin adının arkasına n gibi sayısal bir değer yazılırsa Integer Değişken : n bu n karakterlik bir saha içinde bu sayının sağa doğru dayalı bir şekilde yazılmasını sağlar. Real Real tipinde bir değişkenin adının arkasına n ve m gibi sayısal değerler Değişken:n:m yazılırsa bunlar n karakterlik alan içinde, ondalık kısmı noktadan sonra m tane karakter içermek üzere sağa dayalı olarak yazdırılır. String Değişken:n String tipindeki bir değişkenin adının arkasına n gibi sayısal bir değer yazılırsa bu n karakterlik bir saha içinde bu karakter dizisinin sağa doğru dayalı bir şekilde yazılmasını sağlar. ClrScr Fonksiyonu O andaki ekranı temizler ve imleç ekranın sol üst köşesine konumlanır. Clrscr fonksiyonu ekranı temizlerken o anda ekranda aktif olan zemin rengini kullanır. Yani eğer zemin rengi o anda Textbackground(Yellow); komutu kullanılarak sarıya çevrilmişse bu satırdan sonra kullanılacak bir clrscr; komutu ekranın tamamen sarıya dönüşmesini sağlayacaktır. GotoXY Fonksiyonu İmlecin ekranın istenilen bir pozisyona konumlanmasını sağlamak için kullanılır. gotoxy(sütun,satır); şeklinde kullanılır Clrscr ve Gotoxy fonksiyonları CRT Kutuphanesi içinde tanımlıdır. Bu komutları program içinde kullanacağınız zaman programınızın en başına uses crt; cümlesini eklemeyi unutmayın. Örnek: Uses Crt; Var Ad : String[20]; Begin 26 ClrScr; Write('Adiniz : '); Readln(Ad); Gotoxy(30,12); write(Ad); End; Dos text modunda ekranın 80 sütun ve 24 satırdan oluştuğunu unutmayın... 3.c.Kontrol Cümleleri Pascalda genel olarak kullanılan karşılaştırma deyimleri şunlardır: 3.c.1.IF Deyimi IF deyimi, bir şartın doğru veya yanlış olmasına bağlı olarak programın belirli parçalarının çalışmasını veya çalışmamasını sağlar. IF deyimi, IF şart cümlesi THEN Blok1; veya IF şart cümlesi THEN Blok1 ELSE Blok2 şeklinde kullanılabilir. Buradaki şart cümlesi, birbirlerine mantıksal operatörler ile bağlanmış bir veya birkaç ilişkisel operasyon veya bir tek mantıksal ifade olabilir. Aşağıdaki örnekleri inceleyelim: IF A=B THEN ... IF (A=B) AND (A=C) THEN ... IF (A+1) < (B-1) THEN ... IF (Cev In ['E' , 'e']) THEN ... Then sözcüğünü takiben, bloklar birden fazla komut cümlesinden oluşurlar ise, bu blokların BEGIN ve END deyimleri içine alınması zorunludur. IF deyiminin ikinci şekli yani ELSE' den sonra gelen komut veya komutlar dizisi geçerlilik kazanmışsa, ELSE' den önce gelen komut cümlesinin yada, End deyiminin sonuna ';' işareti konulmaz. Aşağıdaki örneklerden 1.si hatalı 2.si doğrudur. IF A=B Then Writeln ('Eşit'); Else Writeln ('Farklı'); IF A=B Then Writeln ('Eşit') Else Writeln ('Farklı'); IF deyimi içinde kullanılan Blok1 ve Blok2 çeşitli komut cümlelerinden oluşabileceğine göre bu blokların içinde başka IF cümleleri de yer alabilir. IF deyimlerinin bu şekilde kullanılmasına iç içe IF deyimleri adı verilir. IF cümlesinde yer alan her iki bloğun geçerlilik kazanması söz konusu olamaz. IF degisken_1 <kosul> degisken_2 then begin ----islemler 27 ----end; Bu kullanım şekli IF deyiminin en yalın şekillerinden biridir. Degisken_1 ile Degisken_2 arasındaki koşulun durumuna göre THEN ifadesinden sonra gelen işlemler yapılır. Örnek: Aşağıda verilen kodlarına göre daire, üçgen ve dikdörtgenin çevresini hesaplayan Pascal programını yazınız. 1. Üçgen 2. Dikdörtgen 3. Daire Program Cevre_Hesabi; uses crt; {Windows için Wincrt} var sekil:byte; uzun1,uzun2,uzun3:real; cevre:real; Begin Writeln('1. Üçgen'); Writeln('2. Dikdörtgen'); Writeln('3. Daire'); Write('Şeklin Kodunu Giriniz'); Readln(Sekil); If Sekil=1 then Begin Write('Uçgenin 1. Kenar Uzunluğunu giriniz :');readln(Uzun1); Write('Uçgenin 2. Kenar Uzunluğunu giriniz :');readln(Uzun2); Write('Uçgenin 3. Kenar Uzunluğunu giriniz :');readln(Uzun3); Cevre:=uzun1+uzun2+uzun3; 28 end; If Sekil=2 then Begin Write('Dikdörtgenin Kısa Kenar Uzunluğunu giriniz:') ; readln(Uzun1); Write('Dikdörtgenin Uzun Kenar Uzunluğunu giriniz :'); readln(Uzun2); Cevre:=2*(uzun1+uzun2); End; If Sekil=3 then Begin Write('Dairenin yarıçapını giriniz :');readln(Uzun1); Cevre:=2*pi*Uzun1; End; Writeln('Seçilen Nesnenin Çevre Uzunluğu =',Cevre:8:2); End. Örnek : Aşağıda verilen kodlara göre birim dönüşümlerini veren Pascal programı yazınız. Fahrenhayt 'tan (F) Santigrad 'a (C) : C=5/9*(F-32) İnç 'ten (I) Santimetre 'ye (Cm) : Cm=2.54*I Mil 'den (M) Kilometre 'ye (Km) : Km=1.6*M Pound 'dan (P) Kilogram 'a (Kg) : Kg=0.45*P Program metrik_cevrimler; uses crt; {Windows için Wincrt} var kod:byte; F,C,I,Cm,M,Km,P,Kg:real; Begin 29 Writeln('Çevrim Kodları'); Writeln('1. Fahrenhayt -> Santigrad'); Writeln('2. İnç -> Santimetre '); Writeln('3. Mil ->Kilometre '); Writeln('4. Pound -> Kilogram '); Write('Çevrim Kodunu Giriniz ='); Readln(Kod); If Kod=1 then begin Write('Fahrenhayt Değerini Giriniz ='); Readln(F); C:=5*(F-32)/9; Writeln('Santgrad Değeri =',C:7:2,' °'); end; If Kod=2 then Begin Write('İnç Değerini Giriniz ='); Readln(I); Cm:=2.54*I; Writeln('Santimetre Değeri =',Cm:7:2); end; If Kod=3 then Begin Write('Mil Değerini Giriniz ='); Readln(M); Km:=1.6*M; Writeln('Kilometre Değeri =',Km:7:2); end; If Kod=4 then Begin Write('Pound Değerini Giriniz ='); Readln(P); Kg:=0.45*P; 30 Writeln('Kilogram Değeri =',Kg:7:2); End; End. 3.c.2.If Then Else Yapısı IF degisken_1 <kosul> degisken_2 then begin ----islemler ----end ELSE begin ----islemler ----end; Bu yapı kullanıldığında, Degisken_1 ile Degisken_2 belirtilen koşulu karşıladıkları zaman THEN ifadesinden sonra gelen işlemler, aksi halde ELSE ifadesinden sonra tanımlanan işlemler yaptırılır. IF degisken_1 <kosul> degisken_2 then begin islemler1; end else if degisken_3 <kosul> degisken4 then begin islemler2; end else 31 if degisken_5 <kosul> degisken6 then begin islemler3; end; Örnek:Aşağıdaki program klavyeden girilen yılın kaç gün olduğunu vermektedir. Programı inceleyiniz. program deneme; uses crt; {Windows için Wincrt} var yil:integer; begin clrscr; Write('Gun Sayisini ogrenmek istediginiz yili giriniz :'); readln(yil); if (yil mod 4 )=0 then begin Writeln('Yil 366 gun'); End Else Begin Writeln ('Yil 365 gun'); end; readln; end. 3.c.3.Case ... Of Bir değerin birden fazla değer ile karşılaştırmasını yapan ve bir eşitliğin bulunması halinde belli program parçalarının çalıştırılmasını sağlayan CASE deyiminin genel formu aşağıda verilmiştir. CASE Kontrol Değişkeni OF Etiket1 : Blok1 ; 32 Etiket2 : Blok2 ;. Etiketn : Blokn ; ELSE BLOK; END; Kontrol değişkeni real haricindeki standart tiplerden birine sahip olan bir değişkendir. CASE deyimi içindeki etiketler LABEL olarak tanımlananlardan farklıdır. Bunlar sabit değerler olup, kontrol değişkeni ile aynı tipe sahiptir. Etiketi takip eden bloklar ise PASCAL komut cümlelerinden meydana gelir. Komut cümleleri birden fazla ise BEGIN END deyimleri arasına yazılması zorunludur. Etiketlerin dışında yazılan ELSE deyimi ve bunu takip eden blok seçimliktir Örnek : Aşağıda kişinin yaşı girildiğinde, yaşına uygun mesajlar veren bir Pascal programı verilmiştir Program Yasdilim; Uses wincrt; {Dos için CRT} Var yas:integer; Begin Clrscr; Write('Yaşınızı Giriniz :'); ReadLn(YAS); CASE yas OF 0..5:Writeln('Yaşınız 0-5 arasında'); 5..15:Writeln('Yaşınız 5-15 arasında'); 15..35:Writeln('Yaşınız 15-35 arasında'); 35..50:Writeln('Yaşınız 35-50 arasında'); 50..85:Writeln('Yaşınız 50-85 arasında'); else Writeln('Çok Yaşayın'); end; Readln; End. Örnek : Kare, dikdörgen, üçgen ve daire alan hesabı yapan bir Pascal programı hazırlanacaktır. Programda alanı hesaplanacak nesneyi belirttikten sonra ilgili alanın hesaplanabilmesi için CASE...OF yapısı kullanılacaktır. 33 program Sekillerin_alan_hesabi; uses Crt; {Windows için Wincrt} var Ch : char; uzun,gen,yuk,Taban,ycap: real; Alan_Kare,Alan_Dortgen,Alan_Ucgen,Alan_Daire:real; i:byte; begin (* Ana program *) Writeln; Writeln('Lütfen Alan Hesabı Yapacağınız Nesneyi seçiniz :'); Writeln; Writeln('[K]are'); Writeln('[D]ikdörtgen'); Writeln('[U]çgen'); Writeln('d[A]ire'); Writeln('[C]ıkış'); Write('Alan hesabı yapılacak nesne (K/D/U/A) ?='); Readln(Ch); case UpCase(Ch) of 'K' : begin Write('Karenin kenar uzunluğu ='); Readln(uzun); Alan_Kare:= uzun*uzun; Writeln('Alan ',Alan_kare:12:4); end; 'D' : begin Write('Dörtgenin Genişliği = '); Readln(gen); 34 Write('Dörtgenin Yüksekliği ='); Readln(yuk); Alan_Dortgen:=gen*yuk; Writeln(' Dörtgenin Alanı= ',Alan_Dortgen:12:4); end; 'U' : begin Write('Üçgenin Taban Uzunluğu ='); Readln(Taban); Write('Üçgenin Yüksekliği ='); Read(yuk); Alan_Ucgen:=taban*yuk/2; Writeln('Üçgenin Alanı = ',Alan_Ucgen:12:3); end; 'A' : begin Write('Dairenin Çapı ='); Readln(Ycap); Alan_Daire:= sqr(ycap)*Pi; Writeln('Dairenin Çapı =',Alan_Daire:12:3); end; 'C' : begin Writeln('Bitti');exit; end; else Writeln(' Tanımsız giriş'); end; end. (* Ana program sonu *) 3.d.Döngü Cümleleri 3.d.1.For Deyimi For deyimi, bir program parçasının belirlenen sayıda üst üste çalıştırılması için kullanılır. For deyiminin genel kullanım şekilleri aşağıda verilmiştir. 35 FOR Kontrol Değişkeni :=Başlangıç_Değeri TO Son_değer DO Begin İşlemler End; Bu kullanım şeklinde başlangıç değeri bitiş değerinden küçük olmak zorundadır. TO ifadesiyle başlangıçtan bitişe kadar artarak tekrar yapılacağını, DO ifadesi de tanımlanan işlemlerin tekrarlanacağını bildirir. FOR Kontrol Değişkeni :=Başlangıç_Değeri DOWNTO Son_değer DO Begin İşlemler End; For deyiminin bu kullanım şeklinde başlangıç değeri bitiş değerinden daima büyük olup DOWNTO ifadesi de döngü değişkeninin tekrarlama işleminde azalacağını belirtir. DO ifadesi ise belirtilen işlemlerin döngü sayısınca tekrarlanacağını bildirir. Turbo Pascal dilinde diğer programlama dillerinden farklı olarak başlangıç değerinden son değere artışlar/azalmalar birer birer olmaktadır. Aşağıdaki örnek programları inceleyiniz. Örnek:Aşağıdaki örnek Program; 1'den 8'e kadar artan ve 9'dan 3'e kadar birer birer azalan iç içe for do döngülerinin kullanımını göstermektedir. Program icice_for_ornek; Uses crt; {Windows için Wincrt} Var i,j:byte; Begin For i:=1 to 8 do Begin for j:=9 downto 3 do Begin 36 Write(i*j:6); end; Writeln; end; Readln; End. Örnek: 'A' dan 'Z' ye kadar büyük harfleri ekrana yazdıran Pascal programı. Program Odev; var ch:=Char; begin Writeln('BÜYÜK HARFLER'); for ch:='A' to 'Z' DO Write(Ch,' '); end. Örnek. Klavyeden girilen bir ifadeyi tersten yazdıran program. program terstenyazma; uses crt; {Windows için Wincrt} var mesaj:string; i,l:byte; begin Write('Bir mesaj yazınız'); Readln(mesaj); 37 l:=length(mesaj); Writeln(L); for i:=L downto 1 do Write(Copy(mesaj,i,1)); end. 3.d.2. Repeat Deyimi Bir program bloğunun belli bir şart sağlanıncaya kadar üst üste çalıştırılmasını sağlayan REPEAT deyiminin genel formu aşağıdaki şekildedir. Repeat . Program Satırları . Until (Boolean Şartı) Burada repeat, tekrar etme anlamında olup, tekrar etme işi UNTIL deyimindeki boolean ifadesi sağlanıncaya kadar devam eder. Bu deyim program satırları bölümüne herhangi bir şey yazılmaksızın kullanılabilir. Bu döngünün en büyük avantajı belirli bir sayı ile sınırlandırılmamış olmasıdır. Boolean ifadesindeki şart sağlanıncaya kadar işlemlere devam edilmektedir. Dikkat edilirse şart cümlesinin aldığı değer ne olursa olsun program bloğu bir kez çalışmaktadır. Örnek : Aşağıda verilen Pascal programı birden verilen sayıya kadar olan sayıların toplamını hesaplamaktadır. Program ornek_repeat; uses wincrt; var sayi:integer; 38 top:real; begin clrscr; top:=0; Write(' Sayıyı Giriniz ='); Readln(sayi); Repeat top:=top+sayi sayi=sayi-1 Until (Sayi=0); Writeln(sayi,' sayısına kadar olan sayıların toplamı=’,top:6:3); end. 3.d.3.While Deyimi Bir program bloğunun belli bir şart sağlandığı sürece üst üste icrasını sağlayan WHILE deyiminin genel yazılış şekli aşağıdadır. While <şart cümlesi> Do BLOK Do kelimesini takip eden blok WHILE deyimi tarafından döngüye sokulacak komut cümlelerini kapsar. Komut cümlesi sayısı birden fazla ise, bu bloğun BEGIN...END deyimleri arasına alınması zorunludur. WHILE ile REPEAT arasındaki fark; Repeat döngüsü şart cümlesi yanlış olduğu sürece, While döngüsü ise şart cümlesi doğru olduğu sürece devam etmesidir. Örnek : Repeat -Until ile yapılan örnek programı WHILE-DO ile yapalım. program ornek_While; uses wincrt; var sayi:integer; top:real; 39 begin clrscr; top:=0; Write(' Sayıyı Giriniz ='); Readln(sayi); While Sayi>0 do begin top:=top+sayi sayi=sayi-1 end; Writeln(sayi,' sayısına kadar olan sayıların toplamı=’,top:6:3); end 4.YAPISAL PROGRAMLAMA DİLİNİN DİĞER ELEMANLARI 4.a. Dosya İşlemleri Ascii içerikli dosyalar okunabilir karakterler içeren dosyalar olup, TEXT veri tipi ile tanımlanır. VAR EmpFile:TEXT · Standart dosyalar da dahil olmak üzere bir pascal programında kullanılan tüm dosyalar program başlığında yer almalıdır. PROGRAM PayRoll(INPUT,OUTPUT,EmpFile) · Dosya kullanılmadan önce ASSIGN prosedürü ile dosya değişkeni disk üzerindeki fiziksel dosya ismine bağlanır. ASSIGN(dosya değişkeni, dosya ismi). · Eğer dosyadan okuma yapılacaksa, dosya program içinde RESET ile açılır. RESET(dosya değişkeni) Örnek: ASSIGN(EmpFile,’Employee.dat’) RESET(EmpFile) 40 · Okunmak için açılan dosya içindeki değerler aşağıdaki komutlar aracılığı ile ilgili değişkenlere okunur. READ(dosya değişkeni, değişken listesi) READLN(dosya değişkeni, değişken listesi) · Dosya sonu EOF fonksiyonu ile kontrol edilir. Dosya sonuna gelinmişse fonksiyon TRUE değeri döndürür. Örnek: Aşağıdaki program parçası bir dosyanın içeriğini ekrana kopyalar. WHILE NOT EOF(EmpFile) DO BEGIN READLN(EmpFile,EmpName,EmpNumber); WRITELN(EmpName,EmpNumber); END; · Eğer yeni bir dosyaya değerler yazdırılacaksa , dosya program içinde REWRITE komutu ile açılır. Bu komut ile açılan dosya diskte mevcut ise içeriği silinir. REWRITE(dosya değişkeni) · Eğer var olan bir dosyanın içeriği korunarak sonuna yeni değerler yazdırılacaksa , dosya program içinde APPEND komutu ile açılır. APPEND(dosya değişkeni) · Yazmak için açılan dosyaya, yeni değerler aşağıdaki komutlar aracılığı ile yazılır. WRITE(dosya değişkeni, değişken listesi) WRITELN(dosya değişkeni, değişken listesi) · WRITELN(dosya değişkeni) ile dosyaya boş bir satır eklenir. · Okuma veya yazma işlemleri bitince dosya CLOSE komutu ile kapatılır. CLOSE(dosya değişkeni) Örnek: Çalışanların numaraları ve saatlik ücretleri EmpFile7.Dat içerisinde, verilmiştir. Çalışanların numaralarını ve saatlik ücretlerini 1.05 katsayısı kadar arttırarak EmpFile8.dat içerisine yazdırın. EmpFile7.Dat (Eski dosya) 3126 3127 3128 EmpFile8.Dat(Yeni dosya) 7.50 8.75 9.35 3123 3124 3125 7.88 9.19 9,82 PROGRAM UcretYenile(EmpFile,NewEmpFile,Output,Input); CONST EmpFileName=’c:\empfile7.dat’ NewEmpFileName=’c:\empfile8.dat’ Increase=1.05 41 VAR EmpFile,NewEmpFile:Text; EmpNum:INTEGER; HourlyRate,NewHourlyRate:REAL; BEGIN ASSIGN(EmpFile,EmpFileName); ASSIGN(NewEmpFile,NewEmpFileName); RESET(EmpFile); REWRITE(NewEmpFile); WHILE NOT EOF(EmpFile) DO BEGIN READLN(EmpFile,EmpNum,HourlyRate); NewHouryRate=HourlyRate*Increase; WRITELN(NewEmpFile,EmpNum,NewHourlyRate); END; CLOSE(EmpFile); CLOSE(NewEmpFile); END.{UcretYenile) 4.b. Alt Programlar Yapısal programlamanın en önemli yaklaşımlarından biri, temel uygulamayı bir takım parçalara bölerek gerçekleştirmektir. Pascal'da bu parçalar altyordam (procedure) veya fonksiyon (function) olarak kodlanır. Yapısal programlamanın temel tercih nedeni, program modüllerinin bağımsız olarak geliştirilmeleri ve çalışıp çalışmadığının kolaylıkla anlaşılabilmesidir. Alt programlar genellikle tekrar edilen işlemleri kolaylıkla yapabilmek için yazılırlar. Tekrar edilen işleme örnek olarak, programımız içinde birden fazla yerde faktöryel hesabı yapmamız gerekiyor ise bunu bir alt program ile hesaplatmamız halinde aynı işleme sahip program satırlarının tekrarı önlenecek, programın takibi kolaylaşacak ve daha verimli hafıza kullanımı söz konusu olacaktır. Bilgisayar dillerinin tamamında bulunan alt program yapısı PASCAL Programlama dilinde PROCEDURE ve FUNCTION türü alt programlar olmak üzere iki ayrı türdedir. Bu iki ayrı tür alt programlar birbirlerine benzer özellikler taşımalarına rağmen yapısallık ve icra açısından bazı farklılıklar içerirler. Alt programlarda yapılacak işlemler, ana program içinde nerede gerekiyor ise o noktada ilgili işlemleri yapan alt programın adı yazılarak devreye sokulur. 42 Alt Programlar Hakkında Genel Bilgiler · · · · · Her alt programın bir başlığı, bir tanım bloğu, bir de icra bloğu vardır. Ana programlar PROGRAM deyimi, prosedür alt programlar PROCEDURE, fonksiyon alt programlar FUNCTION deyimi ile başlar. Alt program adının hemen yanında verilen parametreler değer transferi işlemleri için kullanılırlar. Bir alt programa değer transferi yapılarak, her bir çalışmada verilen değişik değerlere bağlı olarak değişik sonuçlar üretmek mümkündür. Alt program isminin yanına parametre yazmak seçime bağlıdır. Eğer parametre yazılıyor ise bunlar procedure isminin yanına parantez içinde yazılırlar. Pascal programlama dilinde formal ve gerçek parametreler olmak üzere iki tür parametre tanımlanabilir. Formal parametreler, programın tamamına ait olmayıp sadece değer transferi için kullanıldıklarından geçici parametreler olarak isimlendirilebilirler. Yani bu parametreler ile sadece alt program içinde çalışılabilir. Ana programda, alt programın çalıştırılması için yazılması gereken alt programın yanında yazılan parametreler ise gerçek parametre adını alırlar. Burada gerçek ve formal parametrelerin sıralanış, sayı ve tip bakımından aynı olması gerekir. 4.b.1.Function Alt Programları Pascal’da altprogramlar başlığı altındaki yapısal modüllerden bir diğeri de fonksiyonlardır (function). Function ve Procedure arasındaki farkı anlayabilmek için procedure ve function olarak ayrı ayrı yazılmış bir uygulama üzerinde duralım. PROCEDURE Toplam(X,Y:integer; var Z:integer); begin Z:=X+Y; end; FUNCTION Toplam (X,Y:integer):Integer; begin TOPLAM:=X+Y; end; Örnekte toplam isimli alt yordam (Procedure) X ve Y tamsayılarının toplamını referans parametresi türündeki Z değişkeni aracılığı ile getirir. Procedure durumunda geri döndürülecek değer, VAR ile tanımlanmış bir değişkene atanmaktadır. Fonksiyon olarak tanımlanan TOPLAM modülü ise toplamı kendisi getirmektedir. Fonksiyon sona erdirilmeden önce geri döndürülecek, fonksiyonun ismine atanmaktadır. Toplam isimli fonksiyon, integer tiptedir. 43 Procedure olarak yazılan TOPLAM alt programı ; Toplam (A;B;T); (Procedure) şeklinde çağırılırken, function şeklinde geliştirilmiş Toplam alt programı ; T:=Toplam(A;B); (Function) komutuyla çağırılır. 4.b.2. Procedure Alt Programları Bir pascal programında Procedure alt programlara eri şim ve procedure alt programın program içindeki yeri aşağıdaki genel gösterim şeklinde verilmiştir. Program ad_; procedure Altprogram1; begin işlem blokları; end; procedure Altprogram2; begin işlem blokları; end; (* ANA PROGRAM*) BEGIN işlemler; Altprogram1; Altprogram2; ........ işlemler; ........ 44 Altprogram1 ; ........ END. Alt programlarda, ana programlarda olduğu gibi sabit, değişken ve çeşitli tip tanımlamaları yapılabilir. Yapılan bu tanımlamalar, alt program aktif olduğu sürece geçerli olup alt programın çalışması sona erdiğinde alt programda tanımlanan değişken, sabit ve tipler bellekten silinir. Procedure işlem blokları iki şekilde kullanılır, a. Parametresiz Prosedürler b. Parametreli Prosedürler 4.b.1.a.Parametreli Prosedürler Ana program ve alt programlarda tanımlanan değişkenlerin farklı olması durumunda tercih edilirler. Ana programda tanımlanan değişken değerlerinin işleme alınmaları, alt programda tanımlanan değişkenlere aktarılarak yapılır. Parametreli prosedürlerde de tek yönlü ve çift yönlü olmak üzere iki ayr ı tür değer transferi söz konusudur. Eğer procedure ismini takiben parametrelerin tanım cümlesi VAR ile başlıyorsa parametreler arasında çift yönlü değer transferi yapılacak demektir. Yani ana programda kullanılan değişkenler alt programa aktarılacak ve alt programın çalışması sona erdiğinde sonuç değerler ana programa transfer edilir. Tek yönlü değer transferinde ise parametrelerin tanım cümlesi VAR ile başlamaz, değer transferi ana programdan alt programa olur ve alt programın icrası sonunda ortaya çıkan sonuçlar ana programa transfer edilmez. Her iki tür için yaz ım örnekleri aşağıda verilmiştir. Tek yönlü Transfer :Procedure Altyordam(X;Y;Z:integer;KAD:real); Çift yönlü Transfer :Procedure Altyordam(VAR X;Y;Z:integer;VAR KAD:real); Veri transferinde String değişken veya bir dizi değişken formal parametre olarak tanımlanamaz. String ve dizi değişkenler formal parametre olarak kullanılacaksa, tip bildirisinin özel bir tip ismi olarak verilmesi gerekir. Aşağıda verilen örnekler sözü edilen kurala göre hatalı yazılmışlardır. 45 Procedure Altyordam(A:Array1..100 of real); Procedure Altyordam2(S:String200); Uygun tanımlamalar yapmak için Type bölümünden yararlanılmalıdır. Aşağıda verilen örnek tanımlar özel tip isimler kullanıldığı için geçerlidir. Type Oz=Array1..100 of real; sozcuk=String200; Procedure Altyordam(A:Oz); Procedure Altyordam2(S:Sozcuk); Ana programdan alt programa transfer sırasında tanım bloklarında kullanılan parametrelerin tipleri aynı olmak zorundadır. Aksi takdirde 'Tip Uyuşmazlığı' hatası meydana gelecektir. Aşağıdaki örnek programları inceleyiniz. program paramli1; uses crt; {Windows için Wincrt} var a,b,t:integer; procedure toplam(x,y:integer); begin t:=x+y; end; begin clrscr; 46 readln(a); readln(b); Toplam (a,b); Writeln(t); end. program paramli2; uses crt; {Windows için Wincrt} var a,b,t:integer; procedure toplam(x,y:integer;var z:integer); begin z:=x+y; end; begin clrscr; readln(a); readln(b); 47 Toplam (a,b,t); Writeln(t); end. Yukarıdaki programda X ve Y değerlerinin toplamları Writeln(t); program satırında ekrana yazdırılmaktadır. Aynı programda toplamı yazdırmak istenilen parametre değiştirildiğinde program hata verecektir. Aşağıdaki program derlendiği zaman çalışmayacak ve 3 nolu hata meydana gelecektedir. Programı yazarak hatanın nedenini anlamaya çalışınız. program hatali_paramli; uses crt; {Windows için Wincrt} var a,b,t:integer; procedure toplam(x,y:integer;var z:integer); begin z:=x+y; end; begin clrscr; readln(a); readln(b); Toplam (a,b,t); Writeln(z); end. Örnek : Aşağıdaki örnek programda dizgi isimli tek boyutlu bir dizi oluşturulmuş ve bu dizinin elemanları sıra ile 1-100 arasındadır. Bu dizi değer aldıkça altprograma değer transfer etmekte ve alt programda bu dizinin değerleri random komutu ile rastgele sayılardan oluşan yeni bir diziye aktarılmakta ve ana programa geri dönmektedir. Program degerparametresi; uses crt; {Windows için Wincrt} type DiziTipi=Array[1..100] of integer; var 48 Dizgi:DiziTipi; Yenidizi1,Yenidizi:DiziTipi; K:word; PROCEDURE Ornekleme(Pardizi:DiziTipi;var YeniDizi:DiziTipi); begin Yenidizi[k]:=Random(Pardizi[k]) end; begin for k:=1 to 100 do begin Dizgi[k]:=K; Ornekleme(Dizgi,YeniDizi1); Writeln(Dizgi[k],' ',YeniDizi1[k]); end; While not keypressed do end. 4.b.1.b.Parametresiz Prosedürler Bu tür alt programlarda; alt program içinde kullanılan değişkenler ana program içinde kullanılan değişkenler ile aynıdır. Bu nedenle ana program ile alt program arasında veri transferi yapılmasına gerek yoktur. Aşağıdaki örnek programlar Parametresiz Prosedür kullanımını açıklamaktadır. 49 program faktoriyel_hesabi; uses crt; {Windows için Wincrt} var fakt:longint; n,i:integer; procedure islem1; begin fakt:=1; for i:=1 to n do begin fakt:=fakt*i; end; end; begin clrscr; Write('N sayısını giriniz ='); Readln(N); islem1; Writeln('N sayısının Faktöriyeli =',fakt:10); repeat until keypressed; end. 50 4.b.3. Aidiyet Kuralları(Scope Rules) · Bir sabit veya değşken tanımlandığı proram birimi içerisinde geçerlidir. · Bir alt yordam (procedure veya function) içerisinde tanımlanan değişkene alt program dışında erişilemez. · Ana programın VAR bloğu içerisinde tanımlanan değişkenler(aynı isimli birdeğişken alt yordam içerisinde tanımlanmamışsa) programın her yerinden erişilebileceği için genel(global) değişkenlerdir. · Bir alt yordam içerisinde tanımlanan değişkene, bu alt program içerisinde tanımlanan diğer alt programlar içerisinden erişilebilir. · Eğer SubA alt yordamı SubB alt programından önce tanımlanmışsa SubB alt yordamını çağırabilir. PROGRAM SCOPE; PROCEDURE A; PROCEDURE B; PROCEDURE C; ....... ....... ....... END; {C} PROCEDURE D; ....... ....... ....... END; {D} END; {B} END; {A} END. {Scope} Aşağıdakiler İçinde Tanımlananlar Main A B C D Aşağıdakiler İçin Geneldir Main, A, B, C, D B, C, D C, D C D 51 Aşağıdakiler A B C D Aşağıdakilerce Çağrılabilir Main, B, C, D A, C, D B, D B Aşağıdakiler Main A B C D Aşağıdakileri Çağırabilir A B C, D B, A C, B, A 4.c. Sıralı Veri Tipleri Ondalık sayılar dışında sayılabilir(kesikli) verilerin oluşturduğu bir topluluktur. İlk ve son eleman hariç, her elemanın Bir önceki ve bir sonraki elemanı mevcuttur. Bu veri tipleri ile aşağıdaki fonksiyonlar kullanılırlar. PRED : Bir önceki elemanı verir. SUCC : Bir sonraki elemanı verir. ORD : Elemanın değerini(sırasını) verir. Örnekler: PRED(‘B’) = ‘A’ PRED(-3) = -4 PRED(TRUE) = FALSE PRED(FALSE) = Tanımsız(Undefined) SUCC(‘T’) = ‘U’ SUCC (99) = 100 SUCC (FALSE) = TRUE SUCC (TRUE) = Tanımsız(Undefined) Kullanıcı tarafından tanımlanan sıralı veri tipleri: · Subrange · Enumarated 4.c.1. Subrange Sıralı verilere ait bir alt kümedir. Örnek: VAR NUM : 1..10; KAR : ‘A’..’Z’ 52 4.c.2. Enumarated Sıralı Veri Tipi Kullanıcı tanımlı sıralı veri tipidir. TYPE bölümünde tanımlanır. · Bu tipe ait değerler, kapalı parantez içinde birbirinden virgül ile ayrılmış farklı isimlerden oluşur. · Bu tipe ait değişkenlere PRED, SUCC, ORD fonksiyonları uygulanabilir. · Pascal tarafından veya daha önce kullanıcı tarafından tip tanımında kullanılan sözcükler listede yer alamaz. · Bu tipe ait değerler giriş/çıkış işlemlerinde kullanılamaz.. · Bu tip alt programların başlığında yer alamaz. Örnek: TYPE Days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun); VAR Day : Days; FOR Day := Mon TO Wed DO Hata verir. Writeln(Day); FOR Day := Mon TO Wed DO CASE Day OF Mon : WRITELN(‘MONDAY’); ....... ....... Yazdırma işlemleri bu şekilde yapılabilir. ....... ....... Sun : WRITELN(‘SUNDAY’); END; 4.d. DİZİLER Hangi programlama dili kullanılırsa kullanılsın, değişken tanımlamanın mantığı aynıdır. Saklanacak bilginin tipine göre bir tip seçilir, buna bir isim verilir ve hafızada bu değişken için bir bellek ayrılır. Her değişken için durum aynıdır. Pascal programlama dilinde bu işlemi 53 VAR bölümü içinde yaparız. Eğer aynı özelliklere sahip birden fazla değişkene ihtiyaç duyulursa dizileri kullanırız. Diziler ile aynı tipte birbirleri ile ilgili verileri toplu olarak tanımlayabiliriz. VAR DiziAdı : ARRAY [AltSınır..UstSınır] OF VeriTipi; Örnek: Klavyeden 10 notun giridiği ve ortalamasının ekrana yazıldığı bir program yazın.(Daha sonra bu programı ortalamanın üzerindeki notları verecek şekilde genişletin.) PROGRAM ORTALAMA (Input,Output); VAR Indis : INTEGER; Notlar : ARRAY [1..10] OF INTEGER; Toplam : INTEGER; Ortalama : REAL; BEGIN FOR Indis := 1 TO 10 DO BEGIN WRITE(Indis,’NCI NOT=’); READLN(Notlar[Indis]); END; Toplam := 0; FOR Indis := 1 TO 10 DO Toplam := Toplam + Notlar[Indis]; Ortalama := Toplam/10; WRITELN(‘ORTALAMA=’,Ortalama); END. · · Diziler alt yordam tanımında parametre olarak kullanılacaksa TYPE bölümünde bu dizilere ait tip tanımlamaları yapılmalıdır. Birden fazla boyutlu dizi(çok boyutlu dizi), her bir boyutu birbirinden virgüller ile ayrılarak alt sınırı ve üst sınırı belirtilerek tanımlanır. Örnek: VAR B: ARRAY [1..3, 1..4] OF INTEGER; 4.e. String İşlemleri Stringler Turbo Pascal’da aşağıdaki gibi tanımlanır. Değişken : STRING[uzunluk]; Örnek : 54 TYPE StringArray = STRING[8]; VAR P:StringArray; · · · · · · Sadece STRING (TurboPascal) standart veri tipi ile tanımlanan değişkenler 255 karakter içerir. String değişkenine atanan değer string değişkeninin uzunluğundan büyükse soldan itibaren uzunluğu kadar değer atanır. String değerler karşılaştırma operatörleri ile birbirleri ile karşılaştırılabilir. Karşılaştırmada ascii tablosu karakter indeksi göz önüne alınır. String değişkenleri o READ/WRITE o READLN/WRITELN giriş/çıkış cümlelerinde kullanılabilir. VAR Line : STRING[20]; Şeklinde tanımlanmış string değişkenin; o Line[0] hücresinde stringin o andaki uzunluğu o Line[1] hücresinde stringin ilk karakter değeri o Line[uzunluk] hücresinde stringin son karakter değeri tutulur. Stringler alt yordam tanımında parametre olarak kullanılacaksa TYPE bölümünde bu stringlere ait tip tanımlamaları yapılmalıdır. TYPE String20 : STRING[20]; VAR Line : String20; ....... ....... ....... PROCEDURE P(X:String20); ...... ...... ...... ...... ...... · + operatörü ile iki string birleştirilebilir. Name1 := ‘TURBO’; Name2 := ‘PASCAL’ Name := Name1 + Name2; 55 4.e.1. String Alt Yordamları · LENGTH(String) : Stringin uzunluğunu verir. LENGTH(S) · CONCAT(Str1,Str2,...) : Stringleri birleştirir. · COPY (Value,Başlangıç,Uzunluk) : Value stringi içinden başlangıç indeksinden başalayarak, uzunluk kadar alt stringi başka bir stringe kopyalar. Lastname := COPY(‘ John Smith’,6,5); · POS(İfade,String) : İfadenin String içinde nerede başladığını verir. Location := Pos(‘York’, ‘NewYork’); · INSERT(Kaynak, Hedef, İndeks) : Kaynak içerisindeki stringi, hedef stringinin içine indekste belirtilen yerden itibaren yerleştirir. · DELETE( Hedef, İndeks,Uzunluk) : Hedef stringi içinden indeks sayısının belirttiği karakterden başlayarak uzunluk kadar alt string silinir. Örnek: City := ‘NewYork City’; DELETE(City,8,5); · STR(Sayı, Sonuç) : Sayı içerisindeki sayısal değeri strnge dönüştürerek sonuç string değişkenine aktarır. Örnek: STR(‘123’,Numstring); · VAL(String, Sayı, HataKodu) : String içinde ifadeyi sayısal değere dönüştürerek sayı değişkenine aktarır, eğer bir hata oluşursa HataKodu değişkeninden öğrenebilirsiniz. o Eğer string değeri sayısal değere dönüştürülebiliyorsa, HataKodu değişkeni 0 değeri alır. 56 o Eğer string değeri sayısal değere dönüştürülemiyorsa, string içinde dönüştürülemiyen karakterin yeri HataKodu değişkenine aktarılır. Örnek : VAL(‘123a’, Sayı, HataKodu) işletildiğinde HataKodu 4 değerini alır. 4.f. Kayıtlar(Records) Birden fazla farklı tipte değişkenin anlamlı bir bütün oluşturduğu durumlarda yeni bir yapıya ihtiyaç duyarız. Pascal programlama dili bu ihtiyacı Record yapısı ile karşılar. · Record Tipi TYBE bölümünde tanımlanır. TYPE EmpRecord = RECORD Name : STRING[15]; Age : INTEGER; Dep : INTEGER; HRate : REAL; END; · VAR bölümünde tanımlanan record tipinde olan değişkenler tanımlanır. VAR Person : Emp; · Record’ı bir paket(kayıt), içerdiği değişkenleri ise bir eleman(alan) olarak görebiliriz. · Bir kayıta atama yapıldığında her bir alanına ayrı ayrı atama yapılır. Person.Name := ‘Ali UZUN’ Person.Age := 35; Person.Dep := 2; Person.Hrate := 2.5; 57 · Kayıtlara değer okuma, kayıt değerlerini yazdırmak istendiğinde, her bir alan ayrı ayrı giriş/çıkış işlemlerine tabi tutulurlar. READLN(Person.Name,Person.Age,Person.Dep,Person.Hrate); WRİTELN (Person.Name,Person.Age,Person.Dep,Person.Hrate); · İç içe kayıt tanımları yapılabilir. TYPE EmpRec = RECORD Name : STRING[15]; Age : INTEGER; Dep : INTEGER; HRate : REAL; Birth = RECORD; Month : STRING[8]; Day : 1..31; Year : 1900..2100; END; END; Veya TYPE BirthDay = RECORD; Month : STRING[8]; Day : 1..31; Year : 1900..2100; END; 58 EmpRec = RECORD Name : STRING[15]; Age : INTEGER; Dep : INTEGER; HRate : REAL; Birth :BirthDay; END; · Aynı alan isimleri farklı veya iç içe kayıt kayıtlar içerisinde kullanılabilir, fakat bir kayıt içinde birden fazla aynı isimli alan bulunamaz. · Kayıt ismi WITH cümlesi ile kullanılırsa alan isimlerinin önüne kayıt ismi yazmak gerekli değildir. VAR Employee : EmpRec; Date : BirthDay; WITH Employee DO READLN(Age,Dep,Hrate); WITH Employee DO WITH Birth DO READLN(Age,Dep,Month,Day); Veya WITH Employee,Birth DO READLN(Age,Dep,Month,Day); · Kayıt Dizileri normal dizilerin tanımlandığı şekilde tanımlanırlar. TYPE 59 EmpRec = RECORD Name : STRING[15]; Age : INTEGER; Dep : INTEGER; HRate : REAL; Birth = RECORD; Month : STRING[8]; Day : 1..31; Year : 1900..2100; END; END; ArrType = ARRAY [1..100] OF EmpRec; VAR Dizi1 : ARRAY [1..100] OF EmpRec; Dizi2 : ArrType; UYGULAMA Bilgisayar programlaması dersinin sınav sonuçları ‘C:\DATA\SINAV.DAT’ dosyasına yazılmıştır. Dosyanın her bir satırına bir öğrencinin bilgileri kaydedilmiştir. Her satıra öğrencinin adı, soyadı, doğru yanlış türü sınav sorularının cevapları olarak D(doğru), Y(yanlış), B(boş) bilgileri girilmiştir. Sınav soruları 100 adettir. Satırdaki her veri arasında bir boşluk bulunmaktadır. a. Cevap anahtarının klavyeden girildiği b. Her bir öğrencinin adını, soyadını ve sınav sonucunu, sınıfın öğrenci mevcudunu, ortalamasını ve başarı oranını(geçme notu=50) ‘C:\DATA\SONUC.DAT’ dosyasına 60 yazdırıldığı bir pascal programı yazın. Çıktı Örneği : Kemal ŞAHİN 95 Mustafa KURT 96 ........ ........ ........ ........ ........ ........ ........ ------------------------------------Mevcut : ....... Ortalama = ....... Başarı = %....... 61 5.Görsel Programlama Ortamı ve Temel Kavramlar 5.a. Projeler İle Çalışma · · · · · · · · · Visual Basic Projesi Nedir? Project Explorer Kullanmak Yeni Proje Yaratmak Projenin Özelliklerini Değiştirmek Projeyi İsimlendirmek ve Kaydetmek Mevcut Projeyi Açmak Projeye Dosya Eklemek Projeden Dosya Çıkarmak Proje Grupları İle Çalışmak Visual Basic Projesi Nedir? Bir proje ile uygulama aynı anlama gelmez. Bir proje, herhangi bir uygulama geliştirmek için kullandığımız bir araçtır. Projeler ile geleneksel uygulamalar dışında dynamic link library (dll) ve ActiveX kontrolleri geliştirebiliriz. Bir program geliştirirken , formları, modülleri ve kontrolleri bir proje içinde yönetip, derleyerek Visual Basic uygulaması geliştirebiliriz. Visual Basic’de proje, programı oluşturan dosyaların oluşturduğu bir guruptur. Formlar, modüller, grafikler, kontroller hatta başka tip dosyalar projeyi oluşturur. Proje hakkında akılda tutulması gerekli ilk nokta, programı geliştirirken proje içindeki her dosya diskte ayrı ayrı kaydedilir. Proje İçinde Yer Alabilecek Dosya Tipleri Dosya Uzantısı Tanımı FRM Form BAS Modül FRX Form üzerindeki grafik nesneler için otomatik oluşturulan dosya OCX ActiveX kontrol CLS Sınıf Modülü VBP Visual Basic proje dosyası 62 Proje dosyasında projede kullanılan dosyalar hakkında detaylı bilgi bulunur. Proje dosyasında birleştirilmiş geliştirme ortamının(IDE) ayarları, proje ismi, projede yer alan dosyaların listesi gibi bilgiler yer alır. Proje dosyalarının uzantıları VBP’dir. Project Explorer Kullanmak Projeniz içindeki dosyaları Project Explorer içinde yönetebilirsiniz. Project Explorer IDE’nin sağ tarafında bulunur (Şekil 5.a.1). Project Explorer penceresi proje dosyalarınızı yönetecek onları form veya kod penceresinde görüntüleyecek metodlar içerir. ŞEKİL 5.a.1 Project Explorer kullanımı. OCX and FRX dosyaları Project Explorer penceresinde listelenmezler. Project Explorer içerisinde yapılacak işlerin çoğu context menü aracılığı ile yapılır.Proje dosyaları üzerine sağ tıklarsanız Şekil 5.a.2.de görülen context menüye ulaşabilirsiniz. 63 ŞEKİL 5.a.2 Project Explorers context menü. Context menu ile aşağıdaki işlemleri gerçekleştirebilirsiniz. · · · · · · · · Dosyayı form veya kod penceresinde görüntülemek, Dosyanın özelliklerini görüntülemek, Projeye dosya eklemek, Seçilen dosyayı kaydetmek, Seçilen dosyayı silmek, Dosyayı yazdırmak, Project Explorer penceresinin tipini (float veya dock) değiştirmek, Project Explorer penceresini gizlemek. 64 Yeni Proje Yaratmak Visual Basic her çalıştırılışında New Project diyalog kutusu karşınıza çıkar. Bu projede yaratmak istediğiniz proje tipini seçin ve Open düğmesine basın. Şekil 5.a.3 Yeni proje yaratmak. Visual Basic açıkken de yeni bir proje yaratmak mümkündür. Bunun için: 1. File menüsünden, New Project seçilir. (New project seçilince eski projenin kaydedilip edilmeyeceği sorulur.) 2. New Project dialog kutusundan proje tipi seçilip OK düğmesine basılır. Projenin Özelliklerini Değiştirmek Proje ismi, sürüm numarası ve başlık gibi projeyi tanımlayan bilgilerin tanımlanması gereklidir. Bunlar ve diğerlerine Project properties diyalog kutusundan erişilebilir(Şekil 5.a.4 ve 5.a.5). 65 FIGURE 5.a.4 Project properties diyalog kutusu General sekmesi. FIGURE 5.a.5 Project properties diyalog kutusu Make sekmesi. Project Properties diyalog kutusuna erismek için 66 1. Project Explorer penceresinde proje dosyası üzerindeyken sağ fare tuşuna basınız., 2. Context Menüden, ProjectName Properties elemanını seçin. Projeyi İsimlendirmek ve Kaydetmek Projeyi kaydederken aynı zamanda projeyi oluşturan bağımsız dosyaları da kaydedersiniz.(form,modül,grafik vb). Eğer projeyi ilk defa kaydediyorsanız Visual basic önce her dosyanın ayrı ayrı kaydedilmesini ister, en sonunda ise proje dosyası kaydedilmelidir. Projeyi kaydetmek 1. File menüsünden, Save Project. Seçilir. 2. Eğer proje ilk defa kaydediliyor veya projeye yeni dosyalar eklenmişse kaydedilmemiş her bir dosya için Save File As diyalog kutusu açılır. (Şekil 5.a.6). ŞEKİL 5.a.6 Visual Basic otomatik olarak frmFirst isimli form için frmFirst.frm dosya ismi önerir. 3. Dosya için bir isim girin ve Save düğmesine basın 4. Kaydedilecek son dosya Proje dosyasıdır. VB otomatik olarak Project_name.vbp’yi dosya ismi olarak önerir. Eğer proje ismi girmemişseniz, VB varsayılan isim olarak Project1.vbp’yi önerir. Böyle bir durumda daha anlamlı bir isim vermeniz önerilir.(Örneğin SaveTest.vbp gibi.) 67 Mevcut Projeyi Açmak Daha önce çalıştığınız projeleri açmak için File menüsünü açtığınızda bu menünün alt kısmında yer alan ve son zamanlarda çalışılan proje isimlerinden yararlanabilirsiniz. Visual Basic açıldığında Mevcut Projeleri açmak Visual Basic açıldığında, New Project diyalog kutusu görünür. Mevcut projelere doğrudan bu diyalog kutusundan erişebilirsiniz. Eğer her açılışta bu diyalog kutusunu görmek istemiyorsanız alttaki onayı kaldırın. Mevcut projeyi açmak 1. File menüsünden, Open Project elemanını seçin. Open Project diyalog kutusu açılır.(Şekil 5.a.7). ŞEKİL 5.a.7 Open Project diyalog kutusu. 2. Existing sayfasından, açmak istediğiniz projenin klasöründen proje dosyasını seçin veya son zamanlarda çalıştığınız projeyi Recent sayfasından seçin. 3. Open düğmesine basın. 68 Projeye Dosya Eklemek Genellikle programlarınız birden fazla form ve modül içerirler. Bu durumda projeye yeni form veya modül eklemek gerekir. Projelerinize yeni dosyaları iki türlü ekleyebilirsiniz.(Project menüsünden veya Project Explorer penceresinden) Project Explorer İçerisinden Yeni Dosya Eklemek 1. Project Explorer içerisinden sağ fare tuşuna basın. 2. Gelen context menüden Add, ve dosya tipini seçin. Hangi metodu seçerseniz seçin , seçmek istediğiniz form veya modülün çok kullanılan kalıplarını içeren bir diyalog kutusu ekrana gelir(Şekil 5.a.8), kullanacağınız kalıbı seçip Open düğmesine basın. ŞEKİL 5.a.8 Add Form diyalog kutusu. Gerek Project menüsünden, gerekse Project Explorer penceresinin context menüsünden Add File seçilirse, ekrana gelen dosya açma diyalog kutusundan var olan dosyalar projeye eklenebilir.(Şekil 5.a.9) 69 ŞEKİL 5.9 Add File. Projeden Dosya Çıkarmak Eğer projenizde istemediğiniz bir dosya varsa projeden çıkarabilirsiniz. Bir dosyayı projeden çıkarırsanız disk üzerinde kalır. Bundan sonra silmek istiyorsanız windows explorer kullanın. Projeden Dosya Çıkarmak 1. Project Explorer penceresinde çıkarmak istediğiniz dosyayı seçin ve sağ fare tuşuna basın, 2. Gelen context menüden Remove dosyaismini seçin. Aynı zamanda Project Explorer penceresinde çıkarmak istediğiniz dosyayı seçip, Project menüsünden Remove dosyaismini seçin. Proje Grupları İle Çalışmak Visual Basic 6 aynı anda birden fazla proje ile çalışmanıza izin verir. Çalışılacak bütün projeler bir proje gurubu içinnde toplanıp, VBG uzantısı ile kaydedilebilir. Aynı yapıya ihtiyaç duyulduğunda proje gurup dosyasının açılması yeterlidir. Proje gurubuna proje eklemek 1.File menüsünden Add Project seçilir. 70 2.Add Project diyalog kutusu aracılığı ile yeni veya varolan bir proje seçilir. 3.OK düğmesine basılır. Visual Basic otomatik olarak bir proje gurubu oluşturur ve yeni projeyi bu guruba dahil eder. ŞEKİL 5.a.10 Project Explorer aynı anda birden fazla projeyi proje gurubu içinde yönetir.F5 tuşuna basıldığında Kalın harflerle ismi yazılı proje çalıştırılır. Proje gurupları ActiveX kontrolleri yaratırken önem kazanır, bu durumda birden fazla projenin aynı anda açık olması gerekir. 5.b. Kontrollerin Kullanımı · · · · · · · · Formlar ve Kontroller Nedir? Temel Kontroller Nelerdir? Kontrollerin Eklenmesi, Çıkarılması Kontrolleri İsimlendirmenin Önemi Bir Kontrol Nasıl Boyutlandırılır, Konumlandırılır? Formun Boyutunu Değiştirmek Kontrolleri Guruplamak Kontroller Ekleyerek Visual Basic’i Genişletmek Formlar ve Kontroller Nedir? Visual Basic içerisinde formlar, oluşturduğunuz programların temel yapı taşlarıdır. Formlar kullanıcıların programla etkileşimde bulundukları nesnelerin üzerine 71 konuldukları yapılardır. Formlar üzerindeki nesneler (ifadelerin girildiği metin kutuları, tıklanan düğmeler vb.) kullanıcı ile etkileşimi sağlayan kontrollerdir. Temel Kontroller Nelerdir? Programlarınızı yaparken çoğunlukla az sayıda fakat oldukça kullanışlı kontroller kullanırız. Bu kontroller ile programlarınıza düğmeler, onay kutuları, etiketler ve metin kutuları vb. kontrolleri ekleyebilirsiniz. Bu kontroller ile diskinizde bulunan dosyaları görebilir hatta veritabanını okuyabilirsiniz. Bunlara temel kontroller denir. Temel kontroller araç kutusu üzerinde bulunur.(Şekil 5.b.1) Tablo 5.b.1.de temel kontroller listelenmiştir. ŞEKİL 5.b.1 Bir kontrolü seçmek için üzerine tıklamak yeterlidir. TABLO 5.b.1 Visual Basic 6 Temel Kontrolleri Kontrol Label(Etiket) Tanımı Form üzerinde yazıları göstermek için kullanılır. Frame(Çerçeve) Üzerindeki kontrolleri guruplamak için kullanılır. CheckBox(Onay Kutusu) Kullanıcılara bir seçeneği seçip seçmemesine imkanı verir. ComboBox(Kapalı Liste Kutusu) Kullanıcılara listeden bir değer seçmelerine veya listeye değer girmelerine imkan verir. 72 HscrollBar(Yatay Kaydırma Çubuğu) Timer(Zaman) Diğer bir konrol içerisindeki veriyi yatay olarak kaydırır. Belirli zaman aralıklarında programın bir işlemi gerçekleştirmesini sağlar. DirListBox(Dizin Liste Kutusu) Kullanıcıya dizin seçme imkanı verir. Shape(Şekil) Form üzerine şekil çizmeye yarar. Image(Görüntü) Form üzerine resim konulması için kullanılır. Kontrolleri guruplamada kullanılmaz. OLE Container(ole nesnesi) Bir konrol programının işlevselliğini programınıza ekler. PictureBox(Resim Kutusu) Form üzerine resim konulması için kullanılır. Kontrolleri guruplamada da kullanılır. TextBox(Metin Kutusu) İfadeleri göstermek, veri girmek ve düzeltmek için kullanılır. CommandButton(Komut Düğmesi) Kullanıcının tanımlayacağı bir işlemin yapılması için kullanılır. OptionButton(Seçenek Düğmesi) Bir seçenek gurubu içerisinde bir seçeneğin seçiminde kullanılır. ListBox(Liste kutusu) Listeden bir eleman seçmek için kullanılır. VscrollBar(Düşey Kaydırma Çubuğu) Diğer bir konrol içerisindeki veriyi düşey olarak kaydırır. DriveListBox(Sürücü Liste Kutusu) Kullanıcının bir sürücü seçmesini sağlar. FileListBox(Dosya Liste Kutusu) Kullanıcıya dosya seçme imkanı verir. Line(Çizgi) Form üzerine çizgi çizilmesini sağlar. Data Programın bir veritabanı ile bağlantı kurmasını sağlar. Kontrollerin Eklenmesi, Çıkarılması Araçlar kutusu üzerinde yer alan kontroller üzerine çift tıklanarak veya taşınarak form üzerine eklenir. Form üzerine kontrolun taşınması 1. Kontrolun araç kutusu üzerindeki sembolüne tıklanır. 2. Fare ile form üzerine gelindiğinde imlecin şekli + olur. Kontrolün yerleştirileceği yere farenin sol tuşu ile tıklayın. 73 3. Fare sol tuşu basılı iken, fare sola çekilirse bir kutu görünür. 4. Kutu uygun konuma geldiğinde çekme işlemi bitirilip, fare sol tuşu bırakılır. ŞEKİL 5.b.2 Kontrolun form üzerine konumlanması. Kontrolun form üzerinden silinmesi 1. Form üzerinden silinmek istenen kontrol fare ile seçilir. Seçilen kontrolun her köşesinde bir kutucuk belirir. 2. Delete tuşuna basılırak veya sağ tuşa tıklandığında gelen menüden delete elemanı seçilerek, kontrol form üzerinden silinir. ŞEKİL 5.b.3 Form üzerinden kontrolun seçilmesi. 74 Kontrolleri İsimlendirmenin Önemi Bir kontrolun en önemli özelliklerinden biri ismidir. Çünkü kontrol program içerisinde ismi ile kullanılır. Bir kontrolu form üzerine koyduğunuzda visual basic tarafından otomatik olarak önceden belirlenmiş isimler ile adlandırılırlar.(Command1,Text1 vb). Ancak form üzerinde aynı tipten birden fazla kontrol farklı amaçlar için kullanılacaksa otomatik olarak adlandırılması yerine, yapacağı işe uygun bir isimle kullanıcı tarafından adlandırılması daha doğru olacaktır. Kontrolun isimlendirilmesi 1. Forma eklenen kontrolün seçildiğinden emin olun.(Seçildiğinde kontrol köşelerinde birer kutucuk belirir.) 2. Özellikler(Properties) penceresinde, sağ kolondaki kontrol ismi üzerine tıklanır.(Şekil 5.b.4) 3. Mevcut isim silinir, istediğiniz isim yazılır. ŞEKİL 5.b.4 Özellikler(Properties) penceresinde kontrol ismini değiştirebilirsiniz. Kontrola verilecek isim, kontrolun tipini ve ne yapacağını belirten bir isim olmalıdır. Verilecek ismin ilk üç karakteri kontrolün tipini bildiren önek olması ve diğer karakterlerin kontrolun program içinde ne yaptığını tanımlayan bir ifade olması tercih edilmelidir. İsim içinde boşluk bulunmamalıdır. TABLO 5.b.2 Temel Kontrolları İsimlendirmede Kullanılan Önekler Control Prefix Control Prefix Label lbl PictureBox pic Frame fra TextBox txt CheckBox chk CommandButton cmd 75 ComboBox cbo OptionButton opt HscrollBar hsb ListBox lst Timer tmr VscrollBar vsb DirListBox dir DriveListBox drv Shape shp FileListBox fil Image img Line lin Data dat OLE Container Control ole Örneğin, bir komut düğmesi(CommandButton) programı kapatmak için kullanılacaksa, öneki cmd olacak şekilde cmdKapat şeklinde isimlendirilir. Bir Kontrol Nasıl Boyutlandırılır, Konumlandırılır Kontrolu form üzerine yerleştirirken gerçek boyutlarında çizmek mümkün değildir. Kontrolu fare ile boyutlandırmak 1. Araç kutusundan imleci seçin. 2. Form üzerinden boyutlandırmak istediğiniz kontrolu seçin. 3. Seçilmiş olan kontrolun köşelerindeki kutucukları farenin sol tuşuna tıklayarak, sol tuşa basılı tutarak kontrolu boyutlandırın. ŞEKİL 5.b.5 Form üzerindeki kontrolun boyutlandırılması Kontrolun konumunu değiştirmek için kontrol üzerine tıklayıp yeni konumuna çekin. Formun Boyutunu Değiştirmek Proje içinde açılan her yeni form standart boyutları ile oluşturulur. Tasarımınız ve kullanacağınız kontroller formun boyutlarını değiştirmenizi gerektirebilir. Bu durumda form seçili iken formun etrafında oluşan tutamakları kullanarak formun boyutunu değiştirebilirsiniz. 76 ŞEKİL 5.b.6 Kullanılan kontrollere uygun olarak formu boyutlandırmak. Kontrolleri Gruplamak Bazı kontroller üzerinde bulunan kontrolleri guruplamak için kullanılırlar. Bu kontrol(frame,picture box vb) taşıyıcı veya kap olarak değerlendirilebilir. Bu kontrolün kapsadığı kontroller taşıyıcıları ile birlikte hareket ettirilebilir veya silinebilir. Kontrol gurubuna yeni bir kontrol dahil etmek için araç kutusundan yeni bir kontrol seçip, taşıyıcı kontrol üzerine çizmek gerekir. Kontrolleri guruplamak kod içerisinde de özellikle kontrollerin boyutlandırılması ve konum değişikliklerinde önemlidir. Kontrolleri Ekleyerek Visual Basic’i Genişletmek Temel kontroller oldukça kullanışlı ve güçlü olmasına rağmen programlama ihtiyaçlarınızı karşılamada yetersiz kalabilmektedir. Bu durumda aarç kutusunda varsayılan kontroller arasında bulunmayan fakat Visual Basic ile beraber gelen ActiveX kontroller kullanılabilir. Bunlar araç kurusuna eklenebilirler. 77 Add controls to the Toolbox 1. Project menüsünden, Components elemanını seçin. 2. Components diyalog kutusunda , kontrols sayfasında Selected Items Only onay kutusundaki işareti kaldırınca bilgisayarınızdaki kullanabileceğiniz ActiveX kontrollerinin listesini görebilirsiniz. 3.Listeden eklemek istediğiniz kontrolun yanındaki onay kutusunu işaretleyin. ŞEKİL 5.b.7 Araç kutusuna eklenecek kontrolun seçimi. 4. OK düğmesine basın. Seçtiğiniz kontrolun araç kutusuna eklendiğini göreceksiniz. Eklenen yeni kontrolleri diğer temel kontrolleri kullandığınız şekilde kullanabilirsiniz. 78 ŞEKİL 5.b.8 Kontrollerin araç kutusuna eklenmesi. 79 5.c. Özellik, Metod ve Olay Kavramları · · · Özellik, Metod ve Olay Nedir? Olaya Yönelik Programlamanın Önemi Örnek Bir Programda Özellik, Metod ve Olay Kullanımı o Grafik AraYüzü Oluşturmak. o Form_Load() Olay Yordamın Programlamak o Click() Olayını Programlamak o Olayları Rapor Etmek Özellik, Metod ve Olay Nedir? Özellikler nesneleri tanımlamaya yararlar. Metodlar nesnelerin bir iş yapmalarını sağlarlar. Olaylar ise nesnelerin yaptıkları işler sonucu oluşurlar. Her nesnenin örneğin formun kendisini tanımlayan özellikleri vardır. Birçok nesnenin ortak özellikleri aşağıdaki tabloda verilmiştir. Seçili bir nesnenin özelliklerine birleştirilmiş geliştirme ortamının Özellikler(Properties Window) penceresinden erişilebilir. TABLO 5.c.1 Visual Basic Kontrollerinin Ortak Özellikleri Özellik Tanım Left Kontrolun sol köşesinin x koordinatı Top Kontrolun üst köşesinin y koordinatı Height Kontrolun yüksekliği Width Kontrolun genişiliği Name Kontrolun İsmi Enabled Kullanıcının kontrolu kullanıp kullanımayacağını belirtir, (true/false) değeri alır. Visible Kontrolun forö üzerinde görünüp görünmeyeceğini belirtir, (true/false) değeri alır. Bir diğer önemli özellik BorederStyle olup,formun üst barında bulunan pencere elemanlarını(maximize, minimize düğmeleri vb.) belirler. TABLO 5.c.2 BorderStyle Özelliğinin Alabileceği Değerler Değer 0-None Anlamı Sınırları, başlığı olmayan hareket ettirilemeyen form oluşur. 1-Fixed Single Form köşelerinden çekilerek boyutlandırılamaz fakat Maximize ve 80 Minimize düğmeleri vardır 2-Sizable (varsayılan) Form köşelerinden çekilerek boyutlandırılabilir, Maximize ve Minimize düğmeleri vardır 3-Fixed Dialog Boyutlandırılamaz ve Maximize/Minimize düğmeleri yoktur, diyalog kutusu oluşturmada kullanılır. 4-Fixed ToolWindow 3 ile aynıdır fakat başlığı biraz dar ve başlıkta kullanılan fontlar ve Close düğmesi küçüktür, kayan araç çubukları yapmak için kullanılır. 5-Sizable ToolWindow 4 ile aynıdır fakat köşelerinden çekilerek boyutlandırılabilir.Visual Basic Özellikler penceresi gibi pencerelerin tasarımında kullanılır. ŞEKİL 5.c.1 Bir formun BorderStyle özelliği 6 farklı stil değeri alabilir. Metodlar bir formun bir yerden başka yere taşınması gibi kontrollerin farklı işlemleri nasıl yapacağını belirtmek için tasarlanmış program parçalarıdır. Her kontrolun farklı metodları vardır. Ortak metodlar aşağıda listelenmiştir. TABLO 5.c.3 Visual Basic Kontrollerinin Ortak Metodları Metod Move Kullanımı Programdan gelen bir isteğe bağlı olarak bir nesnenin konumunu değiştirir. Drag Kullanıcının kontrolu çekip bırakma işlemini yönetir. SetFocus İmleci ait olduğu kontrol üzerinde konumlar. ZOrder Ait olduğu kontrolun ekranda önde veya arkada olmasını belirler. 81 Olaylar program ile etkileşirken sistem tarafından algılanan eylemlerdir. Örneğin, bir kullanıcı form üzerindeki bir düğmeye bastığında birçok olay oluşur. Fare tuşuna tıklanır, formun düğmesi tıklanır ve fare tuşu bırakılır. Bunlar sırası ile MouseDown olayı, Click olayı ve MouseUp olayına karşılık gelir. Her kontrolun farklı olayları vardır. Ortak olaylar aşağıda listelenmiştir. TABLO 5.c.4 Visual Basic Kontrollerinin Ortak Olayları Olay Change Oluşumu Metin kutusu veya veri giriş kontrollerinde veri girerken veya düzeltirken. Click Kullanıcı bir nesne üzerinde mouse tuşuna bastığında. DblClick Kullanıcı bir nesne üzerinde mouse tuşuna çift tıkladığında. DragDrop Kullanıcı bir nesneyi başka konuma taşıdığında. DragOver Kullanıcı bir nesneyi başka nesne üzerine taşıdığında. GotFocus İmleç bir nesneye konumlandığında. KeyDown İmleç bir nesne üzerindeyken klavye tuşlarına basıldığında. KeyPress İmleç bir nesne üzerindeyken klavye tuşlarına basılıp bırakıldığında. KeyUp İmleç bir nesne üzerindeyken klavye tuşu serbest bırakıldığında. LostFocus İmleç nesneyi terkettiğinde. MouseDown İmleç bir nesne üzerindeyken fare tuşuna basıldığında. MouseMove İmleç bir nesne üzerinde hareket ettirildiğinde. MouseUp İmleç bir nesne üzerindeyken fare tuşu serbest bırakıldığında. Olaya Yönelik Programlamanın Önemi Visual Basic içinde bir program yazarken genellikle olaya yönelik programlama yapıyorsunuz demektir.Olaya yönelik programlama demek yazdığınız kodun çoğu kullanıcıların programla bir iş yaptıklarında veya Windows ortamında bir şeyler olduğunda çalışması demektir. Bu şekilde programlama yapmak olayların ne zaman olacağını bilmek ve programın olaylara nasıl cevap vereceğini bilmek gerekir. Windows ve Visual Basic işlerin çoğunu sizin için yapar. Herhangi bir olay olduğunda , Windows programınıza bir mesaj gnderir. Programınız bu mesajı okur, bu olay için yazdığınız kodu çalıştırır. Bu olay için kod yazmamışsanız, programınız olayı dikkate almaz. Genel olarak bu kod bir yordamdır ve programınızın içinden çağrılabilir bir kod bloğudur.Yordam formatı aşağıda verilmiştir 82 [Public|Private] [Static] Sub|Function|Property _ function_name (arguments) [As Type] {...Your procedure code...} End Sub|Function|Property Bir olay yordamı, bir olay olduğunda buna cevap olarak çalıştırılacak kodu, projeniz içinde yazmaya başlayacağınız yerdir. Olay yordamları kod penceresi içerisinde yazılırlar. Kod penceresine aşağıdaki işlemlerden birini uygulayarak erişebilirsiniz. · Nesne üzerinde çift tıklayarak, · Fare ile nesneyi seçip F7 tuşuna basarak, · Fare ile nesneyi seçip View menüsünden Code seçeneğine tıklayarak, · Project Explorer penceresinden nesnenin formunu seçip, View Code düğmesine tıklayarak. ŞEKİL 5.c.2 Bir olay yordamı örneği Code penceresinden bir olay seçtiğinizde Visual Basic otomatik olarak bir olay yordamı üretir. Şekil 5.c.2 de, olay yordamlarının nesne ismi, alt çizgi ve takip eden olay ismi ile isimlendirildiğini görebilirsiniz (cmdExit_Click()). Bu örnekte, cmdExit komut düğmesine tıklandığında ekrana bir mesaj kutusunun çıktığı görülür. Örnek Bir Programda Özellik, Metod ve Olay Kullanımı Özellik, Metod ve Olay Kullanımına örnek vermek için MoveIt isimli bir uygulama geliştirilecektir. 83 ŞEKİL 5.c.3 MoveIt isimli program arayüz üzerindeki düğmelere tıklandıkça formu ekran üzerinde hareket ettirir. MoveIt frmMove formu ve bu formun içerdiği formun köşelerine yerleştirilmiş komut düğmelerinden oluşur. MoveIt uygulamasını çalıştırdığınızda arayüzün içerdiği düğmelere tıklayarak formu ilgili köşelere hareket ettirebilirsiniz. Formun ortasındaki metin kutusunda ise oluşan olayı görebilirsiniz. MoveIt uygulamasının oluşturulması (genel adımlar) 1. Grafik ara yüzü(graphical user interface =GUI) olu şturun. 2. Form_Load() olay yordamını kodlayın. 3. Click() olay yordamını kodlayın. 4. Oluşan olayı rapor eden kodları hazırlayın. Grafik AraYüzü Oluşturmak 1. File menüsünden New Project elemanını seçin. Ekrana gelen New Project diyalog kutusundan Standard EXE’yi seçin. 2. Proje formunun ismini Özellikler penceresi içinde frmMove olarak değiştirin. 3. frmMove formunun köşelerine birer komut düğmesi, ortasına ise bir etiket yerleştirin. 4. Etiketi ve dört komut düğmesini şekil 5.c.4.e göre özellikler penceresi içinde isimlendirin. 84 ŞEKİL 5.c.4 Ara yüz tasarımı. 5. Formun BorderStyle özellik değeri olarak 1-Fixed Single seçin. Bu değer çalışma zamanında formun boyutlandırılmasını önleyecektir. Ayrıca etiketin BorderStyle özelliğine Alignment 2-Center değeri verin. 6. Formu frmMove.frm ve projeyi MoveIt.vbp olarak kaydedin. Form_Load() Olay Yordamını Programlamak Formun ekranda gösterilmesinden önce yapacağınız şeyleri hazırlamak için Form_Load() olay yordamı kullanılır. Bu yordam içinde aşağıdaki olaylar gerçekleştirilecektir. · Komut düğmelerinin üzerlerine yazıları yazılacak. Etiketin üzerine ilk değeri yazdırılacak. · Formun başlığı yazdırılacak. · 4 komut düğmesinin ve etiketin konumları belirlenecektir. · 85 Formun üzerinde herhangi bir yere(kontroller d ışında) çift tıklandığında, Code penceresinde Form_Load() olay yordamı açılır. Sonra Liste 5.c.1.deki kodu girin. ‘ ile başlayan satırlar açıklama satırlarıdır, kodun okunabilirliğini sağlarlar anacak icra edilmezler. LISTE 5.c.1 frmMove Formunun Form_Load() Olay Yordamı 01 `Set the Caption property of the CommandButtons 02 cmdTopLeft.Caption = "Top Left" 03 cmdTopRight.Caption = "Top Right" 04 cmdBottomLeft.Caption = "Bottom Left" 05 cmdBottomRight.Caption = "Bottom Right" 06 07 `Clear the initial text of the label 08 lblNotify.Caption = "" 09 10 `Set the form's title bar text 11 frmMove.Caption = "MoveIt" 12 13 `The rest of the code centers the form on the 14 `screen, sets the position of the four 15 `CommandButtons, and sets the size and 16 `position of the label. 17 18 `Center the form on the screen. This works by 19 `setting the Left side of the form to the center 20 `of the screen, less half the width of the form. 21 `Also, the Top of the form is set to the center 22 `of the screen, less half the height of the form. 23 frmMove.Left = (Screen.Width - frmMove.Width) / 2 24 frmMove.Top = (Screen.Height - frmMove.Height) / 2 25 26 `Set the Left edge of the buttons. The 200 setting 27 `for the left buttons sets a space between the edge 28 `of the form and the buttons. The right buttons are 29 `set by subtracting the width of the button from 30 `the width of the form, and subtracting 300 to 31 `set a space between the button and the form edge. 32 cmdTopLeft.Left = 200 33 cmdBottomLeft.Left = 200 34 cmdTopRight.Left = _ frmMove.Width - cmdTopRight.Width - 300 35 cmdBottomRight.Left = _ frmMove.Width - cmdBottomRight.Width - 300 36 37 `Set the Top edge of the buttons. This is done 38 `similar to setting the Left edge. 39 cmdTopLeft.Top = 200 40 cmdBottomLeft.Top = _ frmMove.Height - cmdBottomLeft.Height - 500 41 cmdTopRight.Top = 200 42 cmdBottomRight.Top = _ frmMove.Height - cmdBottomRight.Height - 500 43 44 `Set the size of the label 45 lblNotify.Height = 360 46 lblNotify.Width = 3000 47 48 `Center the label within the form. This is done 49 `similar to centering the form. 50 lblNotify.Left = _ 86 (frmMove.Width - lblNotify.Width) / 2 51 lblNotify.Top = _ (frmMove.Height - lblNotify.Height) / 2 – 200 ŞEKİL 5.c.5 Olay yordamlarınızı birleştirilmiş geliştirme ortamının Code penceresinde yazabilirsiniz. Click() Olayını Programlamak Formu ekranda hareket ettirmek için Click() olay yordamın kullanacağız. Bunun için olay yordamın yazacağımız komut düğmesi üzerinde çift tıklandığında o komut düğmesine ait Click() yordamı Code penceresinde görülür.Liste 5.c.2. de verilen kodları ilgili yordamlara girin. LISTE 5.c.2 Komut Düğmelerinin Click() Olay Yordamları 01 02 03 04 05 06 Private Sub cmdBottomLeft_Click() `Set the value of the form's TOP property `to the bottom of the screen but bring `it up the height of the screen so that the `bottom of the form is on the bottom of 87 07 08 09 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 `the screen frmMove.Top = Screen.Height - frmMove.Height `Set the value of the form's LEFT property `to the far left of the screen. frmMove.Left = 0 End Sub Private Sub cmdBottomRight_Click() `Set the value for the form's TOP property to `the bottom of the screen, but bring the TOP `up the HEIGHT of the form so that the bottom `of the form is on the bottom of the screen. frmMove.Top = Screen.Height - frmMove.Height `Set the value of the form's LEFT property to `the right of the screen but bring it across `the screen the width of the form so that the `right side of the form is on the right `side of the screen frmMove.Left = Screen.Width - frmMove.Width End Sub Private Sub cmdTopLeft_Click() `Set the value of the form's TOP property `to the top of the screen. frmMove.Top = 0 `Set the value of the form's LEFT property `to the left of the screen. frmMove.Left = 0 End Sub Private Sub cmdTopRight_Click() `Set the value of the form's TOP property `to the top of the screen. frmMove.Top = 0 `Set the value of the form's LEFT property to `the right of the screen but bring it back across `the screen the width of the form, so that the `right side of the form is on the right `side of the screen frmMove.Left = Screen.Width - frmMove.Width End Sub Olayları Rapor Etmek Son bölümde form ve komut düğmelerinde oluşan olayları rapor edecek kodu yazacağız. Kullanıcılar form üzerinde farenin tuşuna basıp bıraktıkça tuşun durumu form üzerindeki etikete yazılacaktır. Fare ile kontroller arasında gezdikçe oluşan 88 olaylar etiket üzerinde görünecektir.Bunu yapmak için üç farklı tipte olay yordamı yazmak gerektirmektedir. Form için MouseDown ve MouseUp, her bir komut düğmesi için ise GotFocus olay yordamı. Liste 5.c.3.de frmMain için MouseUp ve MouseDown olay yordamlarının kodları verilmiştir. Bu kodları ilgili olay yordamlarına giriniz. Örneğin formun üzerine gelip çift tıklayarak kod penceresine ulaşıp, olay yordamları açılan penceresinden MouseDown olay yordamını seçerseniz frmMain_MouseDown() olay yordamına ulaşabilirsiniz. LISTE 5.c.3 Kullanıcını Fare Düğmesine Basıp Bırakmasını Raporlayan Kod 01 Private Sub Form_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) 02 03 lblNotify.Caption = "MouseDown Event" 04 05 End Sub 06 07 Private Sub Form_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) 08 09 lblNotify.Caption = "MouseUp Event" 10 11 End Sub 89 ŞEKİL 5.c.6 Nesnenin olay yordamının seçimi. Son olarak hangi komut düğmesinin aktif olacağını gösteren kodu ekleyelim. Liste 5.c.4.de her bir komut düğmesine ait GotFocus olay yordamı kodu verilmiştir. LISTE 5.c.4 Code for Reporting Which CommandButton Has the Focus 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 Private Sub cmdBottomLeft_GotFocus() lblNotify.Caption = "cmdBottomLeft has the Focus" End Sub Private Sub cmdBottomRight_GotFocus() lblNotify.Caption = "cmdBottomRight has the Focus" End Sub Private Sub cmdTopLeft_GotFocus() lblNotify.Caption = "cmdTopLeft has the Focus" End Sub Private Sub cmdTopRight_GotFocus() lblNotify.Caption = "cmdTopRight has the Focus" 90 22 23 End Sub Her bir komut düğmesine ait GotFocus Olay Yordamları girilerek programın yazımı bitirilir. F5 tuşuna basılarak program çalıştırılır. ŞEKİL 5.c.7 Komut düğmesine tıkladığınızda otomatik olarak aktif hale geçer ve bu durum etiket içinde rapor edilir. 91 6. Görsel Programlama Dilinin Temel Elemanları 6.a.Veri Tipleri, Sabitler ve Değişkenler · · · · · · · · · Değişkenlere Bilgi Depolama o Değişkenleri Tanımlamak o Değişkenleri İsimlendirmek o Değişken Tipinin Doğru Seçilmesi Açık Tanımlamalar Yapmak Değişkenlerde Tip Sonekleri Kullanmak String Kullanımı Değişken Uzunluklu ve Sabit Uzunluklu Stringler Bir Değişkenin Nerede Kullanılacağını Belirlemek o Genel Değişkenler Tanımlamak o Yerel Değişkenler Tanımlamak Statik Değişkenler Sabitler o Visual Basic’in Sağladığı Sabitler o Kendi Sabitlerinizi Tanımlamak Atama Cümleleri Değişkenlere Bilgi Depolama Veriler program içerisinde işlenirken geçici olarak değişkenlere yüklenirler. Bir değişken programın değişik yerlerinde değişik değerler alabilir. Değişkenler program içerisinde değerleri değişebilecek büyüklükler için kullanılır. Değişken değerlerine program içerisinden ulaşılabilir. Değişkenleri Tanımlamak Visual Basic Tarafından Kullanılan İfadeler Bu ifadeleri değişken isimleri gibi programşlama ihtiyaçlarınız için kullanamazsınız. Örneğin; Dim, As, New, ReDim, If, Then, Else, Loop, While, ve End Visual Basic 92 tarfaından kullanılan ifadelerdir. Bu ifadeler kod penceresi içinde farklı renkte görülürler. Aşağıdaki formatta değişkenleri tanımlayabilirsiniz. Dim Değişkenİsmi As VeriTipi Bu tanımlamada · Dim Visual Basic tarafından değişken tanımlama için kullanılan özel ifadedir. · Değişkenİsmi değişkene verilecek isimdir. · As özel ifadesi bir veri tipi tanımlamakta olduğunuzu belirtir. · VeriTipi değişkenin hagi veri tipinde olacağını bildirir. Bu açıklamalar doğrultusunda aşağıdaki örnekte Integer veri tipinde i ismli bir değişken tanımlanmaktadır. Dim i as Integer Değişkenleri İsimlendirmek Değişkenleri tanımlarken onları isimlendirmek zorundasınız. İsimlendirme ile değişkenleri birbirinden ayırma ve kolay erişim imkanına kavuşuruz. Değişkenleri isimlendirmede çok büyük esnekliğe sahibiz. Değişken isimleri basit, açıklayıcı veya içerdiği bilgiyi tanımlayıcı olabilir. Bu esnekliğe rağmen isimlendirmede aşağıdaki kurallara uyulmalıdır. · · · · İsimler mutalaka harf ile başlamalıdır. İsim içinde nokta olmamalıdır. İsim tanımlandığı modül veya yordam içinde bezersiz(tekrarsız) olmalıdır.tanım The name must be unique within the current procedure or module (this restriction depends on the scope of the name, which you'll learn about a little later). İsim 255 karakterden büyük olamaz. Aşağıda hatalı değişken isimleri verilmiştir. · · · 1Week—Değişkene rakamla başlayamazsınız. Earnings.To.Data—Nokta kullanamazsınız. Number One—Boşluk kullanamazsınız. Aşağıdaki değişken isimleri hatasızdır. MyNum& 93 i% iNumOne strInputValue Number2# Program kodunun okunabilirliğini arttırmak için değişkenlere açıklayıcı isimler verilmeli ve bu isimlere veri tiplerine uygun önekler verilmelidir. Veri tiplerine uygun önek vermenin nasıl yapılacağı aşağıdaki tabloda belirtilmektedir. TABLO 6.a.1 Değişkenler ve Önekler Önek Değişken B Boolean Örnek bLightsOn C Currency cAmountDue D Double dDollarPerGallon Db Database dbAccountsPayable Ds Dynaset dsOverDue Dt Date+time dtDateDue Prefix Variable/Control Example Td TableDef tdEmployees H Handle HWnd i Integer iCounter l Long LNum str String strMessage s Single SPay a Array a_iMyArray g Global g_iTotal m Local to module or form m_iAmount ani Animation button aniMain cbo Combo box and drop-down list box cboMyList chk Check box chkDoctorIn clp Picture clip clpEmblems cmd Command button cmdFirstName com Communications comLineOne ctr Control (used within procs when the specific type is unknown) ctrNext dat Data datEmployees db ODBC database dbTaxpayers dir Directory list box dirProjects dlg Common dialog dlgSettings drv Drive list box drvMain 94 fil File list box filPictures frm Form frmMain fra Frame fraTeams gau Gauge gauGas Prefix Variable/Control Example gpb Group button gpbApps grd Grid grdMain hsb Horizontal scroll bar hsbText img Image imgMain key Keyboard key status keyASCII lbl Label lblLastName lin Line LinRed lst List box lstStooges mdi MDI child form mdiMain mnu Menu mnuEdit opt Option button optGender ole OLE client oleMain pnl 3D panel pnlFriends shp Shape shpCircle spn Spin control spnTemp txt Text/edit box txtAddress tmr Timer tmrBreak vsb Vertical scrollbar vsbComments Değişken Tipinin Doğru Seçilmesi Değişken içinde hemen herşeyi tutabilirsiniz. Bir değişken sayıyı, karakterlerden oluşan stringi, bir nesneyi, formu, kontrolu, veritabanı nesnelerini tutabilir. Tablo 6.a.2 Visual Basic içinde kullanılabilecrk veri tipleri sunulmaktadır. Tabloda herhangi bir tipteki değişkenin tutabileceği verileri, hafızada kendisine ayrılacak yeri ve alabileceği değerlerin aralığı gösterilmektedir. TABLO 6.a.2 Değişken Veri Tiplerinin Özellikleri Tip Tutabileceği Veriler Tam Sayılar Hafıza Gereksinimi 2 bytes Integer Long -32,768 - 32,767 arası Tam Sayılar 4 bytes Yaklaşık +/- 2.1E9 95 Değer Aralığı Single Ondalık Sayılar 4 bytes -3.402823E38 -1.401298E-45 arasındaki negatif değerler ve 1.401298E-45 3.402823E38 arası pozitif değerler Double Ondalık Sayılar(çift hassasiyet) 8 bytes -1.79769313486232E308 -4.94065645841247E-324 arası negatif değerler ve 4.94065645841247E-324 1.79769313486232E308 arası positif değerler Currency Ondalık işaretinin 8 bytes solunda 15 haneye kadar ve sağında 4 haneye kadar olan tüm sayılar. 922,337,203,685,477.5808 922,337,203,685,477.5807 arası String Karakterlerden oluşan 1 byte (her ifadeler karakter için) Sabit uzunluklu stringler için 65,000 karakter ve dinamik stringler için 2 milyar karaktere kadar Byte Sayı 1 byte 0 255 arası 2 bytes True veya False Boolean Mantıksal Değerler Date Tarih ve Zaman Bilgisi 8 bytes 1 Ocak 100 31 Aralık 9999 arası Object Resimler veya herhangi bir nesne 4 bytes Variant Önceden bilinmeyen ve tabloda yer alan tiplerden biri için 16 bytes + 1 byte(her karakter için) Açık Tanımlamalar(Explicit Declaration) Yapmak Değişkenleri açıkça tanımlama demek değişkenin bir cümle içerisnde tanımlanması demektir. Visual Basic içerisinde tanımlama yapmadan da değişkenleri kullanmaya başalayabilirsiniz. Aşağıdaki her bir cümlede bir değişken açıkça tanımlanmıştır. Dim VarName [As VarType][, VarName2 [As VarType2]] Private VarName[As VarType][, VarName2[As VarType2]] Static VarName[As VarType][, VarName2[As VarType2]] Public VarName[As VarType][, VarName2[As VarType2]] Dim, Private, Static, ve Public Visual Basic ifadeleri, değişkenlerin nasıl ve nerede kullanılabileceklerini belirtirler. Bir cümle içinde virgül kullanılarak birden fazla değişken tanımlanabilir. Tipler As ifadesinden sonra açıkça belirtilmelidir. Tip belirtilmezse değişkenin variant tipte olacağı kabul edilir. Variant tipte bir değişken herhangi bir tipteki(integer,double.string vb.) değeri alabilir. 96 Aşağıdaki kod satırları değişkenleri açık tanımlamaya yönelik bir örnektir. Private iNumVal As Integer Private iAvgVal As Integer, dInputval As Double Static sCalcAverage As Single Dim strInputMsg As String Visual basic içerisinde Dim, Private, Static, veya Public kullanarak değişken tanımlama mecburiyeti yoktur. Örneğin MyVal değişkenini kod içerisinde açıkça tanımlamadan kullanılırsa derleyici bunu dolaylı tanımlanmış (implicit declaration) ve veri tipini variant olarak kabul edecektir. Dolaylı tanımlama tercih edilen bir yöntem değildir çünkü değişken isminin yanlış yazılması hata mesajı vermeyecek, ismi yanlış yazılan değişken farklı bir değişken olarak kabul edilecektir. Bu da program içerisnde ciddi hataların oluşmasına yol açabilecektir. `Declare a variable to hold the value fo the winner Dim iTheWinnner as Integer `Assign a value to the winner variable iTheWinner = 100 `This code will show you a message that says `The winner has won: 0 `because you typed, iTheWhiner by mistake MsgBox "The winner has won: " & CStr(iTheWhiner) Form veya modülün ilk satırına Option Explicit yazarak dolaylı tanımlamadan kurtulabilirsiniz. Bu satır yazıldıktan sonra kodunuzda kullandığınız her değişken için açık tanımlama yapmanız gereki aklsi takdirde hata mesajı alırsınız. Bu işlemi IDE’yi kullanarak tüm form ve modüller için geçerli kılabilirsiniz. IDE’yi değişken tanımlamayı zorunlu hale getirecek şekilde ayarlayın 1. Tools menüsünden, Options elemanını seçin. 2. Options diyalog kutusunun Editor sayfasından, Require Variable Declaration onay kutusuna işaret koyun. (Şekil 6.a.1) 3. OK düğmesine tıklayın. 97 ŞEKİL 6.a.1. Option Explicit seçeneği eklendiğinde, eğer bir değişkeni tanımlamayı unutursanız derleme esnasında değişken tanımlanmamıştır hata mesajını alacaksınız. Örneğin aşağıdaki cümle ile bir degişken tanımlayıp: Dim strMyName As String Eğer sonraki cümlede değişken ismini yanlış yazarsanız Visual Basic hatayı yakalayacaktır. Eğer aşağıdaki cümleyi yazarsanız bir hata mesajı alırsınız. strMyNme = "Clark Kent" Değişkenlerde Tip Sonekleri Kullanmak Daha öncek örneklerde değişken tanımında değişkenin veri tipini belirlemek için As ifadesi kullanılıyordu. Bir başka yöntem ise As yerine tip soneki kullanmaktır. Bu yntemde değişken tanımlanırken değişken isminin sonuna tip bildiren sonek eklenir ve As ifadesi kullanılmaz. Kullanılan sonek değişkenin tipini otomatik olarak belirler. 98 TABLO 6.a.3 Değişken Sonekleri Değişken Tipi Sonek Integer % Long & Single ! Double # Currency @ String $ Byte Boolean Date Object Variant Örnek: Private NumVal% Private AvgVal%, Inputval# Static CalcAverage! Dim InputMsg$ Sonek kullanarak değişken tanımlama daha basit ve hızlı bir yöntemdir. Değişken ismine bakarak veri tipi anlaşılacağından progran geliştirme hızını arttırabilir. Sonek kullanmak bir programcı tercihidir. String Kullanımı Bir string karakterlerden oluşan bir topluluktur. Aşağıda farklı strimg değerleri verilmektedir. "Cheese" "You have made an error!" "a" "July 4, 1776" "75" Her bir karakter topluluğu çift tırnak arasında yer almktadır(""). Çift tırnak içerisinde yazılı olan her değeri Visual Basic string değeri olarak kabul eder. Çift tınak içerisinde olmayan ifadeler ise değişken veya dilin bir parçası olarak kabul edilir. 99 "75" ifadesi size tamsyı olarak görünebilir fakat çift tırnak arasında yer aldığı için Visual Basic tarafından string olarak kabul edilir. Değişken Uzunluklu ve Sabit Uzunluklu Stringler Programınızda kullandığınız stringlerin çoğu değişken uzunluklu olup 64000’e kadar karakter içerebilirler. Deişken uzunluklu string değişkenlerine yeni değerler atandıkça değişkenlerin uzunlukarı değişir.Bunun yanı sıra Sabit Uzunluklu string değişkenleri de vardır. Sabit Uzunluklu string değişkenlerine yeni değerler atamak değişkenin uzunluğunu değiştirmez. Eğer atanan değer değişkenin uzunluğundan kısa ise kalan kısım boş karakterler ile doldurulur.Eğer atanan değer değişkenin uzunluğundan fazla ise soldan başlayarak değişkenin alabileceği kadar karakter alınır, artan kısım atılır. Sabit Uzunluklu değişkenler aşağıdaki formata göre tanımlanır. Dim Değişkenİsmi As String * stringUzunluğu Bu formata uygun olarak 128 karakter uzunluklu strMyString değişkeni aşağıdaki şekilde tanımlanmıştır. Dim strMyString As String * 128 Sabit uzunluklu string değişkeni kullanmak ilk başta gerekli görünmese de, programınız içinde Windows API (Application Programming Interface) kullanmanız durumunda gerekli olacağını fark edeceksiniz. Bir Değişkenin Nerede Kullanılacağını Belirlemek Tanımlama cümlesinde, değişken içerisine ne atayabileceğiniz dışında Visual Basic’in bu değişkeni nerede kullanacağını anlayabilirsiniz.Kullanılacak yer(scope) değişkenin geçerli olduğu kod bölümünü gösterir. Sadece bir yordam içerisinde yerel olarak(locally) kullanabileceğiniz değişkenler dışında, çalıştığınız form veya modülde hatta tüm programda genel olarak(globally) kullanabileceğiniz değişkenler vardır. Dim ile tanımlanan bir değişken tanımlandığı yer içinde(local) kullanılabilir. Örneğin bir alt yordam içinde Dim ile tanımlanan değişken sadece tanımlandığı yordam içinde 100 geçerlidir. Eğer bu değişkeni diğer yordamlarlada kullanmak istiyorsak tüm yordamlara genel olarak tanımlamalıyız. Genel Değişkenler Tanımlamak Tek form ve modül kullanan programlar dışındakilerde bazı değişkenlere kodun her tarafından ulaşılmasına ihtiyaç olduğunu fark edersiniz. Bu değişkenler genel değişkenlerdir(Public or global variables). Bu değişkenler programın her yerinde kullanılabilecek bilgileri veya o andaki durum bilgilerini tutan değişkenlerdir. Genel değişkenler, kod veya form Modülünün General Declarations bölümünde Public deyimi ile tanımlanır. Aşağıda genel değişken tanımlama örneği verilmektedir. Public bLightsOn as Boolean Form içinde Public deyiminin özel bir önemi vardır. Formun General Declarations bölümünde Public deyimi ile tanımlanan değişkenler, programın her yerinden bu formun bir özelliği gibi görünür. Örneğin frmMain formu içinde genel olarak tanımlanan strMyName değişkenine, değer girildikten sonra bu formun dışında herhangi bir yerde ihtiyaç duyulursa aşağıdaki şekilde erişilebilir. strSomeString = frmMain.strMyName Formlar ve modüller vb. program parçaları arasında bilgi alış verişi için genel değişkenler kullanılır. Eğer değişkene programın her yerinden erişme zorunluluğu yoksa kullanılacağı yerde Dim deyimi ile yerel olarak tanımlanmalıdır. Eğer değişken bir form veya modül içinde her yerde kullanılacaksa modül veya form modülünün general declarations bölümünde Private deyimi ile tanımlanmalıdır. Bunlara form veya modül değişkenleri de denir. Yerel Değişkenler Tanımlamak İlk bakışta programlarınızda kullanabileceğiniz tüm değişkenleri genel olarak tanımlamayı tercih edebilirsiniz. Ama programlarınız büyüdükçe bunun uygun bir yöntem olmadığını göreceksiniz. Programlarınızda yordamları çağırdıkça yordamlar 101 hafızay yüklenecek işleri bittikten sonra hafızadan silineceklerdir. Ancak bu yordamlarla ilgili değişkenler genel oldukları için program bitene kadar hafızada kalmaya devam edecekler bu da propgramınızın fazla sistem kaynağı kullanmasına neden olacaktır. Farklı yordamlarda aynı isimli değişkenleri kullanmak isim çakışmalarına hatta mantık hatalarına neden olacaktır.. Statik Değişkenler Bir yordam içinde tanımlanan değişkenler yordamın çalışması bittiğinde Visual Basic tarafından hafızadan silinirler. Bazen değişkenin değerini yordam bittikten sonra da korumasına ihtiyaç duyarız. Bu durum yordamın son çağrılışında değişkenin aldığı değeri kullanmak gerektiği hallerde karşımıza çıkar. Yordamın çalışmasının bitmesinden sonra bile değerini koruyan değişkenler Static deyimi ile tanımlanır. Bu tanım Visual Basic’e bu değişkenin sadece tanımlandığı yordam içinde kullanılabileceğini fakat atanan değerleri programın çalışması boyunca muhafaza edeceğini söyler. Örneğin aşağıdaki satırda statik bir tamsayı değişken tanımlanmıştır. Static iNumOfClicks as Integer Statik değişkenin kullanımına iyi bir örnek olarak bir komut düğmesine kaç defa tıklandığını bulmayı verebiliriz. Eğer tıklama sayısını Click() olay yordamı içinde yerel olarak tanımlarsınız, her tıklamada olay yordamı çalıştırılacak yordamın bitmesiyle birlikte değişken hafızadan silindiği için bir sonraki tıklamada önceki tıklama sayısına ulaşılamıyacaktır. Sub MyButton_Click() Static iNumOfClicks as Integer iNumOfClicks = iNumOfClicks + 1 MsgBox "Number of Clicks: " & CStr(iNumOfClicks) End Sub Sabitler Değişkenler bilgisayarın hafızasına bilgi yükleme araçlarıdır. Bir diğer yükleme aracı ise sabitlerdir. Sabitlerin özel bir kullanımı vardır. Sabitler tanımlanırken değer alırlar ve aldıkları değer program boyunca değiştirilemez. Eğer değiştirilirse Visual Basic 102 Hata mesajı verir. Sabitler daha çok program içinde hatırlanması zor büyüklüklerin yerine kullanılan anlaşılır ifadelerdir. Const METER_TO_FEET = 3.3 Meters# = CDbl(InputBox("Enter a distance in meters")) DistFeet# = Meters# * METER_TO_FEET MsgBox "The distance in feet is: " & CStr(DistFeet#) Visual Basic’in Sağladığı Sabitler Visual Basic 4.0’den beri dil içerisindeki bir çok işlem için sabitler önceden hazırlanmıştır. Örneğin renk tanımlama sabitleri, veri erişim sabitleri, şekil sabitleri gibi. Visual Basic tarafından sağlanan sabitler vb öneki ile başlar. Bir çok fonksiyonun ihtiyaç duyduğu sabitler, fonksiyonun yardım menüsünden öğrenilebilir. Eğer bir sabitin değerini öğrenmek istiyorsanız araç çubuğu üzerindeki Object Browser düğmesine tıklayın veya F2 tuşuna basın. Ekrana gelen Object Browser diyalog kutusundaki listeden istediğiniz sabiti seçerek değerini alttaki metin alanından görebilirsiniz. Kendi Sabitlerinizi Tanımlamak Visual Basic Bir çok işlem için gerekli sabitleri tanımlamasına rağmen bazen kendi sabitlerinizi tanımlamaya ihtiyaç duyarsınız.Sabitler Const deyimi ile aşağıdaki formata göre tanımlanır. Const SABİT_İSMİ [As VERİTİPİ] = value Bu cümle değişken tanımlama cümlesine benzemektedir. Farklı olarak atama işlemi de tanımlama cümlesinde yapılmaktadır. Sabitin veri tipine uygun değer atanmalı string değerler “ ”arasında yer almalıdır. Atama Cümleleri Değişkenleri etkin olarak kullanabilmek için onlara değer atamak ve bu değerler ile işlem yapmak gerekir. Değişkeni tanımlamdan sonraki aşama değişkene değer atamadır. Bu ise atama cümlesi ile olur. Atama işlemi = operatörü ile olur. Operatörün solunda değer atancak değişken yazılır. Operatörün sağında değişkenin veri tipine uygun bir değer veya bu değeri oluşturacak mantıksal veya aritmetik bir ifade yazılır. Yazılan ifade gerektiği kadar karmaşık olabilir. Aşağıdaki örnekte farklı atama cümleleri verilmiştir: NumStudents% = 25 103 SumScores% = 2276 AvgScore% = SumScores% / NumStudents% TopStudent$ = "Janet Simon" BadStudent$ = txtStudent.Text Formların ve kontrollerin özelliklerinden çoğunu değişken olarak düşünebilirsiniz. Bunlara tasarım zamanında(kod yazılırken) değer atanabilir, çalışma zamanında(kod çalıştırılırken) değerleri değiştirilebilir. Aşağıda buna bir örnek verilmiştir. `Convert the third variable (which is an integer) `to text and assign it to the text property of the `TextBox for the result. txtTotal.Text = CStr(z) Atama cümlesinde atanan değerin veri tipi değişkenin veri tipi ile aynı veya uyumlu değilse, tip uyuşumsuzluğu hatası( type mismatch error) verir. Aşağıda buna bir örnek verilmiştir. Dim x% `Next line causes `type mismatch error x% = "Happy Birthday!" 6.b. String ve Tip Dönüşümü İşlemleri 6.b.1. String İşlemleri a. Asc Fonksiyonu Bu fonksiyon herhangi bir karaktersel bilginin ilk karakterinin ASCII kodunu bulmak amacıyla kullanılmaktadır. Eğer katar sıfır uzunlukta ise, yani boş bir katarsa hata üretir. Genel Yazılışı Asc(karaktersel bilgi) ‘Asc(string) Private Sub Form_Load() Sonuc_1 = Asc ("A") Sonuc_2 = Asc ("a") Sonuc_3 = Asc ("Armut") Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub b. Chr Fonksiyonu 104 Chr fonksiyonu dışarıdan parametre olarak değeri 0 ile 255 arasınsa değişen tamsayı bir değeri almaktadır. Geriye bu sayının ASCII karakterini döndürür. 0....31 arasındaki kodlar aynı aralıktaki ASCII karakter ile aynı işleve sahiptir ve görüntülenemezler. Chr$ kullanılırsa sonuç String, kullanılmazsa Variant olur. Chr fonksiyonunun geriye döndürdüğü bilgi Variant tipindedir. Eğer geriye karaktersel bilginin döndürülmesini istiyorsanız Chr yerine Chr$ fonksiyonu kullanabilirsiniz. Chr(10) değeri MsgBox ve InputBox gibi fonksiyonlarda MsgBox’un birden çok satırda görüntülenmesi için kullanılır. Genel Yazılışı Chr(ANSI kodu) ‘Chr(charcode) Private Sub Form_Load() Sonuc_1 = Chr (65) Sonuc_2 = Chr (97) Sonuc_3 = Chr (37) Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub Private Sub Command1_Click() Dim I, J, Msg, NL NL = Chr(10) For I = 1 To 2 For J = Asc("A") To Asc("Z") Msg = Msg & Chr(J) Next J Msg = Msg & NL Next I MsgBox Msg End Sub c. LCase Fonksiyonu Bu fonksiyon parametre olarak aldığı karaktersel bilginin içinde bulunan alfabetik karakterlerin büyük olanlarını küçük harfe çevirmektedir. LCase fonksiyonu geriye karaktersel bilginin yeni halini, yani büyük harflerin küçük harfe çevrilmiş halini döndürür. LCase fonksiyonu kendisine parametre olarak verilen karaktersel bilginin yalnızca alfabetik olan karakterleri üzerinde etkili olmaktadır. Harflerden başka karaktersel bilgi dahilinde bulunacak rakamlar ve diğer karakterler üzerinde bir etkisi yoktur. Genel Yaz ılışı LCase ( karaktersel Bilgi) ‘LCase(string) 105 Visual Basic, Türkçe’ye özgü olan “I” ve “İ” harflerini LCase fonksiyonu ile küçük harfe çeviremez. Private Sub Form_Load() Dim Sonuc_1, Sonuc_2 Sonuc_1 = "Merhaba Dünya1234" Sonuc_2 = Lcase(Sonuc1) Text1 = Sonuc_1 Text2 = Sonuc_2 End Sub d. Left Fonksiyonu Bu fonksiyon dışarıdan parametre olarak karaktersel bir bilgiyi, karaktersel bilgi içeren bir değişkeni veya Variant tipli değişkeni alabilmektedir. Bu fonksiyon kendisine parametre olarak verilen Variant veya karaktersel (String) tipli değişken veya sabit bilginin soldan itibaren istenilen kadarını ayırmak, çıkarmak amacıyla kullanılmaktadır. Uzunluk değeri 0 ... 65535 arasında olmalıdır. 0 verilirse boş bir katar (“”) elde edilir. Katarın uzunluğuna eşit ya da ondan daha büyükse, katarın tamamı döndürülür. Genel Yazılışı Left ( karaktersel ifade , uzunluk) ‘Left (string, length) Private Sub Form_Load() Karakter = "Merhaba Dünya" Sonuc_1 = Left (Karakter, 1) Sonuc_2 = Left (Karakter, 7) Sonuc_3 = Left (Karakter, 20) Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub Visual Basic’te Left fonksiyonu ile benzer işleve sahip olan Left$ adında bir fonksiyon daha vardır. Left fonksiyonu geriye Variant tipte bilgi döndürür. Left$ fonksiyonu geriye String tipte bilgi döndürmektedir. Ayrıca Left$ parametre olarak yalnızca Variant ve karaktersel bilgi içeren değişkenleri parametre olarak kabul etmektedir. Dim bildiri deyimi ile declare edilmiş sayısal tipli değişkenleri Left$ fonksiyonu parametre olarak kabul etmez. e. Len Fonksiyonu Len fonksiyonu yardımı ile kendisine parametre olarak verilen karaktersel veya başka bir tip bilginin uzunluğu bulunur. Değişken Variant 106 tipinde ise, sonuç her zaman için verinin String olarak kaç byte yer kapladığını belirtir. Arguman Null ise sonuç Null olur. Genel Yaz ılışı Len (karaktersel bilgi | variant) ‘Len (string | varname) Len fonksiyonuna karaktersel bir sabit veya karaktersel bilgi içeren bir değişkeni parametre olarak verecek olursanız geriye karaktersel bilgideki karakter sayısı döndürülür. Private Sub Form_Load() Ad = "Avrupa" Uzunluk1 = Len(Ad) Uzunluk2 = Len("Avrupa") Uzunluk3 = Len(“Cumhuriyet”) Sonuc_1 = Uzunluk1 Sonuc_2 = Uzunluk2 Sonuc_3 = Uzunluk3 End Sub f. LTtrim ve LTrim$ Fonksiyonları Ltrim fonksiyonu kendisine parametre olarak verilen herhangi bir tipteki, LTrim$ ise karaktersel tipteki veya Variant bilgilerinin baş tarafında bulunan boşlukları çıkarmak amacıyla kullanılır. Parametre olarak alınan bilginin baş tarafında boşluklar varsa bunlar çıkarılır. Geriye karaktersel bilgi veya değişkenin yeni hali döndürülür. Parametre olarak verilen karaktersel bilginin baş tarafında hiçbir boşluk yoksa geriye bilginin kendisi döndürülür. Genel Yazılışı LTrim( karaktersel bilgi) ‘LTrim(string) Private Sub Form_Load() Sonuc_1 = " Harita " Sonuc_2 = LTrim(Sonuc_1) Sonuc_3 = LTrim(RTrim(Sonuc_1)) Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub g. Mid ve Mid$ Fonksiyonları Bu iki fonksiyon kendilerine parametre olarak verilen karaktersel veya Variant bir bilginin belirlenen bir kısmını ayırıp çıkarmak amacıyla kullanılır. Mid ve Mid$ fonksiyonları dışarıdan parametre olarak üç bilgi almaktadır. Birinci parametrede verilen bilginin başlama yerinden itibaren alınacak karakter sayısı kadarı alınarak geriye döndürülür. Mid fonksiyonu geriye Variant tipte bilgi döndürürken Mid$ fonksiyonu geriye karaktersel tipte bilgi döndürmektedir. Alınacak veya geriye döndürülecek karakter sayısını belirtmek amacıyla kullanılan 3. parametrenin kullanılması isteğe bağlıdır. Alınacak karakter sayısı verilmezse, başlama yerinden karaktersel bilginin sonuna kadar olan kısmı alınır. Genel Yazılışı Mid(karakter bilgi, başlama yeri, alınacak karakter sayısı ) ‘Mid(string, start[, length]) Kısım Tanımlama 107 Karakter bilgi Birinci parametre katar üretmede kullanılacak karakter bilgiyi belirtir. Başlama yeri İkinci parametre ise, üretme işleminin başlanılacağını konumu belirten Long tipinde bir değerdir. Alınacak karakter sayısı Üçüncü parametre ise bu konumdan itibaren kaç karakterin esas alınacağını belirten Long tipinde bir değerdir. İkinci ve üçüncü parametrelerin değeri 1... 65535 arasında bir değer olabilir. Uzunluk belirtilmezse ya da katar uzunluğundan daha büyük bir değer verilirse, başlama konumundan itibaren katarın geri kalan kısmı üretilir. Başlama konumu, katarın uzunluğundan daha büyük bir değer olarak verilirse, boş bir katar üretilir. Private Sub Form_Load() Katar = "Harita Genel Komutanlığı" BirKelime = Mid(Katar, 1, 6) İkiKelime = Mid(Katar, 8, 6) ÜçKelime = Mid(Katar, 30) Sonuc_1 = BirKelime Sonuc_2 = İki.Kelime Sonuc_3 = ÜçKelime End Sub h. Right Fonksiyonu Çalışma mantığı yönünden Left fonksiyonuna çok benzeyen Right fonksiyonu dışarıdan 2 parametre almaktadır. Bu fonksiyona ilk parametre olarak dışarıdan karaktersel veya Variant tipte sabit bilgi veya değişkeni verilmektedir. Bu fonksiyon kendisine parametre olarak verilen karaktersel veya Variant tipli bilgi veya değişkenin içeriğinin sağdan itibaren istenilen kadarını ayırmak, çıkarmak amacıyla kullanılmaktadır. Genel Yazılışı Right (karaktersel bilgi, uzunluk) ‘Right(string, length) Private Sub Form_Load() Karakter = "Merhaba Dünya" bilgi Sonuc_1 = Right(Karakter, 1) Sonuc_2 = Right(Karakter, 5) Sonuc_3 = Right(Karakter, 20) Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 'Karakter End Sub i. RTrim ve RTrim$ Fonksiyonları RTrim fonksiyonu parametre olarak aldığı karaktersel bilginin arka tarafında yani sağında bulunan boşlukları çıkarmak amacıyla kullanılmaktadır. Parametre olarak alınan karaktersel bilginin arka tarafında boşluklar varsa bunlar çıkarılır. Parametre olarak verilen karaktersel bilginin arka tarafında hiçbir boşluk yoksa, geriye bilginin ilk hali döndürülür. 108 Genel Yaz ılışı RTrim ( karaktersel bilgi) ‘RTrim(string) Veri tabanı dosyasına bilgi yazılırken pek nadir olarak karaktersel tipe sahip alanlar tam olarak doldurulur. Genellikle alanın sonunda birkaç boşluk kalır. Veri tabanı dosyasından okunan bu bilgiler ekrana veya yazıcıya yazdırılırken arkasındaki boşluklar istenmez. Bunun için RTrim fonksiyonu kullanılır. Private Sub Form_Click() Dim Sonuc_1, Sonuc_2 Sonuc_1 = " Harita Sonuc_2 = RTrim(Sonuc_1) Text1 = Sonuc_1 Text2 = Sonuc_2 " End Sub Private Sub Form_Load() Open “Adres.dat” For Random As #1 Len = Len(Alanlar) KayıtNo = LOF(1) / Len (Alanlar) KayıtNo = InputBox (“ Okunacak Kayıt No”) Get #1, KayıtNo, Alanlar Show Print Alanlar.Ad; Alanlar.Soyad DÜNYA Print RTrim(Alanlar.Ad) ; Alanlar.Soyad DÜNYA End Sub ‘ Merhaba ‘ Merhaba j. Space Fonksiyonu Belirtilen sayıda boşluk karakterlerinden oluşan bir katar üretir. $ kullanılırsa sonuç String kullanılmazsa Variant olur. Parametre değeri 0...65535 arasında bir Long değeridir. Genel Yazılışı Space(sayı) ‘Space(number) Private Sub Form_Click() Dim Sonuc_1, Sonuc_2 Sonuc_1 = "Merhaba Dünya" Sonuc_2 = "Merhaba" & Space(10) & "Dünya" Text1 = Sonuc_1 Text2 = Sonuc_2 End Sub k. Spc Fonksiyonu Bu fonksiyon boşluk oluşturmak amacıyla kullanılır. Print# deyiminde ya da Print yönteminde belirtilen sayıda boşluk bırakır. Program içinde ne kadar boşluk oluşturulmak isteniyorsa, boşluk 109 sayısı Spc fonksiyonuna parametre olarak verilemelidir. Spc fonksiyonu dışarıdan parametre olarak sayısal bir bilgi almaktadır. Bu fonksiyona parametre olarak verilen tam sayısal bilgi 0 ile 255 arasında bir değer olabilir. Genel Yazılışı Spc(boşluk sayısı) ‘ Spc(n) Private Sub Form_Click() Dim Mesaj Mesaj =”Visual Basic” Print Spc(10) ; Mesaj End Sub l. Str$ Fonksiyonu Str$ fonksiyonu ile sayısal bir bilgi karaktersel bilgi tipine çevrilir. Geriye Sonuç bilginin Variant olması isteniyorsa Str$ yerine Str fonksiyonu kullanılmalıdır. Str fonksiyonu dışarıdan parametre olarak karaktersel bilgi tipine çevrilecek sayısal bir bilgiyi almaktadır. Genel Yazılışı Str(Sayısal Bilgi) ‘Str(number) Private Sub Form_Load() Sonuc_1 = Str (459) Sonuc_2 = Str (-459.65) Sonuc_3 = Str (459.001) Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub m. StrComp Fonksiyonu Bu fonksiyondan karaktersel veya Variant tipteki iki sabit bilgiyi veya bilgi içeren iki değişkeni birbiri ile karşılaştırmak için yararlanılır. Bu fonksiyon dışarıdan biri seçimlik olan 3 parametre almaktadır. Birinci parametrede verilen bilgi, ikinci parametrede verilen bilgi ile karşılaştırılır. Geriye karşılaştırmanın sonucu ile ilgili bir değer döndürür. Karşılaştırılan ilk bilgi, ikinci bilgiden büyük veya küçükse yani eşit değilse geriye1, bilgiler birbirine eşitse 0 değeri döndürür. Karşılaştırılan her iki bilgi Null ise geriye Null değeri döndürülür. Genel Yazılışı StrComp(1.Bilgi, 2.Bilgi, Karşılaştırma şekli) ‘ StrComp(string1, string2[, compare]) Kısım Tanımlama Karaktersel bilgi1 (String1) Karaktersel bir ifade Karaktersel bilgi2 (String2) Karaktersel bir ifade Karşılaştırma (Compare) Üçüncü parametre ise karşılaştırma yöntemini belirler. 0..2 arasında bir 110 değer almalıdır 0 ise küçük ve büyük harf ayrımı yapılmaz, 1 ise küçük ve büyük harf ayrımı yapılır Private Sub Form_Load() Bilgi1 = "ABCD": Bilgi2 = "abcd" Sonuc_1 = StrComp(Bilgi1, Bilgi2, 1) Sonuc_2 = StrComp(Bilgi1, Bilgi2, 0) Sonuc_3 = StrComp(Bilgi2, Bilgi1) Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub Private Sub Form_Load() Kitap1 = “ Visual Basic” Kitap2 = “Access” Sonuc = StrComp(Kitap1,Kitap2) If Sonuc = 0 Then MsgBox “Bilgiler birbirine eşit” Else MsgBox “Bilgiler birbirine eşit değil” End If End Sub n. String Fonksiyonu Yaptıkları işlev bakımından birbirine çok benzeyen String ve String$ fonksiyonları, bir karakterin istenilen sayıda ekrana veya yazıcıya arka arkaya tekrarlanarak yazılmasını sağlar. Sonuna “$” işareti konulan String$ fonksiyonu geriye karaktersel bilgi döndürürken String fonksiyonu geriye Varient tipte bilgi döndürmektedir. Genel Yazılışı String(sayı, karakter) ‘String(number, character) Sring$ fonksiyonu dışarıdan parametre olarak iki adet bilgi almaktadır. Birinci parametre tekrar sayısıdır ve en fazla 65.525 değerini alabilir. İkinci parametre ile tekrarlanarak yazılacak karakter veya karakter içeren değişkenin adı verilmektedir. İkinci parametre olarak doğrudan karakter yerine istenirse karakteri temsil eden Ascii kodu da yazılabilir. İkinci parametre olarak bir katar belirtiliyorsa, katarın ilk karakteri alınır. Kod 0...255 arasındadır. Daha büyük bir değer verilirse 256’ya bölümünden kalan esas alınır. 111 Private Sub Form_Load() Sonuc_1 = String (8, "*") Sonuc_2 = String (5, 42) Sonuc_3 = String (10, "ABC") Text1 = Sonuc_1 Text2 = Sonuc_2 Text3 = Sonuc_3 End Sub o. Tab Fonksiyonu Tab fonksiyonu ile Print deyimi öncesi ekranın satır bazında bilgi yazılacak yerini belirlerken geçerli font ve punto değeri ile birlikte o anda geçerli olan Formun boyutları göz önüne alınmalıdır. En az 1 değerini girebilirsiniz. En çok ise çıktı dosyasının genişliği girilebilir. Daha geride konum belirtilirse, bir alt satırda belirtilen konuma gider.1‘den küçük bir değer girilirse ilk sütuna geçilir. Satır genişliğinden daha büyük bir konum değeri belirtilirse satır genişliğine bölümünden kalan değer esas alınır. Genel Yazılışı Tab(ekranın bilgi yazılacak sütunu) ‘Tab[(n)] Private Sub Form_Click() Mesaj = " Visual Basic" Print Tab(10); Mesaj Print Tab(20); Mesaj End Sub p. Trim Fonksiyonu Bu fonksiyon parametre olarak aldığı karaktersel bilginin hem başında hem de sonunda yer alan boşlukları çıkarıp bilginin yeni şeklini geriye döndürür. Karaktersel bilgiyi hem RTrim hem de LTrim fonksiyonunun etkisine maruz bırakmak yerine her iki fonksiyonunun yaptıklarını bir seferde tek başına yapabilen Trim fonksiyonu kullanılır. Genel Yaz ılışı Trim ( karaktersel bilgi) ‘Trim(string) Private Sub Form_Click() Dim Sonuc_1, Sonuc_2 Sonuc_1 = " Harita Sonuc_2 = Trim(Sonuc_1) Text1 = Sonuc_1 Text2 = Sonuc_2 End Sub " r. UCase$ Fonksiyonu 112 Bu fonksiyon parametre olarak aldığı karaktersel bilgilerin içinde bulunan küçük harfleri büyük harfe çevirir. Genel Yazılışı UCase ( karaktersel bilgi) ‘UCase(string) Ucase fonksiyonu geriye karaktersel bilginin yeni halini, yani küçük harflerin büyük harfe çevrilmiş halini döndürür. Ucase fonksiyonu kendisine parametre olarak verilen karaktersel bilginin yalnızca alfabetik olan karakterleri üzerinde etkili olmaktadır. Harflerden başka karaktersel bilgi dahilinde bulunacak rakamlar ve diğer karakterler üzerinde bir etkisi yoktur. Visual Basic, Türkçe’ye özgü olan “ı” ve “i” harflerini UCase fonksiyonu ile büyük harfe çeviremez. Private Sub Form_Click() Dim Sonuc_1, Sonuc_2 Sonuc_1 = "Dünya1234" Sonuc_2 = UCase(Sonuc_1) Text1 = Sonuc_1 Text2 = Sonuc_2 End Sub s. Val Fonksiyonu Bu fonksiyon karaktersel bir bilginin sayısal bilgiye dönüştürülmesi amacıyla kullanılmaktadır. Genel Yazılışı Val (karaktersel bilgi) ‘Val(string) Val fonksiyonu parametre olarak aldığı karaktersel bilginin sayısal bilgiye çevrilebilen kısmını ondalık noktaları ile birlikte sayısal bilgiye çevirerek geriye döndürür. Sayısal bilgi tipine çevrilmek istenen karaktersel bilginin içinde alfabetik karakterler varsa çevirme işlemi ilk alfabetik karaktere rastlayıncaya kadar yapılır. Boşluk. Tab ve LF karakterleri dikkate alınmaz. Sonuç Double tipindedir. Private Sub Form_Click() Sonuc1 = Val("123.456") Sonuc2 = Val("123adana") Sonuc3 = Val("A15") Sonuc4 = Val("11A21") Sonuc5 = Val("2457") Sonuc6 = Val(" 2 45 7") Sonuc7 = Val("24 and 57") Text1 = Sonuc1 Text2 = Sonuc2 Text3 = Sonuc3 Text4 = Sonuc4:Text5 = Sonuc5 Text6 = Sonuc6:Text7 = Sonuc7 End Sub 113 6.b.2. Tip Dönüşümü İşlemleri a. CCur Fonksiyonu Parametre değerini Currency tipine dönüştürür. Genel Yazılışı CCur(ifade) ‘CCur(expression) Private Sub Form_Load() Dim MyDouble, Sonuc MyDouble = 543.214588 Sonuc = CCur(MyDouble * 2) Text1 = Sonuc End Sub b. CBool Fonksiyonu Parametre değerini Boolen tipine dönüştürür. Genel Yazılışı CBool(ifade) ‘ CBool(expression) Private Sub Form_Click() Dim A, B, Check A = 5: B = 5 Sonuc = Cbool(A = B) Text1 = Sonuc A = 0 Sonuc = Cbool(A) : Text2 = Sonuc End Sub c. CByte Fonksiyonu Parametre değerini Byte tipine dönüştürür. Genel Yazılışı CByte(ifade) ‘CByte(expression) Private Sub Form_Click() Dim MyDouble, Sonuc MyDouble = 125.5678 Sonuc = CByte(MyDouble) Text1 = MyByte End Sub d. CDbl Fonksiyonu Parametre değerini Double tipine dönüştürür. Genel Yazılışı CDbl(ifade) ‘CDbl(expression) 114 Private Sub Form_Click() Dim MyCurr, Sonuc MyCurr = Ccur(234.456784) Sonuc = CDbl(MyCurr * 8.2 * 0.01) Text1 = Sonuc End Sub e. Clnt Fonksiyonu Parametre değerini Integer tipine dönüştürür. Genel Yazılışı Clnt(ifade) ‘Clnt(expression) Private Sub Form_Click() Dim MyDouble, MyInt MyDouble = 2345.5678 Sonuc = Clnt(MyDouble) Text1 = Sonuc End Sub f. CLng Fonksiyonu Parametre değerini Long tipine dönüştürür.Bu çevirme esnasında yuvarlama yapılır. Genel Yazılışı CLng(ifade) ‘CLng(expression) Private Sub Form_Click() Dim MyVal1, MyVal2, Sonuc1, Sonuc2 MyVal1 = 25427.45: MyVal2 = 25427.55 Sonuc1 = CLng(MyVal1) Sonuc2 = CLng(MyVal2) Text1 = Sonuc1 : Text2 = Sonuc2 End Sub g. CSng Fonksiyonu Parametre değerini Single tipine dönüştürür. Genel Yazılışı CSng(ifade) ‘CSng(expression) 115 Private Sub Form_Click() Dim MyDouble1, MyDouble2, Sonuc1, Sonuc2 MyDouble1 = 75.3421115 MyDouble2 = 75.3421555 Sonuc1 = CSng(MyDouble1) Sonuc2 = CSng(MyDouble2) Text1 = Sonuc1 Text2 = Sonuc2 End Sub h. CStr Fonksiyonu Parametre değerini String tipine dönüştürür. Genel Yazılışı CStr(ifade) ‘CStr(expression) Private Sub Form_Click() Dim MyDouble, Sonuc MyDouble = 437.324 Sonuc = CStr(MyDouble) Text1 = Sonuc End Sub i. CVar Fonksiyonu Parametre değerini Variant tipine dönüştürür. Genel Yazılışı CVar(ifade) ‘CVar(expression) Private Sub Form_Click() Dim MyInt, Sonuc MyInt = 4534 Sonuc = CVar(MyInt & "000") Text1 = Sonuc End Sub 7.Görsel Programlama Dilinin Diğer Elemanlar 7.a. Temel İşlemler Aritmetik Description Üs alma Çıkarma Karşılaştırma Symbo Description l ^ Eşitlik Eşit değil 116 Mantıksal Symb ol = <> Description Değil Ve Symb ol Not And Çarpma Bölme * / Küçük Büyük Tam Bölme \ Küçük eşit <= Mod Büyük eşit >= Modulus arithmetic Toplama + String concatenation & < > Object equivalence Veya Logical exclusion Logical equivalence Logical implication Or Xor Eqv Imp Is 1. Aritmetik İşlemler a. Üs Alma (^) Operatörü Bir sayının üssü alınmak istenirse “^” operatöründen yararlanılır. Genel Yazılışı Sayısal Bilgi ^ Sayısal Bilgi Sayısal Değişken ^ Sayısal Değişken Sonuc = 3 ^ 2 Sonuc = 10 ^ 0 ‘ 9 ‘ 1 Sonuc = 10 ^ -2 ‘ 0.01 Sonuc = 10 ^ 10 ‘ 1000 b. Çıkarma (-) Operatörü Çıkarma operatörü günlük hayattaki kullanımından farklı değildir. Sayısal bir bilgiden bir başkasını çıkarmak amacıyla kullanılır. Genel Yazılışı Sayısal Bilgi - Sayısal Bilgi Sayı Sayı Sayı = 20 – 10 = Sayı – 5 = SQR(36) – 4 ‘ 10 ‘ 5 ‘ 2 c. Çarpma (*) Operatörü Çarpma operatörü verilecek iki sayısal bilgiyi birbiri ile çarpar. Çarpma işleminin sonucunu bir fonksiyona parametre olarak verebiliriz. 117 Genel Yazılışı Sayısal Bilgi * Sayısal Bilgi Sayı = 10 * 20 Sayı = SQR(36) * 4 ‘ 200 ‘ 24 d. Bölme (/) ve Tam Bölme (\) Operatörü Bölme “/” operatörü kendisine verilecek iki sayısal bilgiden birincisini ikinciye böler. Bölme işlemi sonucu bulunacak değerin tam sayı olması isteniyorsa bu kez “\” operatörü kullanılır. Genel Yazılışı Sayısal Bilgi / Sayısal Bilgi Bölme işlemi dışarıdan parametre olarak iki sayısal değer alır. Bu sayısal değerlerden ikincisinin mutlaka sıfırdan farklı olması gerekir. İkinci değerin veya parametrenin sıfır olması halinde hata meydana gelir ve programın çalışması kırılır. Bölme işlemini yapmak üzere dışarıdan alınan bu iki parametreden birincisi ikinciye bölünür. Geriye bölme işleminin sonucu döndürülür. Döndürülen bu değeri yakalamak için yine sayısal bir değişken kullanılır. İstenirse döndürülen bu değer sayısal işlem yapan bir fonksiyona veya çıkış deyimine parametre olarak aktarılır. Bölme işlemi ile elde edilecek bilginin tipi, bölen ve bölünen bilginin tipine bağlı olarak değişir. Eğer hem bölünen hem de bölen Integer ise sonuç Single tipte olur. Bölünen değer ve bölen değer Single ise çıkacak sonuç yine single tipte olur. Bölme işleminde kullanılan bilgilerden biri Long veya Double ise bölme işlemi bulunacak sonuç yine Double olur. Bölme işlemi ile bulunan değerin ondalık noktadan sonraki kısmına gerek duyulmuyorsa, ya Int() fonksiyonundan ya da normal bölme operatörü yerine tam bölme operatöründen yararlanılır. “\” operatörü ile yapılan bölme işlemlerinde sürekli olarak tam sayı değerler elde edilir. 118 Sayı = 20/10 ‘ 2 Sayı = 12.555 \ 2 ‘ 3 Sayı = 10 \ 3 kullanılır) ‘ 3 (Sonucun tam sayı olması için \ e. Mod Operatörü İki sayının bölümünden artanı döndürür. Genel Yazılışı Sonuç = sayı1 Mod sayı2 ‘ result = number1 Mod number2 Dim MyResult MyResult = 10 Mod 5 ' 0 döndürür. MyResult = 10 Mod 3 ' 1 döndürür. MyResult = 12 Mod 4.3 ' 0 döndürür. MyResult = 12.6 Mod 5 ' 3 döndürür. f. Toplama (+) Operatörü + operatörü kendisine parametre olarak verilecek iki sayısal veya karaktersel bilgileri toplar. Toplanacak bilgiler direk olarak yazılıp toplanacağı gibi, değişkenler aracılığı ile toplama işlemi yapılabilir. Genel Yazılışı Sayısal Bilgi + Sayısal Bilgi Karaktersel Bilgi + Karaktersel Bilgi Sayı = 10 + 25 Sayı = Sayı + 5 ‘ 35 ‘ 40 Sonuc = SQR(100) + 10 Sonuc = SQR(36) + SQR(16) ‘ 20 ‘ 10 119 Sonuc = SQR(30 + SQR(16)) + 10 ‘ 16 Aşağıda iki ayrı karaktersel bilgiyi “+” operatörü ile birleştirelim. Sonuc = “Visual” + “Basic” ‘ Visual Basic Karaktersel bilgileri birbirine eklemek için toplama (+) operatörü yerine birleştirme (&) operatörü kullanabilirsiniz. Sonuc = “Visual” & “ “&”Basic” ‘ Visual Basic g. & Operatörü İki karaktersel ifadeyi birleştirir. Genel Yazılışı Sonuç = ifade1 & ifade 2 ‘result = expression1 & expression2 Dim MyStr MyStr = "Hello" & " World" ' Hello World" döndürür. MyStr = "Check " & 123 & " Check" '"Check 123 Check" döndürür. 2. Karşılaştırma İşlemleri a. Eşitlik ve Atama = Operatörü = operatörü ile iki bilginin birbirine eşitliği değerlendirilip geriye eşitlik hakkında mantıksal bir sonuç döndürür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için karşılaştırılan veya birbirine eşitliği araştırılan her iki bilginin de birbirine eşit olması gerekir. Karşılaştırılan bilgiler karaktersel, tarihsel, mantıksal veya sayısal veri tipinde olabilir. Genel Yazılışı İfade1 = İfade2 Karşılaştırılan ifadelerden birinin diğerine eşit olmaması halinde geriye mantıksal yanlış değeri döndürülür. Yukarıdaki paragrafta belirtildiği gibi Visual ve diğer Basic sürümlerinde “=” karakteri iki 120 amaç için kullanılmaktadır. Birincisinde = karakteri bir değişkene bilgi aktarmak amacıyla kullanılır. Bunun için önce bilgi aktarılacak değişkenin adı ve ardından “=” karakteri yazılır. Değişkene aktarılacak bilgi en son yazılır. Değişkene aktarılacak bilgi tipi değişkenin tipine göre değişir. Bilindiği gibi karaktersel sabitler çift tırnak (“”) içine alınır. Bir değişkene = operatörü ile aktarılan bilgi doğrudan yazılabileceği gibi bir değişkenin içeriği de olabilir. = operatörünün hangi amaçla kullanıldığı, program içinde kullanıldığı yere bağlı olarak değişir. “=” ile yapılan atama işleminden önce IF gibi mantıksal bir değeri parametre olarak kullanılan deyimlerden birinin kullanılması halinde = operatörü yerine eşitlik görevini üstlenir. Sayı = 323 IF Sayı = 525 ‘ Sayı değişkenine 323 sabit değeri atanır Then ‘ Sayı değişkeninin 525 içerip içermediğine bakılır. b. Eşit değil <> Operatörü İki bilginin birbirine eşitliğini değerlendirip geriye eşitlik hakkında mantıksal bir sonuç döndürülür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için karşılaştırılan veya birbirine eşitliği araştırılan her iki bilginin de birbirine eşit olması gerekir. Karşılaştırılan bilgiler karaktersel, tarihsel, mantıksal veya sayısal veri tipinde olabilir. Genel Yazılışı İfade1 <> İfade2 Karşılaştırılan bilgiler karaktersel, tarihsel, mantıksal veya sayısal veri tipinde olabilir. 121 Sonuc = “123” <> “123” Sonuc = “Adana” <> “Adana” Sonuc = 12 <> 21 ‘ True (-1) ‘ False (0) ‘ True (-1) Karşılaştırılan ifadelerden birinin diğerine eşit olmamsı halinde geriye mantıksal yanlış değeri döndürülür. c. Küçüktür “<” Operatörü “<” operatörü üzerinde işlem yapmak üzere dışarıdan iki bilgi-ifade alır. Bu bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir. Birinci bilginin ikinci bilgiden küçük olup olmadığı araştırılır. Birinci bilgi ikinci bilgiden küçükse, geriye mantıksal doğru, değilse mantıksal yanlış değeri döndürür. Genel Yazılışı İfade1 < İfade2 Sonuc Sonuc Sonuc Sonuc = “A” < “a” = “a” < “Z” = 12 < 10 = “Ada” < “Adana” ‘ ‘ ‘ ‘ True False False True d. Büyüktür “>” Operatörü “>” operatörü diğer karşılaştırma operatörlerinde olduğu gibi üzerinde işlem yapmak üzere dışarıdan iki bilgi-ifade alır. Bu bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir. Birinci bilginin ikinci bilgiden büyük olup olmadığı araştırılır. Birinci bilgi ikinci bilgiden büyükse, geriye mantıksal doğru, değilse mantıksal yanlış değeri döndürür. Genel Yazılışı İfade1 > İfade2 Sonuc Sonuc Sonuc = “A” > “a” = “a” > “Z” = 12 > 10 ‘ False ‘ True ‘ True 122 e. Küçük eşit “<=” Operatörü İki bilginin birbirine eşitliğini ve birincinin ikinciden küçüklüğünü değerlendirip geriye eşitlik ve küçüklük hakkında mantıksal bir sonuç döndürür. Döndürülen mantıksal sonucun doğru olabilmesi için karşılaştırılan veya birbirine eşitliği araştırılan birinci bilginin ikinciden küçük veya eşit olması gerekir. Karşılaştırılan bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir. Genel Yazılışı İfade1 <= İfade2 Karşılaştırılan ifadelerden birincinin ikinciden büyük olması halinde birincinin ikinciye eşit olup olmadığına bakılmaksızın geriye mantıksal yanlış değeri döndürülür. Sonuc = 12 <= 10 ‘ False Sonuc = 20 <= 30 ‘ True f. Büyük eşit “>=” Operatörü İki bilginin birbirine eşitliğini ve birincinin ikinciden büyüklüğünü değerlendirip geriye eşitlik ve büyüklük hakkında mantıksal bir sonuç döndürür. Döndürülen mantıksal sonucun doğru olabilmesi için karşılaştırılan veya birbirine eşitliği araştırılan birinci bilginin ikinciden büyük veya eşit olması gerekir. Karşılaştırılan bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir. Genel Yazılışı İfade1 >= İfade2 Karşılaştırılan ifadelerden birincinin ikinciden küçük olması halinde birincinin ikinciye eşit olup olmadığına bakılmaksızın geriye mantıksal yanlış değeri döndürülür. Sonuc = 12 >= 10 ‘ True Sonuc = 20 >= 30 ‘ False 123 g. Eşdeğer “Is” Operatörü Bahsedilen iki değişken objeyi karşılaştırır. Genel Yazılışı result = object1 Is object2 Dim A As New Form1 Dim B As Form Private Sub Form_Click() If A Is B Then Msg = " A ve B aynı formdan sözeder." Else Msg = " A ve B aynı formdan söz etmez" End If MsgBox Msg Set B = A If A Is B Then Msg = " A ve B aynı formdan sözeder." Else Msg = " A ve B aynı formdan söz etmez" End If MsgBox Msg End Sub 3. Mantıksal İşlemler a. NOT (değil) Operatörü NOT operatörü mantıksal bir koşulla birlikte kullanılır. Birlikte kullanılan mantıksal koşul doğru (True) değerine sahipse NOT operatörü geriye mantıksal yanlış (False) , NOT ile birlikte kullanılan koşul yanlış (False) değerine sahipse geriye mantıksal doğru (True) döndürülür. Yani NOT operatörü sürekli olarak birlikte kullanılan mantıksal değerin tersini döndürmektedir. Genel Yazılışı NOT <Koşul> Sonuc Sonuc Sonuc Sonuc Sonuc = = = = = True AND Not True True AND Not False False AND Not False True OR Not True False OR Not False ‘ ‘ ‘ ‘ ‘ 0 -1 0 -1 –1 Örnek olarak açık olan bir dosyanın numarasını parametre olarak EOF() fonksiyonu dosyanın sonuna gelindiği zaman geriye mantıksal doğru değerini döndürür. Ancak dosyalar 124 üzerinde kayıt ekleme hariç yapılan bütün işlemler dosyanın sonuna gelindiği sürece yapılabilir. Onun için her işlemden sonra dosyanın sonuna gelinip gelinmediği EOF() fonksiyonu ile araştırılır. Bu durumda EOF() fonksiyonunun geriye döndürdüğü değerin IF veya DO WHILE gibi bir deyime parametre olarak verilebilmesi için NOT operatörü ile olumsuz yapılması gerekir. DO WHILE NOT EOF (DosyaNo) ...... LOOP b. AND (ve) Operatörü And operatörü ile mantıksal iki koşulu birlikte değerlendirip yine mantıksal bir sonuç döndürülür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için birlikte değerlendirilen her iki koşulun da doğru olması gerekir. Genel Yazılışı Mantıksal Koşul_1 AND Mantıksal Koşul_2 Mantıksal koşullardan birinin yanlış (False) olması halinde geriye mantıksal yanlış değeri döndürülür. Döndürülen değeri başka bir mantıksal değişkene veya mantıksal parametre alan bir fonksiyona parametre olarak aktarabilirsiniz. DO WHILE NOT EOF (DosyaNo) AND DEVAM = “E” ........ LOOP Bu program parçasında DO WHILE – LOOP döngüsünün sürmesi iki koşula bağlıdır. Birinci koşulda dosya sonuna gelinip gelinmediğini değerlendiren EOF() fonksiyonunun mantıksal yanlış (false) değerini vermesi ve ikinci koşulda ise DEVAM değişkenin “E” değerini içermesi isteniyor. Döngünün devam edebilmesi için her iki koşulun da doğru değere sahip olması gerekiyor. Visual Basic’te mantıksal yanlış değeri 0 ve mantıksal doğru değeri ise –1 ile gösterilmektedir. Sonuc = True And True Sonuc = True And False Sonuc = False And True ‘ –1 ‘ 0 ‘ 0 125 Sonuc = False And False ‘ 0 Son iki satırda ikinci koşula bakılmadan geriye mantıksal yanlış (.F.) değeri döndürülür. Çünkü geriye mantıksal yanlış değeri döndürmek için koşullardan birinin yanlış olması yeterlidir. Aşağıda AND mantıksal operatörüne parametre olarak verilecek koşulların sonucuna göre “And” ile yapılacak mantıksal değerlendirilmelerin sonuçları aşağıda gösterilmiştir. 1.İfade 2.İfade Sonuç True True True True False False True Null Null False True False False False False False Null False Null True Null Null False False Null Null Null Private Sub Form_Click() Dim A, B, C, Msg A = 10: B = 8: C = 6 If A > B And B > C Then Msg = " Her iki ifade True döndürür" Else Msg = " Bir veya iki ifade False döndürür" End If MsgBox Msg End Sub c. .OR. (veya) Operatörü 126 Mantıksal İki koşulu birlikte değerlendirip yine mantıksal bir sonuç döndürülür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için birlikte değerlendirilen iki koşuldan birinin doğru olması yeterlidir. Genel Yazılışı Mantıksal Koşul_1 .OR.. Mantıksal Koşul_2 Mantıksal koşullardan ikisinin de yanlış (false) olması halinde geriye mantıksal yanlış değeri döndürülür. Döndürülen değeri başka bir mantıksal değişkene veya mantıksal değerler alabilen bir fonksiyona parametre olarak aktarabilirsiniz. DO WHILE SEHIR = “ADANA” OR. DEVAM =”E” ........ LOOP Bu program parçasında DO WHILE –LOOP döngüsünün sürmesi iki koşuldan birisinin doğru olmasına bağlıdır. Birinci koşulda SEHIR alanının “ADANA” bilgisini içermesi isteniyor. İkinci koşulda ise DEVAM değişkeninin “E” değerini içermesi isteniyor. Sonuc = True OR True ‘ –1 Sonuc = True OR False ‘ –1 Sonuc = False OR False ‘ 0 Birlikte değerlendirilen koşullardan birincisinin doğru olması halinde ikinci koşula bakılmaksızın geriye mantıksal doğru (True) değeri döndürülür. Çünkü geriye doğru değerini döndürmek için koşullardan birinin doğru olması yetiyor. d. Xor Operatörü İki ifade üzerinde mantıksal karşılaştırma yapar. Genel Yazılışı Sonuç = İfade1 Xor İfade2 ‘ [result =] expression1 Xor expression2 If İfade1 is True True False False And İfade2 is True False True False Dim A, B, C, D, MyCheck A = 10: B = 8: C = 6: D = Null ' Initialize variables MyCheck = A > B Xor B > C ' False 127 Sonuç False True True False MyCheck = B > A Xor B > C ' True MyCheck = B > A Xor C > B ' False MyCheck = B > D Xor A > B ' Null MyCheck = A Xor B ' 2 (bitwise comparison) e. Eqv Operatörü İki ifade üzerinde mantıksal karşılaştırma yapar. Genel Yazılışı Sonuç = İfade1 Imp İfade2 ‘result = expression1 Eqv expression2 If İfade1 is True True False False Dim A, B, A = 10: B MyCheck = MyCheck = MyCheck = MyCheck = C, D, MyCheck = 8: C = 6: D A > B Eqv B > B > A Eqv B > A > B Eqv B > A Eqv B And İfade2 is True False True False = Null C C D Sonuç True False False True ' Initialize variables. ' True ' False ' Null '-3 (bitwise comparison) Private Sub Form_Click() Dim A, B, C, Msg A = 10: B = 8: C = 6 If A > B Eqv B > C Then Msg = " Her iki ifade True veya False döndürür" Else Msg = " Bir ifade True ve diğer False döndürür" End If MsgBox Msg End Sub f. Imp Operatörü İki ifade üzerinde mantıksal karşılaştırma yapar. Genel Yazılışı Sonuç = İfade1 Imp İfade2 ‘result = expression1 Imp expression2 If İfade1 is True True True False And İfade2 is True False Null True 128 Sonuç True False Null True False False Null Null Null False Null True False Null Dim A, B, C, D, MyCheck A = 10: B = 8: C = 6: D = Null MyCheck = A > B Imp B > C ' MyCheck = A > B Imp C > B ' MyCheck = B > A Imp C > B ' MyCheck = B > A Imp C > D ' MyCheck = C > D Imp B > A ' MyCheck = B Imp A Private Sub Form_Click() Dim A, B, C, Msg A = 10: B = 8: C = 6 If A > B Imp B > C Then Msg = " True döndürür." Else Msg = " False döndürür." End If MsgBox Msg True True True Null Null True False True True Null '-1 (bitwise comparison) End SubEnd Sub 7.b.Blok Kontrol Deyimleri Visual Basic gelişmiş yapısal programlama dillerinde bulunan bütün blok kontrol deyimlerine sahiptir. Visual Basic programları dahilinde programın bir yerinden başka bir yerine atlama önerilmediğinden Visual Basic tarafından çizilen modern ve yapısal program geliştirme çerçevesine uyum sağlamak gerekir. Visual Basic dahilinde kullanılabilecek program kontrol ve döngü deyimlerinin bazıları şunlardır. IF – ELSEIF – ELSE – ENDIF IIF () FONKSİYONU DO – LOOP SELECT CASE – END SELECT FOR – NEXT WHILE –WEND GOSUB... RETURN 1. If-Endif Deyimi IF deyimi, programın akışı IF deyimi ile birlikte verilen koşula bağlı olarak belirlenen veya ELSE, ELSEIF veya ENDIF deyimleri ile oluşturulan işlem bloğuna geçmesini veya söz konusu program bloğunun işletilmeyip atlatılmasını sağlar. If deyimi ile birlikte ELSEIF ve ELSE eklerinin 129 kullanılması isteğe bağlıdır. Ayrıca IF-ENDIF ile sınırlanan bir program bloğundan çıkmadan yeni işlem blokları oluşturmak mümkündür. Yani IF-ENDIF blok deyimi ile iç içe bloklar oluşturup kullanabilirsiniz. IF ifade THEN ....... END IF Eğer IF deyimine parametre olarak verilen “İfade” mantıksal doğru değerini içeriyorsa IF ile ENDIF arasında yer alan satırlar sıra ile tek tek işletilir. ”İfade” mantıksal yanlış yani False değerini içeriyorsa bu kez IF ile ENDIF arasında yer alan satırlar atlanılıp program işlemi ENDIF deyiminden sonra gelen ilk satıra geçer. IF deyimi ile birlikte THEN yardımcı deyimi kullanılmazsa hata meydana gelir. Private Sub Form_Load() Ders_Not = InputBox(“Öğrencinin notunu girin “) If Ders_Not < 50 Then MsgBox (“Bu öğrenci zayıf not aldı”) End If If Ders_Not >= Then MsgBox (“Bu öğrenci geçer not aldı”) End If End Sub Ancak içeriği araştırılan değişkenin alma olasılığı olan her değer için ayrı ayrı IF-ENDIF işlem bloğu hazırlamak pratik değildir. Şimdi yukarıda verilen ve iki IF-ENDIF işlem bloğu bulunan örnek programla aynı işleve sahip başka bir örnek program verelim. Private Sub Form_Load() Ders_Not = InputBox(“Öğrencinin notunu girin “) If Ders_Not < 50 Then MsgBox (“Bu öğrenci zayıf not aldı”) Else MsgBox (“Bu öğrenci geçer not aldı”) End If End Sub Yapılan karşılaştırmalarda ikiden fazla olasılık varsa If-End If işlem bloğunda ELSE deyiminden başka bir de ELSEIF yardımcı deyiminden yararlanılır. IF İfade1 THEN 130 ...... ELSEIF İfade2 THEN ...... ELSEIF İfade3 THEN ....... ELSE ........ END IF Eğer birinci karşılaştırma (İfade1) mantıksal doğru değerine sahipse, IF deyiminin bulunduğu satır ile ilk ELSEIF deyiminin bulunduğu satıra kadar olan program satırları işletilir. Ardından programın işletimi blok sonuna işaret eden END IF deyiminden sonraki satıra geçer. Bu durumda işlem bloğundaki ELSEIF yardımcı deyimleri ile hazırlanan işlemlerin sonucuna bakılmaz. IF deyimine parametre olarak verilen ifade1 mantıksal yanlış değerine sahipse bu kez ELSEIF deyimine parametre olarak verilen ifade2’nin sonucuna bakılır. İfade2 doğru değere sahipse, ilk ELSEIF ile 2.ELSEIF deyimleri arasında kalan program satırları işletilir. İfade1,İfade2 ve İfade3 karşılaştırmaları mantıksal yanlış değerine sahipse en son olarak ELSE deyimi ile ENDIF deyimi arasında kalan program satırları işletilir. Private Sub Form_Load() Ders_Not = InputBox(“Öğrencinin notunu girin “) If Ders_Not < 50 Then MsgBox (“Bu öğrenci zayıf not aldı”) ElseIf Ders_Not >= 50 And Ders_Not < 70 Then MsgBox (“Bu öğrenci orta not aldı”) ElseIf Ders_Not >= 70 And Ders_Not < 90 Then MsgBox (“Bu öğrenci İyi not aldı”) Else MsgBox (“Bu öğrenci Pekiyi not aldı”) End If End Sub ELSEIF’lerin sayısı istenildiği kadar arttırıla bilinir. Ancak iç içe ve karmaşık kontrol blokları oluşturmak programın okunurluğunu azaltacağından çok gerekmedikçe iç içe karmaşık İf-Else’lerden kaçınmak gerekir. Genel yazılıştaki “ifade” yerine bir fonksiyonun geriye döndüreceği mantıksal değeri ifade olarak kullanmak mümkündür. 2. IIf Fonksiyonu IIF fonksiyonu çalışma mantığı ve yaptıkları itibarı ile IF deyimine pek benzemiyor. IIF fonksiyonu da IF deyimi gibi bir mantıksal durumu değerlendirmekte ve ona göre davranmaktadır. 131 Genel Yazılışı IIF( Mantıksal İfade, Birinci, İfade, İkinci İfade) Genel yazılışından da görüleceği gibi IIF() fonksiyonu dışarıdan parametre olarak üç adet bilgi almaktadır. Birinci parametrenin mantıksal değer üreten bir ifade olması gerekiyor. İkinci ve Üçüncü parametreler için bir sınırlama bulunmuyor. Eğer mantıksal ifade, mantıksal doğru değerine sahipse IIF() fonksiyonu geriye ikinci parametrede verilen ifadeyi, yanlışsa bu kez üçüncü parametrede verilen ifadeyi geriye döndürür. Private Sub Form_Load() Ders_Not = InputBox(“Öğrencinin notunu girin “) Sonuc = IIF(Ders_Not >=50, “Geçer not”, “Zayıf Not”) MsgBox Sonuc End Sub Aslında IIF fonksiyonu bir bakıma IF deyiminin kısıtlı bir şeklidir. Yalnızca iki olasılığın söz konusu olduğu durumlarda IF deyiminin yerine IIF fonksiyonunu kullanabilirsiniz. 3. Select Case – End Select Deyimi SELECT CASE –END SELECT deyimi işlev bakımından IF-ENDIF deyimine çok benzemektedir. Çok sayıda iç içe IF-ENDIF işlem blokları kullanıldığı zaman programın okunurluğu azalır programı izlemek zorlaşır. Select Case dallandırma tek bir düğme değişkenine ya da durum tersi (test case) bağlı olduğu zaman, onlardan çok daha etkilidir. Genel Yazılışı SELECT CASE Kontrol değişkeni CASE İfade1 ........ CASE İfade2 ........ CASE ELSE ........ END SELECT SELECT CASE ile program bloğu başlar ve END SELECT ile biter. Genel yazılıştan tespit edileceği gibi blok başlatan SELECT CASE deyiminden sonra yapılacak karşılaştırmalarda kullanılacak bir kontrol değişkeni bulunmaktadır. Eğer kontrol değişkeninin içeriği “İfade1” olarak verilen değerle aynı ise, birinci ifadenin içeriğini araştıran CASE deyiminden bir sonraki CASE deyimine kadar olan program satırları işletilir ve program akışı END SELECT deyimini izleyen satıra geçer. Eğer ikinci koşul doğru değerine sahipse, bu kez CASE deyiminden sonra bir sonraki CASE ile CASE ELSE’e kadar olan program satırları işletilir. CASE ile END SELECT arasında CASE deyimi ile birlikte kullanılan bütün koşullar yanlış sonucunu veriyorsa CASE ELSE seçeneği varsa CASE ELSE’den END SELECT’e kadar olan program satırları işletilir. 132 SELECT CASE ile CASE döngüsü başlatıldıktan sonra sıra ile bütün “CASE İfade” bulunan satırlar taranır. Eğer “ifade” olarak belirtilen bilgi veya bilgiyi temsil eden değişkenin içeriği ile kontrol değişkeninin içeriği birbirine eşitse, ikinci “CASE ifade2” bulunduğu satıra kadar olan program satırları işletilir. Private Sub Form_Load() Sayı = InputBox(“1 ile 4 arası bir sayı girin “) Select Case Sayı Case 1 MsgBox (“Girdiğiniz Sayı 1”) Case 2 MsgBox (“Girdiğiniz Sayı 2”) Case 3 MsgBox (“Girdiğiniz Sayı 3”) End Select End Sub Aşağıdaki verilen SELECT CASE deyiminin kullanıldığı örnek ile, daha önce If-END IF blok deyimini anlatmak üzere verilen örnek aynı işleve sahiptir. Bu örnekte bir önceki örnekten farklı olarak “Is” yardımcı deyiminden sonra karşılaştırma işlemi yapılıyor. Private Sub Form_Load() Ders_Not = InputBox(“Öğrencinin aldığı notunu girin “) Select Case Ders_Not Case Is < 50 MsgBox (“Bu öğrenci zayıf not aldı”) Case Is >= 50 MsgBox (“Bu öğrenci geçer not aldı”) End Select End Sub Private Sub Form_Load() Show Print “1-Yeni kayıt Girişi” Print “2-Kayıt Okuma” Print “3-Kayıt Düzeltme” Print “4-Kayıt Silme” Print “Programdan Çıkış” SECIM = InputBox(“Seçiminizi Girin”) Select Case SECIM Case 1 133 Kayıt Case 2 Okuma Case 3 Düzeltme Case 4 Silme Case 5 End End Select End Sub Bu örnek program çalıştırıldığı zaman kullanıcıya seçim yapma şansı vermek için InputBox() fonksiyonu ile ekrana bir diyalog kutusu getirilir. Girişi yapılan sayısal değer SECİM değişkenine aktarılır. Örnek program parçasındaki CASE blok deyiminin koşulu SECİM değişkeninin içeriği test etmekle ilgili SECİM değişkenin içeriği 1 ise “Kayıt” satırı ile KAYIT adlı procedure veya BAS uzantılı modül dosyası işletilir. Eğer SECİM değişkeninin içeriği 2 ise bu kez OKUMA adlı diğer yordam işletilir. 4. Do While – Loop Deyimi DO WHILE –LOOP blok kontrol deyimi verilen şarta bağlı olarak bloklanan program satırlarının bir döngü halinde tekrar tekrar işletilmesini sağlar. Blok DO WHILE deyiminin bulunduğu satırdan başlayıp LOOP deyiminin bulunduğu satırda biter. Genel Yazılışı DO WHILE İfade .......... EXIT DO ........... LOOP Genel yazılışta verilen EXIT DO yardımcı ek deyiminin kullanılması isteğe bağlıdır. DO WHILE deyimine parametre olarak verilen “İfade” doğru değerine sahip olduğu ve EXIT DO deyimi ile müdahale edilmediği sürece, DO WHILE ile LOOP deyimleri arasında yer alan program satırları döngü halinde tekrar tekrar işletilir. “ifade” yerine IF deyiminde olduğu gibi mantıksal bir karşılaştırma, bir değişken veya tek başına doğru(True) ile Mantıksal yanlış (False) kullanılabilir. Kullanılacak karşılaştırmanın sonucu mantıksal 134 doğru (True) olduğu sürece “DO WHILE ifade” ile “LOOP” arasında yer alan program satırları bir döngü halinde sürekli olarak işletilir. Private Sub Form_Load() Dim Ogrenci(10) As Integer i =1 Do While i <=10 Ogrenci(i) = InputBox (Str(i) & “. Öğrencinin Notu”) i = i+1 Loop i = 1 Show FontSize =12 Do While i <=10 Print Str(i) & “. Öğrencinin aldığı noy” & Str(Ogrenci(i)) i=i+1 Loop End Sub İkinci Do While döngüsünde öğrencilerin aldıkları notlar sıra ile ekrana yazılmaktadır. Döngü içinde döngü kontrol değişkeni olarak kullanılan “i” değişkeninin değeri her turda arttırılmasaydı döngü, kısır döngü durumuna düşerdi. Bu bakımdan kurulan döngülerden çıkma koşulları en başında düşünülmelidir. DO WHILE-LOOP deyiminin genel kullanış biçiminde bulunan ve kullanılması isteğe bağlı olan EXIT DO yardımcı deyimi, döngüden “ifade” ile belirtilen şarta bağlı kalmadan çıkmayı sağlar. Programın işletimi EXIT DO deyimine geldiğinde veya döngü içerisinde EXIT DO deyiminin kullanılması halinde, EXIT DO deyiminden LOOP deyimine kadar olan program satırları işletilmeyip program işletimi LOOP deyiminin bulunduğu satırı izleyen satıra geçer. EXIT DO deyimi daha çok döngüden çıkmanın bir şarta bağlanmadığı durumlarda kullanılır. Bu durumda EXIT DO deyimi kullanılana değin sürekli olarak döngü içinde kalınır. Genel alışkanlıkla yalnızca EXIT DO deyimi ile çıkılacak şekilde oluşturulan DO WHILE-LOOP döngülerinde “İfade” olarak mantıksal sabit bir değer veya değişken kullanılır. DO WHILE True .......... IF koşul EXIT DO ENDIF LOOP 135 Yukarıda verilen DO WHILE –LOOP döngüsünün her turunda IF deyimi ile “koşul” test edilir. Eğer koşul mantıksal doğru değerini içeriyorsa programın işletimi döngüden çıkılarak LOOP deyimine izleyen satıra geçer. Döngü kontrol ifadesi olarak mantıksal sabit yani True kullanılması halinde döngüden EXIT DO ile çıkılmadığı sürece döngü sonsuz olur. Bu nedenle yukarıdaki tipteki döngülerde mutlaka döngüden çıkabilmek için belirli şartlara bağlı olarak EXIT DO deyiminin aktive olması sağlanmalıdır. Private Sub Form_Load() Dim Ogrenci(10) As Integer i =1 Do While True Ogrenci(i) = InputBox (Str(i) & “. Öğrencinin Notu”) i = i+1 Cevap = MsgBox (“Devam edecek misiniz”,4) If Cevap = 7 Then Exit Do End If Loop End Sub Evet düğmesinin seçildiğinde MsgBox geriye 6, Hayır düğmesi seçildiğinde geriye 7 değerini döndürür. Şimdiye kadar anlatılan Do While- Loop örneklerinde döngünün devam etme koşulları en başında test ediliyordu. Döngü koşulunun en başında mantıksal yanlış değerine sahip olması halinde döngü başlamadan biter. Do While döngü deyiminin döngü koşulunun döngü sonunda test edilen değişik bir tipi daha vardır. DO ....... EXIT DO .......... LOOP WHILE İfade Döngü koşulunun döngünün sonunda kontrol edildiği bu döngü tipinde, döngü koşulu ne olursa olsun her şartta döngüde bulunan program satırları en azından bir kez işletilir. 5. For-Next Döngü Deyimi DO WHILE-LOOP ile oluşturulan döngülerde önceden döngü dahilinde bulunan program satırlarının kaç kez tekrarlanacağı bilinmez. FOR-NEXT ile oluşturulan döngülerin kaç kez tekrarlanacağı önceden bellidir. 136 FOR Döngü Değişkeni = İlk Değer TO Son Değer STEP Artım .......... [EXIT FOR] .......... NEXT Döngü Değişkeni Genel yazılıştaki Döngü Değişkeninin kullanılmadan önce tanımlanması önerilir. Bu değişken daha önceden ilk değer verilerek tanımlanmamışsa bu değişken otomatik olarak oluşturulur. FOR deyimine ikinci parametre olarak verilen ilk değer döngü değişkeninin alacağı ilk değerdir. Son değer işe döngü değişkeninin alabileceği son değerdir. Artım değerinde döngü dahilinde bulunan program satırlarının her turda işletilmesinden sonra Döngü değişkeninin ne kadar artacağı yazılır. Artım değeri yazılmazsa bunun 1 olduğu varsayılır. Artım değeri pozitif bir değere sahipse başlangıç değerinin Son değerden daha küçük olması gerekir. Eğer artım negatif bir değere sahipse bu kez başlangıç değerinin daha büyük olması gerekir. FOR X =1 TO 10 ................... .................. NEXT X Bu döngü örneğinde X döngü değişkeni, 1 döngü değişkeninin başlangıç değeri ile 10 döngü değişkeninin son değeridir. Artım değeri verilmediği için 1 olduğu varsayılacaktır. Bu döngüde FOR ile NEXT arasında kalan program satırları arka arkaya 10 kez işletilir. EXIT FOR deyimi DO WHILE –LOOP deyiminde olduğu gibi programın akışını NEXT deyimine ulaşmadan tekrar FOR deyimini izleyen satıra aktarır. EXIT FOR ise döngüden belirli bir şarta bağlı olarak döngü tasarlanan sayıda tekrarlanmadan çıkmayı sağlar. 6. Örnek Problem 137 Option Explicit Dim Gridcizgi As Boolean Private Sub DrawGrid() Dim X As Integer Dim Y As Integer Dim Color As Integer If Gridcizgi Then Exit Sub Else Gridcizgi = True If Grid.Checked Then Color = RGB(255, 0, 0) For X = Picture1.Width \ 20 To Picture1.Width Step Picture1.Width \ 20 Picture1.Line (X, 0)-(X, Picture1.Height), Color Next X For Y = Picture1.Height \ 20 To Picture1.Height Step Picture1.Height \ 20 Picture1.Line (0, Y)-(Picture1.Width, Y), Color Next Y Else Picture1.Cls End If Gridcizgi = False End Sub Private Sub Grid_Click() 138 Grid.Checked = Not Grid.Checked DrawGrid End Sub 7.c. Diziler · · · · Dizi Nedir? Dizi Tanımlamak o Dizileri Normal Değişkenler Gibi Tanımlamak o Dizileri To Sözcüğü İle Tanımlamak Dinamik Diziler Çok Boyutlu Diziler o Dizi Elemanlarına Döngüler Aracılığı İle Erişim Dizi Nedir? Aynı tipe sahip birbirine benzer çok sayıda değişkenleri temsil etmek için dizi kullanılır. Bir değişken programın herhangi bir yerinde farklı değerlerin saklanabileceği bir depolama aracı olarak düşünülebilir. Dizi ise birden çok depolama aracının oluşturduğu bir topluluktur. Topluluğun içindeki her bir elemana onun yerini belirten indeksi aracılığı ile ulaşılır. Visual Basic’te genellikle dizinin ilk elemanı 0 numaralı indeksle ulaşılan elemandır. Diziler farklı uzunlukta olabilir. Bir dizinin üç elemanı varken diğerinin 30 elemanı olabilir, hatta bazı dizilerin başlangıçta hiç elemanı olmayıp uzunluğu daha sonra belirlenebilir.. 139 Dizi Tanımlamak Dizileri normal bir değişken gibi veya alt ve üst sınırların belirtmek için To sözcüğü ile tanımlıyabiliriz. Dizileri Normal Değişkenler Gibi Tanımlamak Diziler normal değişkenler gibi aşağıdaki format kullanılarak tanımlanır. Dim|Public|Private Diziİsmi(ÜstSınır) As VeriTipi Bu format içinde, · · Dim, Public, and Private, aidiyeti anlatan Visual Basic sözcükleridir. Eğer Dim kullanırsanız dizi tanımlandığı yordam içinde geçerlidir. Public diziyi program için genel yapar, form modülünün veya modülün general declaration bölümünde private tanımlanan dizi tanımlandığı modül içerisinde her yerde geçerlidir. Diziİsmi tanımlanan dizinin adıdır. Option base Dizi tanımlandığında dizinin ilk elemanı 0ncı elemanıdır, çünki option base varsayılan değeri 0’dır. Eğer modülün general declaration bölümünde Option Base 1 yazarsanız tanımlanan dizinin alt sınır 1 olur. · ÜstSınır dizinin son elemanın pozisyonunu(indeksini) veriri. Eğer üst sınır 6 olarak tanımlanmışsa dizinin ilk elemanı 0dan başlayacağı için dizinin eleman sayısının 7 olacağına dikkat ediniz. · As tip bildiriminde kullanılan Visual Basic sözcüğüdür. · VeriTipi Visual Basic için geçerli standart veya kullanıcı tanımlı veri tiplerinden birisidir. Örneğin beş elemanlı tamsayı bir dizi aşağıdaki şekilde tanımlanır: Dim iMyArray(4) As Integer Dizinin elemanlarına aşağıdaki şekilde değer atanabilir: iMyArray(0) iMyArray(1) iMyArray(2) iMyArray(3) = = = = 9 342 2746 0 140 iMyArray(4) = 8901 To change the value of the fourth element of the array iMyArray dizisinin dördüncü elemanının değerini 0 dan 45 e değiştirmek için aşağıdaki cümleyi yazın. iMyArray(3) = 45 Dizileri To Sözcüğü İle tanımlamak Dizilerin tanımında To sözcüğü kullanılırsa açıkça alt sınırı ifade edilebilir. Örneğin ilk elemanın pozisyonu 1 son elemanının pozisyonu 5 olan, 5 elemanlı bir tamsayı dizi aşağıdaki şekilde ifade edilebilir. Dim iMyArray(1 To 5) as Integer Dinamik Diziler Dizileri tanımlarken eleman sayısı tanımladığımızda statik dizi oluştururuz. Dizileri dinamik olarak tanımlamak ihtiyacımıza göre dizinin eleman sayısını değiştirmek yani yeniden boyutlandırmak mümkündür. Bu şekilde oluşturulan diziler dinamik dizilerdir. Bunun için önce diziyi eleman sayısız olarak tanımlarız., daha sonra aynı diziyi istediğimiz eleman sayısı ile redim komutuyla yeniden tanımlarız. ReDim [Preserve] Diziİsmi(ÜstSınır) As VeriTipi Bu format içinde, · · ReDim önceden eleman sayısız olarak tanımlanmış diziyi boyutlandırarak yeniden tanımlamak için kullanılan Visual Basic sözcüğüdür. Preserve seçimlik Visual Basic sözcüğüdür, dizinin içindeki eski değerlerin korunarak yeniden boyutlandırılacağını gösterir. Eğer preseve sözcüğü kullanılmazsa dizinin elemanlarına sayısal ise 0 değeri, string ise “” değeri, variant ise empty değeri atanır. · Diziİsmi tanımlanan dizinin adıdır. · ÜstSınır dizinin son elemanın pozisyonunu(indeksini) veriri. · As tip bildiriminde kullanılan Visual Basic sözcüğüdür. · VeriTipi Visual Basic için geçerli standart veya kullanıcı tanımlı veri tiplerinden birisidir. Aşağıdaki listede dinamik dizi kullanımına örnek verilmiştir. 141 LISTE 1—Dinamik Dizi Kullanımı 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 `Create an array without any elements Dim strMyArray() as String `Dimension the array for 9 elements ReDim strMyArray(8) `Assign values to the array elements strMyArray(0) = "I am a pitcher." strMyArray(1) = "I am a catcher." strMyArray(2) = "I play first base." strMyArray(3) = "I play second base." strMyArray(4) = "I play third base." strMyArray(5) = "I play shortstop." strMyArray(6) = "I play left field." strMyArray(7) = "I play center field." strMyArray(8) = "I play right field." `Add an element and make it so all the values `of the previous elements are kept intact ReDim Preserve strMyArray(9) `Assign a value to the new array element strMyArray(9) = "I am the designated hitter." Çok Boyutlu Diziler Şimdiye kadar bir boyutlu dizileri kullandık. Matris işlemlerinde iki boyutlu, vektör işlemlerinde ise üç boyutlu dizilere ihtiyaç duyarız. Visual Basic 60 boyutlu dizilere kadar çok boyutlu dizi tanımlayıp kullanabilmemize imkan verir. Örneğin iki boyutlu bir dizi(matris) aşağıdaki şekilde tanımlanır. Dim|Public|Private Diziİsmi(ÜstSınır1, _ SubscriptOfRows) As DataType Bu format içerisinde, · Dim, Public, and Private, aidiyeti belirten Visual Basic sözcükleridir. Diziİsmi tanımlanan dizinin adıdır. · ÜstSınır1 dizi içindeki en yüksek kolon sayısı veya birinci boyutun üst sınırını · ÜstSınır2 dizi içindeki en yüksek satır sayısını veya ikinci boyutun üst sınırını · As tip bildiriminde kullanılan Visual Basic sözcüğüdür. · VeriTipi Visual Basic için geçerli standart veya kullanıcı tanımlı veri · tiplerinden birisidir. 142 Aşağıdaki örnekte üçboyutlu bir dizinin nasıl tanımlanacağına ve elemanlarına nasıl değer atanacağına ilişkin bir örnek verilmiştir. Dim iVar(1,2,1) as Integer iVar(0,0,0) = 5 iVar(0,1,0) = 187 iVar(0,2,0) = 16 iVar(1,0,0) = 12 iVar(1,1,0) = 55 iVar(1,2,0) = 7 iVar(0,0,1) = 34 iVar(0,1,1) = 13 iVar(0,2,1) = 4500 iVar(1,0,1) = 612 iVar(1,1,1) = 9 iVar(1,2,1) = 784 Bir boyutlu dizilerde olduğu gibi To sözcüğü kullanılarak her bir boyutun alt ve üst sınırı açıkça ifade edilebilir. Dim dMyArray(1 To 5, 3 To 8, 3 To 5) As Double Redim sözcüğü kullanılarak çok boyutlu dizilerin her boyutunun eleman sayısı değiştirilebilir. Preserve kullanılırsa sadece sonunucu boyutun eleman sayısı değiştirilebilir. Redim komutu ile boyut sayısı değiştirilemez. Dizi Elemanlarına Döngüler Aracılığı İle Erişim For...Next döngüsünü dizi elemanlarına erişmek değerlerini okumak ve değiştirmek için kullanmak diziler ile çalışırken büyük kolaylık sağlar. Aşağıdaki listede dizi elemanlarına erişim için for...next döngüsü kullanımına bir örnek verilmiştir. Örnekte bir komut düğmesinin Click() olay alt yordamı içerisinde 20 elemanlık bir dizi oluşturulmuş, birinci for...next döngüsünde dizi elemanlarına değer atanmış, ikinci döngüde ise her elemanın değeri bir string içine yüklenmiştir. LISTE 2—Diziler İçin For...Next Döngüsü Kullanımı 01 02 03 04 05 06 07 Private Sub cmdTraverse_Click() Dim i% Dim iMyArray%(19) As Integer Dim BeginMsg$ Dim MidMsg$ Dim LoopMsg$ Dim FullMsg$ 143 08 09 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 `Assign a value to each element in the array `by using a loop to traverse to each element `in the array. For i% = 0 To 19 `Make the value of the element to be `twice the value of i% iMyArray%(i%) = i% * 2 Next i% `Create the BeginMsg$ string BeginMsg$ = "The element is: " MidMsg$ = ", The value is: " `Go through the array again and make `a string to display For i% = 0 To 19 LoopMsg$ = LoopMsg$ & BeginMsg$ & CStr(i%) LoopMsg$ = LoopMsg$ & MidMsg$ & iMyArray(i%) `Concatenate the loop message to the `full message. Also add a line break FullMsg$ = FullMsg$ & LoopMsg$ & vbCrLf `Clean out the loop message so that `new value next time through the loop LoopMsg$ = "" Next i% txtTraverse.Text = FullMsg$ End Sub 144 7.d. Alt Yordam Hazırlamak ve Kullanmak Form veya diğer nesnelerle ilgili olarak projelere dahil edilen yordamların dışında istediğiniz işlemler için başka yordamlar hazırlayabilirsiniz. Formlara veya BAS uzantılı Module dosyalarına, tanımlı olan mevcut yordamların dışında yeni bir yordam eklemek için Tools menüsündeki Add Procedure komutundan yararlanılmaktadır (Şekil 7.d-1). Tools menüsünden Add Procedure komutunu verirseniz ekrana Add Procedure diyalog kutusu gelir. Bu diyalog kutusunda hazırlanacak yordamın tipi, adı ve geçerlilik alanı belirlenir. Yordamlar Sub, Function, Prpperty ve Event şeklinde üç gruba ayrılmaktadır. Şekil 7.d-1 Sub tipi yordamlar geriye bir değer döndürmezlerken Function tipi yordamlar geriye mutlaka bir değer döndürürler. Örnek kullanıcının MsgBox deyimi ile ekrana gelen diyalog kutusunda yaptığı seçimi temsil eden sayısal değeri bir değişkene aktarmak suretiyle yakalamak istiyorsanız MsgBox deyimi yerine MsgBox() fonksiyonunu kullanmalısınız. Cevap = MsgBox (“Bu Silme İşlemini Onaylıyor musunuz ?”, 4) Bu nedenlerden dolayı hazırlanmak istenen yordamın geriye bir değer döndürmesi isteniyorsa Procedure tipi olarak Function seçilmelidir. Ancak geriye döndürülmek istenen bir değer yokken bile Function tipinde yordamlar hazırlanabilir. Hazırlanmak istenilen yordamlar Form1’deki mevcut nesnelerle direk ilgili olmadığı için Object liste kutusuna otomatik olarak (general) seçeneğine yazılır. 145 Nesnelerle ilgili olan yordamlar, nesnelere uygulanma olasılığı olan olaylara endeksli olduğundan yordamı hazırlamak yeterli olur. Ancak Tolls menüsündeki Add Procudure komutu ile hazırlanan yordamları hazırlamak yetmez. Söz konusu yordamın nasıl ve hangi olaylarla bağlantılı olarak işletileceği konusunda önceden hazırlık yapılmalıdır. Aslında Sub tipli yordam hazırlamak için Tolls menüsündeki Add Procedure komutuna başvurmak zorunluluğu yoktur. Aktif formun veya BAS uzantılı modül dosyanın Code penceresinde Object liste kutusunda (general) seçeneği varken Sub bildiri deyimi ile doğrudan yordam yazımı yapılabilir. Normal şartlarda çağırılan bir yordamdaki program satırları sıra ile işletilir. Yordamdaki bütün satırlar işletildikten sonra projenin işletimi söz konusu yordamın çağırıldığı program satırından bir sonraki satıra geçer. Eğer çağırılıp işletilen yordamdan sonra işletilen başka bir yordam veya program satırı yoksa ve proje End deyimi ile sona erdirilmezse Projenin işletimi aktif Formda kalır. Diğer taraftan yordamlarda kullanılacak blok kontrol deyimleri sayesinde program satırlarının sıra ile işletilmesi önlenebilir. Bunun dışında yordamda bulunan bütün satırlar işletilmeden yordamdan çıkılabilir. Bu amaçla Exit Sub deyiminden yararlanılmaktadır. Add Procedure diyalog kutusunda yordamın tipinden başka ayrıca yordamın geçerlilik alanı seçilmektedir. Bu amaçla Scope adı altında bir araya getirilen Public veya Private radyo düğmelerinden biri seçilir. Başlangıçta Public radyo düğmesi seçili durumda olduğu için hazırlanacak yordam projenin bütün form ve modüllerinde kullanılabilir. Eğer Add Procedure diyalog kutusunda Private radyo düğmesini seçili duruma ondan sonra yordam hazırlarsanız, bu yordamı başka bir Form veya Modül dahilinde kullanamazsınız. 1. Fonksiyon Hazırlamak Bir fonksiyon hazırlamak için Sub tipi yordam hazırlama işleminde olduğu gibi Code penceresi açık durumda iken Tools menüsünden Add Procedure komutu verilir. Bu komut verilince ekrana gelen Add Procedure diyalog kutusunda Procedure tipli Function seçilir (Şekil 7.d-2) 146 Şekil 7.d-2 Bu diyalog kutusunda Procedure tipinden başka fonksiyonun adı belirlenir. Fonksiyonlar Function bildiri deyimi ile başlatılır ve fonksiyonun sonunu belirtmek için End Function deyimi kullanılır. Eğer fonksiyonun yalnızca içinde hazırlandığı Form veya modülde kullanılabilmesini istiyorsanız Add Procedure diyalog kutusunda Private radyo değmesini seçili duruma getirmeniz gerekir. Public Function Karekök ( X As Double) As Double Select Case Sqn (X) Case 1 Karekök = Sqr(X) Exit Function Case 0 Karekök = 0 Exit Function Case –1 Karekök = -1 End Selevt End Function Fonksiyonların Sub tipi yordamlardan en önemli farkının fonksiyonların geriye bir değer döndürmeleri olduğunu daha önce belirtmiştik. Geriye döndürülecek değerlerin tipi Fonksiyon adından sonra belirtilir. Buna göre örnek olması için hazırladığım Karekök() fonksiyonunda geriye 147 Double tipte bilgi döndürülür. Visual Basic’te geriye değer döndürme işlemi, Fonksiyon adını değişken gibi kullanıp ona değer aktarma şeklinde olmaktadır. Ancak Fonksiyon adını değişken gibi kullanıp değer aktarma işlemi fonksiyondan çıkmaya neden olmamaktadır. Fonksiyonlardan çıkmak için ayrıca Exit Function deyiminin kullanılması gerekir. Private Sub Form_Click() Dim Kök Dim Sayı As Double Sayı = InputBox ( “ Karekökü alınacak sayıyı girin”) Kök= Karekök (Sayı) Select Case Kök Case 0 MsgBox (“Girilen sayı sıfır”) Case -1 MsgBox (“Girilen sayı negatiftir”) Case –1 MsgBox (“Girilen sayının karekökü :” & Kök End Select End Sub Eğer hazırladığınız fonksiyonun yalnızca içinde hazırladığınız Form ve modülde kullanılabilmesini istiyorsanız Fonksiyon adından önce Private bildiri deyimini kullanmalısınız. Buna göre geçerlilik alanı bildirilmeyen fonksiyonlar bütün Form ve modüllerde kullanılır. 2. Fonksiyon Çağırmak ile İlgili Program Public Function Çarpım(X As Integer, Y As Integer) Dim Z Z = X * Y Çarpım = Z End Function Private Sub Command1_Click() 'Call Çarpım(2, 3) 'Çarpım 2, 3 Text1.Text = Str(Çarpım(6, 8)) End Sub 148 7.e. DOSYA İŞLEMLERİ Dosyalar üzerinde işlem yapma örneğinin kolay izlenebilmesi ve anla şılmasını sağlamak için tek proje yerine her i şlem için bir proje hazırlayalım. Kayıt girişi işlemi ayrı, Kayıt düzeltme, Kayıt silme ve Liste alma i şlemleri için önce ayrı ayrı projeler hazırlayalım. Daha sonra ayrı ayrı hazırladığımız projeleri bir tek projede birle ştirelim. 1. Dosyalara Kayıt Girmek 149 Bütün programlama dillerinde programcılar özellikle hard diskte veri tabanı dosyalarına yazılacak bilgileri belirlerler. Veri tabanı dosyalarına bir kişi, bir kuruluş veya ticari işlemle ilgili yazılan bilgilerin hepsine birden “kayıt” adı verilmektedir. Hazırlamak istediğimiz örnek veri tabanı dosyasına yazılacak her kayıtta şu bilgiler olsun; · Ad · Soyad · Adres · Tel · Sehir Kayıt bilgilerinin her birine alan adı verilmektedir. Kayıtta bulunan bütün bilgiler karaktersel tipte olsun. Bu amaçla hazırlanacak olan Giriş adlı projenin formunda, kayıtta bulunacak alanlarla aynı ada sahip TextBox’lar ve gerekli Label’ler hazırlayalım (Şekil 7.e-1). Şekil 7.e-1 Formun başlığını “Kayıt Girişi” ve proje içindeki projenin adını “GIRIS” olarak verelim. (Şekil 7.e-2). Ayrıca “Kayıt No” başlığına sahip olan Label nesnesinin hemen yanında bulunan ilk TextBox’a Proje dahilinde geçerli olmak üzere “KayıtNo” ve diğerlerine sırayla “Ad”,”Soyad”,”Adres”,”Tel” ve “Sehir” adlarını verelim (Şekil 7.e-1). Formlara eklenen her kontrol veya nesne için geçerli olmak üzere ve nesneye uygulanabilecek her bir olay için program kodu hazırlamak mümkündür. Ancak Visual Basic programları yalnızca nesneler ve bu nesneler için hazırlanan program kodlarından meydana gelmezler. Visual Basic projesi ayrıca program kodu içeren BAS uzantılı Module dosyalarını da içerebilir. Kayıt tipinde değişken tanımlama satırlarının projeye dahil edilen formların dışında ayrı bir BAS uzantılı dosyaya yazılması gerekir. Diğer taraftan Formlara ait kod pencerelerinde Object liste kutusunda (general), Prog liste kutusundaki yordam (olay) adları dışında (declaration) adında bir seçenek daha vardır. Bu seçenekte Form dahilinde kullanılacak değişkenler deklare edilir veya tanımlanır. Dosyaya yazılacak bilgileri belirlemek amacıyla kullanılan Kayıt tipindeki değişkenin bir Module dosyası içinde tanımlanması gerekir. Projelere Module dosyası eklemek için Project menüsündeki Add Module komutundan yararlanılmaktadır 150 Şekil 7.e-2 Projelere Module dosyası eklemek için Project menüsündeki Add Module komutundan yararlanılır. Project menüsünden Add Module komutunu verirseniz, projeye modül ekleme işlemi öncesinde ekrana Add Module diyalog kutusu gelir. Bu diyalog kutusundaki Module simgesi seçili durumda iken Aç düğmesinde tıklama yapılırsa projeye modül ekleme işlemi tamamlanmış olur (Şekil 7.e-3). Şekil 7.e-3 Daha önce hazırlanıp hard diske kaydedilmiş olan Module dosyalarından biri projeye dahil edilmek istenirse Existing sekmesine geçilmelidir. Eğer projeye ilk kez Module dosyası ekleniyorsa ekrana gelen bu Module penceresinin başlığı Module1.bas olur. Bu pencere, Formlar için ekrana getirilen kod penceresinden görünüm olarak farklı değildir. Eğer normal bir modül dosyası hazırlamak istiyorsa Add Module diyalog kutusundan Module seçeneği seçilmelidir. Eğer bir Addin (İçine-ekle) dosyası hazırlanıp projeye dahil edilmek isteniyorsa bu kez Addin seçeneğinin seçilmesi gerekir. Eğer projeye ilk kez Module dosyası ekleniyorsa ekrana gelen bu Module penceresinin başlığı Module1.BAS olur. Nasıl ki bir formda birden fazla Sub( yordam) bulunabiliyorsa bir Modülde de birden fazla yordam ve kullanıcı tanımlı fonksiyon bulunabilir. Kayıt tipli değişkenin tanımlandığı program satırları bir yordamın içine yazılmayıp Object liste kutusunda (general) ve Prog liste kutusunda (declaration) seçeneği seçili durumda iken yazılır. 151 Şekil 7.e-4 Bir veya birden fazla normal değişkenden meydana gelen Kayıt tipli değişken tanımlama satırları Type deyimi ile başlar ve End Type bildiri deyimi ile biter (Şekil 7.e-4). Kayıt tipli değişkenlere dahil edilen karaktersel değişkenlerin uzunlukları ayrıca belirlenir. Type-End Type bildiri deyimleri ile tanımlanan kayıt tipli değişkeni projenin diğer form veya modüllerinde kullanabilmek için söz konusu kayıt tipli değişkenin Global bildiri deyimi ile tanımlanması gerekir. Projede kullanılan ve GİRİŞ adı verilen forn için yazılan program kodları aşağıda şekilde verilmiştir. Daha önce belirtildiği gibi en başta bilgi kaydedilecek dosyanın açılması gerekir. Bu amaçla kullanılacak deyimin adı Open’dir. Private Sub Form_Load() Open “Adres.dat” For Random As #1 Len = Len (Alanlar) KayıtNo = LOF (1) / Len (Alanlar) KayıtNo = KayıtNo +1 End Sub Open deyimi ile açılacak dosyanın adı “Adres.dat” olarak seçilsin. Open deyimi, Adres.dat dosyasını o sırada geçerli olan sürücü ve klasörde bulamazsa dosyayı oluşturur. Programın daha sonraki çalışmalarında dosya geçerli klasörde olacağı için Visual Basic dosyayı açmakla yetinir. Open deyimi ile açılacak dosya adından sonra Open deyimine parametre olarak verilen For Random ile dosyanın random yani rasgele erişimli olduğu belirlenir. Formların biri hard diskte, diğeri de proje içinde geçerli olan iki adı vardır. Benzer durum kayıt yazmak amacıyla açılan dosyalar için de geçerlidir. Dosyaların hard diskteki adlarından başka birde proje içinde geçerli olan adları vardır. Random dosyaların proje içindeki adları sayısal bir değerdir. Dosya adını temsil eden bu sayısal değerin önüne ayrıca “#” karakteri konulur. Dosyanın proje içinde adı başka bir deyişle numarası 1 ile 255 arasında değişen bir değer olabilir. Daha sonra dosyaya Put deyimi ile kayıt yaparken, kaydın yazılacağı dosyayı belirlemek için dosyanın diskteki adı yerine, proje dahilindeki adı kullanılır. Open deyimine parametre olarak verilen en son bilgi ise bir kaydın byte olarak uzunluğudur. Kaydın byte olarak uzunluğunu belirlemek için Len() fonksiyonundan yararlanılır. Random dosyalara kayıt yazarken her kayda bir kayıt numarası verilir. İlk kaydın numarası 1 olmak üzere her yeni kaydın kayıt numarası 1 arttırılır. Kayıtlara düzenli ve artan bir sırada kayıt numarası verilmezse dosyada gereksiz boşluklar olur. Bu nedenle dosyaya bir kayıt yazılmadan önce dosyaya o ana kadar kaç kaydın yazılmış olduğu öğrenilir. Dosyadaki mevcut kayıtların sayısını öğrenmek için dosyanın Byte olarak büyüklüğü kayıt uzunluğuna bölünür. 152 Daha önce verilen kod penceresinden tespit edileceği üzere dosyanın byte olarak büyüklüğünü bulmak için Visual Basic fonksiyonlarından biri olan LOF() fonksiyonundan yararlanılır. Dosyanın Byte olarak büyüklüğü kayıt boyuna bölünürse, dosyaya o ana kadar yazılmış olan kayıtların sayısı bulunur. Bulunan Kayıt sayısı, dosyaya yeni bir kayıt yazma işlemi öncesi 1 arttırılarak KayıtNo adlı TextBox nesnesine yazılmaktadır. Yani formdaki KayıtNo adlı TextBox’a kayıt numarasını kullanıcı girmeyecek. Proje hazırlanıp çalıştırıldığında dosyada henüz kayıt olmadığından Kayıt No etiketinin karşısında bulunan TextBox’a 1 değeri yazılır (Şekil 7.e-5). Şekil 7.e-5 Program çalıştırıldıktan hemen sonra imlecin ilk sırada bulunan Textbox’ta durmasını veya söz konusu Textbox’a bilgi girişini engellemek için tasarım anında adı geçen Textbox seçili durumda iken Properties penceresinde Textbox’a ait TabStop özelliğine False değeri aktarılır (Şekil 7.e-6). Şekil 7.e-6 Programın çalışmasını sona erdirmeden önce Open deyimi ile açılan dosyanın kapatılması gerekir. Dosya kapatmak amacıyla kullanılan deyim. Close. Close deyimine parametre olarak kapatılmak istenen dosyanın proje içindeki adı yani numarası verilmelidir. Proje dahilinde çok sayıda dosya açılıp kullanılıyorsa ve o an için artık kullanılmayacak dosyalar varsa bu dosyaların kapatılması önerilir. Private Sub Çıkış_Click() 153 Close #1 End End Sub Bu proje başlatılır başlatılmaz Form_Load yordamına yazılan program satırları işletilerek kayıtların yazılacağı Adres.Dat dosyası açılır. Ardından dosyada o ana kadar girişi yapılan kayıtlar sayılır. Mevcut kayıt sayısına 1 eklenerek bulunan değer formdaki KayıtNo adlı TextBox’a yazılır. Bu işlemden sonra imleç bir sonraki TextBox’ta bilgi girişi için hazır bekler. Kullanıcı kayda ait bilgileri Form’daki diğer TextBox’lara girdikten sonra, girişini yaptığı bilgileri dosyaya yazmak için Kaydet düğmesinde tıklama yapılır. Kaydet düğmesinde tıklama yapıldığı zaman girişi yapılan bilgilerin dosyaya yazılabilmesi için Put deyimini de içeren program satırlarını hazırlayıp Kaydet nesnesine ait Kaydet_Click yordamına dahil edilmesi gerekir. Kaydet başlıklı düğmede tıklama yapıldığı zaman, metin kutularına girilen bilgileri kayıt tipindeki değişkene aktaracak satırların yazılması gerekir. “Alanlar” adını vermiş olunan kayıt tipindeki değişkenin adından sonra nokta işaretini yazınca, Visual Basic akıllı davranıp bu değişkenin elemanlarını ekrana listeler (Şekil 7.e-7). Şekil 7.e-7 Visual Basic tarafından otomatik olarak ekrana getirilen Kay ıt tipindeki değişkenin istenilen elemanı seçilebildiği gibi kendiniz de yazabilirsiniz. Kaydet dü ğmesinde tıklama yapıldığı zaman işletilecek ve metin kutularına yazılan bilgileri dosyaya yazacak program satırlarını aşağıda görülmektedir. Private Sub Kaydet_Click() Alanlar.Ad = Giriş.Ad Alanlar.Soyad = Giriş.Soyad Alanlar.Adres = Giriş.Adres Alanlar.Tel = Giriş.Tel Alanlar.Sehir = Giriş.Sehir Cevap = MsgBox (“ Bu kayıt dosyaya yazılsın mı?”,4) If Cevap = 6 Then Put #1, KayıtNo, Alanlar Giriş.Ad = "" Giriş.Soyad = "" Giriş.Adres = "" Giriş.Tel = "" Giriş.Sehir = "" Ad.SetFocus End If 154 End Sub Visual Basic projesinde kullanılan tek formun hard diske Giriş.Frm adıyla kaydedildiğini ve forma Giriş adının verildiğini biliyoruz. Ayrıca dosyaya yazılacak bilgileri temsil etmek üzere hazırlanan Global özellikli kayıt tipi değişkenin adını Alanlar olarak seçilmişti. Kaydet düğmesi ile hazırlanan program kodu Click olayına bağlandığı için Kaydet düğmesinde tıklama yapıldığı zaman dosyaya kaydetme işlemi yapılır. TextBox’lara girilen bilgileri dosyaya kaydedebilmek için özellikle TextBox nesnelerinin içeriklerini tek tek “Alanlar” adlı kayıt tipi değişkenin elemanlarına aktarmanız gerekir. Çünkü Put deyimine parametre olarak verilen bilgilerden biri kayıt tipi değişkendir. TextBox’lara girilen bilgiler aşağıda verilen program satırları ile kayıt tipi değişken elemanlarına aktarılmaktadır. Alanlar.Ad = Giriş.Ad Alanlar.Soyad = Giriş.Soyad Alanlar.Adres = Giriş.Adres Alanlar.Tel = Giriş.Tel Alanlar.Sehir = Giriş.Sehir Bu işlemden sonra Put deyimi ile kayıt bilgilerini dosyaya yazmadan çnce MsgBox fonksiyonu ile kullanıcıdan onay alınmaktadır. Burada kullanılan MsgBox fonksiyonuna dışarıdan iki parametre verilmektedir. Birincisi kayıt işlemi öncesi onay almak için ekrana getirilen diyalog kutusuna yazılan mesajdır. İkincisi ise MsgBox fonksiyonu ile ekrana getirilen diyalog kutusunda hangi düğmelerin bulunacağını belirten sayısal bir değerdir. Bilindiği gibi MsgBox fonksiyonuna 2. sırada parametre olarak verilen 4 sayısal değeri diyalog kutusunda Evet ve Hayır adında iki düğmenin yer almasına neden olmaktadır. Cevap = MsgBox( “Bu kayıt dosyaya yazılsın mı?”,4) Şekil 7.e-8 Kullanıcı Form üzerinde bulunan TextBox’lara istediği bilgilerin girişini yapıp Kaydet düğmesinde tıklama yaparsa, program işletimi içinde Msgbox fonksiyonunun bulunduğu satıra geçer ve MsgBox fonksiyonu Şekil 7.e-8’ deki görüntüsü verilen diyalog kutusunu ekrana getirir. MsgBox fonksiyonu tarafından ekrana getirilen diyalog kutusunda kullanıcı evet düğmesinde tıklama yapar veya evet düğmesi seçili durumda iken Enter tuşuna basarsa MsgBox fonksiyonu geriye 6 sayısal değerini, Hayır düğmesinde tıklama yapılırsa 7 sayısal değerini geriye döndürür. Geriye 155 döndürülen değer “Cevap” adlı değişkene aktarılmaktadır. MsgBox fonksiyonu ile ekrana getirilen diyalog kutusunda Evet düğmesinde tıklama yapılırsa aşağıda verilen program satırları işletilir. If Cevap= 6 Then Put#1, KayitNo, Alanlar KayitNo = KayitNo +1 Giriş.Ad = "" Giriş.Soyad = "" Giriş.Adres = "" Giriş.Tel = "" Giriş.Sehir = "" Ad.SetFocus End If Bu program satırından önce Put deyimi ile kayıt tipli Alanlar değişkenin içeriği hard diske yani dosyaya yazılmaktadır. Hard diske yazma işleminden sonra KayıtNo değişkenin içeriği 1 arttırılıyor. Daha sonra Formdaki TextBox’ların içeriklerine boşluk değerleri aktarılıyor. Kaydet düğmesinde tıklama yapılarak gerçekleştirilen kayıt işleminden sonra imlecin yerini belirlemek için SetFocus özelliğinden yararlanılır. Eğer kullanıcı MsgBox fonksiyonu tarafından ekrana getirilen diyalog kutsundaki “Bu kayıt dosyaya yazılsın mı?” sorusuna Hayır diye cevap vermiş olsaydı, bu kez MsgBox fonksiyonu geriye 7 sayısal değerini döndürür ve If ile End If işlem bloğu arasında kalan satırları işletmezdi. Bu durumda tekrar Forma dönülürdü. Kullanıcı formdaki TextBox’larda bulunan kayıt bilgilerini dosyaya yazmak istemiyorsa Vazgeç düğmesini seçebilir. Private Sub Vazgeç_Click() Cevap = MsgBox( “Girilecek başka kayıt var mı?”,4) If Cevap= 6 Then Giriş.Ad = "" Giriş.Soyad = "" Giriş.Adres = "" Giriş.Tel = "" Giriş.Sehir = "" Ad.SetFocus Else End End If End Sub 2. Dosyadan Kayıt Okumak Kayıt okumak amacıyla hazırlayacağımız projeyi hard diske OKUMA.VBP ve Projede kullanacağımız formu ise hard diske OKUMA.FRM adıyla kaydedelim. Proje çalıştırılır çalıştırılmaz kullanıcıdan okunmak istenen kaydın no’su istenecek. Okunup ekrana getirilecek kaydın no’su girildikten sonra kayıt dosyadan okunacak ve kaydın ayrıntıları Formda üzerine yerleştirilmiş olan TextBox’lara yazılacak. Proje dahilinde kullanılacak form bir önceki projede dosyaya kayıt yazmak amacıyla kullanılan forma oldukça benzemektedir (Şekil 7.e-9). 156 Şekil 7.e-9 Projenin OKUMA.FRM adıyla hard diske kaydettiğimiz formundaki ilk TextBox bilgi giriş amacıyla kullanılacak. Diğer metin kutuları yalnızca bilgi görüntülemek amacıyla kullanılacak. Bu amaçla ilk TextBox hariç bütün TexBox’ların TabStop özellikleri False duruma getirelim. Proje çalıştırılır çalıştırılmaz önce kullanıcıdan bilgileri ekrana getirilmek istenen kaydın numarası istenir. Bu sırada okunacak Kaydın Numarasının girileceği TextBox’a dosyada bulunan en son kaydın numarası gelir. Yani Kayıt No girilen metin kutusuna hazır olarak gelen kayıt numarasından daha büyük bir değerin giriş yapılamaz. Dosyanın açılması ve dosyada bulunan toplam kayıt sayısını bulmak amacıyla kullanılan program kodlarının proje başlatılır başlatılmaz işletilmesini sağlamak için “form” objesine ait Load olayına bağlantı kuralım. Bu amaçla hazırlanan program kodları aşağıda verilmiştir. Private Sub Form_Load() Open “Adres.dat” For Random As #1 Len = Len (Alanlar) KayıtNo = LOF (1) / Len (Alanlar) End Sub Hard diske OKUMA.FRM adıyla kaydedilen Form yüklenir yüklenmez otomatik olarak aktive edilen Form_Load yordamında bulunan iki satırlık program kodu ile Adres.dat dosyası açılamakta ve dosyada bulunan toplam kayıt sayısı bulunmaktadır. Proje başlatılır başlatılmaz imleç bilgi girişi amacıyla kullanılan TextBox olan KayıtNo adlı TextBox’a konumlanır. Bu sırada ayrıntılarını ekrana getirmek istediğiniz kaydın numarasını girebilirsiniz. Kayıt numarası girişinin tamamlandığını belirtmek üzere kullanıcının enter tuşuna basacağını öngörelim ve KayıtNo adlı TextBox için aşağıda verilen program kodlarını hazırlayalım. Private Sub KayıtNo_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Get #1, KayıtNo, Alanlar Okuma.Ad = Alanlar.Ad Okuma.Soyad = Alanlar.Soyad Okuma.Adres = Alanlar.Adres 157 Okuma.Tel = Alanlar.Tel Okuma.Sehir = Alanlar.Sehir End If End Sub Bu program satırında en son basılan tuş ASCII kodu 13 olan Enter ise, önce dosyadan GET deyimi ile kayıt numarası verilen kayıt okunmaktadır. Get deyimi ile yapılan kayıt okuma işleminden sonra kayda ait bütün bilgiler, Alanlar adlı Global ve Kayıt tipli değişkene aktarılmaktadır. Bu değişkenin içeriğini ekranda gösterebilmek için TextBox nesnelerine aktarma işlemi yapılır. Alanlar adlı Global ve kayıt tipli değişkeni tanımlayabilmek için bir önceki örnek projede olduğu gibi ayrı bir BAS uzantılı module dosyasına dahil edilir. Şekil 7.e-10 Proje çalıştırıldıktan sonra ekrana Formdaki ilk TextBox’a detayları ekrana getirilmek istenen kaydın numarası girilip enter tuşuna basılacak olunursa kaydın içeriği ekrana getirilir. Eğer dosyada olmayan kayıt numarası girilir entere basılırsa Visual Basic zil sesi ile uyarmakla yetinir. Bu sırada kullanıcı Çıkış adlı düğmede tıklama yapacak olursa dosya Close deyimi ile kapatılır. Ardından End deyimi ile projenin çalışması sona erdirir. Private Sub Çıkış_Click() Close #1 Unload.Okuma End Sub 158 3. Kayıt Düzeltmek Eğer kayıtta her hangi bir değişiklik yapılmışsa kaydın yeni şeklini tekrar hard diske yani dosyaya yazalım. Ancak değişen kaydı hard diske yazmadan önce kullanıcıdan onay alalım. Şekil 7.e-11 Kaydet düğmesi ile değişikliğe uğrayan kaydın tekrar dosyaya yazılması sağlanır. Vazgeç düğmesi ile ekrana getirilen kayıt dosyaya yazılmak istenmediği zaman kullanılacak Bir önceki konuda olduğu gibi proje başlatılır başlatılmaz daha önce verilen örnek projeler gibi kayıt girişi yapılan dosyayı Open deyimi ile açalım. Bu amaçla program kodu penceresinden Object liste kutusunda Form nesnesi ve Prog açılan nesne kutusunda Load olayı seçili durumda iken, dosyanın açılmasını sağlayacak program satırlarını yazalım. Bir önceki projede aynı amaçla kullanılan satırlardan farklı değildir. Private Sub Form_Load() Open “Adres.dat” For Random As #1 Len = Len (Alanlar) KayıtNo = LOF (1) / Len (Alanlar) End Sub Yine Adres.dat dosyası açıldıktan sonra Lof() fonksiyonu ile dosyanın byte olarak büyüklüğü ile Len() fonksiyonu ile bir kaydın uzunluğu bulunup birbirine bölünerek dosyadaki toplam kayıt sayısı hesaplanır. Program çalıştırılıp Form yüklendikten sonra kullanıcıdan ilk olarak düzeltilecek kaydın numarası istenir. Düzeltilecek kaydın numarasının yazıldığı TextBox’a varsayım olarak dosyada bulunan en büyük numaralı kaydın numarası gelir. Şekil 7.e-12 159 Basılan tuşun Enter olması halinde kaydı dosyadan okuyup ekrana getiriyorduk. Ayrıca anımsatmak gerekirse, klavyenin herhangi bir tuşuna basma işlemi sırasında meydana gelen olaya Visual Basic dahilinde Key Press adı verilir (Şekil 7.e-12). Bu program kodunun işletilmesi için imleç KayıtNo adlı metin kutusu nesnesinin içinde iken KeyPress olayının meydana gelmesi gerekir. Eğer KeyPress olayına neden olan en son basılan tuş Enter ise yordamda If ile End If deyimleri arasında kalan program satırları işletilir ve GET deyimi ile okunup Alanlar adlı kayıt tipli değişkene aktarılan bilgiler daha sonra Düzeltme adlı Formda bulunan aynı adlı TextBox’lara aktarılır. Kayıt düzeltmek amacıyla hazırlanan bu projede Tab tuşu ile TextBox’lar arasında hareket etmeyi engellemeye gerek yoktur. Tab tuşu ile bir seçenekten veya TextBox’tan ayrılma olayına LostFocus adı verilmektedir. Kullanıcı ekrana getirip düzeltmek istediği kaydın numarasını girmeden Tab tuşuna basarak KayıtNo_LostFocus veya Enter tuşuna basarak KayıtNo_KeyPress adlı yordamlardan birini aktive edecek olursa, okunacak kayıt belli olmadığı için bir hataya neden olunur. Meydana gelme olasılığı olan böyle bir hataya düşmemek için önlem alınmalıdır. Bunun için KayıtNo girilmeden Tab tuşuna basılarak Get deyimi ile yapılacak kayıt okuma işlemini engellemek için aşağıdaki gibi bir teknik kullanılmalıdır. Şekil 7.e-13 Bu program kodunda iki fonksiyon ve “And” mantıksal operatörü vardır. Bazı eksiklerinden dolayı yetersiz olan bu teknikle kullanıcı geçerli bir kayıt numarasını verip dosyadan okuma yapmadan programdan çıkamaz. Çünkü geçersiz kayıt numarası gerildikçe SetFocus özelliği ile imlecin sürekli olarak KayıtNo nesnesine girmesi sağlanmaktadır. Okunup ekrana getirilen kayıtta kullanıcı istediği değişikliği yapabilir. Yapılan değişikliklerden sonra kaydın yeni şeklini dosyaya tekrar yazmak için projenin Formuna Kaydet adlı bir düğme eklenir. Bu düğmede tıklama yapılınca Kaydet_Click yordamı işletileceğinden kaydın son halini yazmada kullanılacak Put deyimini bu yordama dahil edelim. Ancak ekrandaki kaydı dosyaya tekrar yazmadan önce, kayıtta değişiklik yapılıp yapılmadığı konusunda araştırma yapılmalıdır. . 160 Yukarıda ekran görüntüsü verilen program satırlarında yalnızca Ad ve Soyad’da değişiklik yapılıp yapılmadığı konusunda araştırma yapıldı. Or mantıksal operatörüyle kayıtta yapılan değişiklikle ilgili araştırmaya diğer TextBox’ların içeriklerini de dahil edebilirsiniz. Kayıtta değişiklik yapılmışsa kaydın yeni şeklini dosyaya yazmadan önce kullanıcıdan onay alınmaktadır. Bunun için iç içe iki IF-End IF işlem bloğu kullanılmıştır Kullanıcı ekrana getirdiği kayıtta değişiklik yapmasına rağmen kaydın yeni halini dosyaya yazmayıp vazgeçmesine veya başka bir kaydı ekrana getirebilmesine imkan sağlamak için Projenin formuna Vazgeç adında bir düğme eklenir. Bu düğmede tıklama yapılınca işletilecek Vazgeç_Click yordamı aşağıdadır (Şekil 7.e-15). Şekil 7.e-15 Vazgeç düğmesine basılırsa ortaya çıkan MsgBox() diyalog kutusunda “Evet” ve “Hayır” tuşları olmak üzere iki adet düğme vardır. Kullanıcı bu soruya Evet cevabını verecek olursa önce Formdaki TextBox’ların içerikleri temizlenir. Ardından dosyada bulunan kayıtların sayısı Lof() ve Len() fonksiyonları ile bulunup KayıtNo değişkenine aktarılır. Yöneltilen soruya Hayır cevabı verilmesi halinde End deyimi ile programın çalışması sona erdirilir. Formdaki çıkış düğmesi için yazılan program kodu bir önceki örnek projede verilenden farklı değildir. 161 4. Dosyalardan Kayıt Silmek Şekil 7.e-16 Bu form kayıt düzeltme işlemi için hazırlanan forma çok benzemektedir (Şekil 7.e-16). Diğer konularda olduğu gibi Form yüklenince, başka bir deyişle proje çalıştırılınca silinecek kaydı içeren dosya açılır ve dosyadaki kayıt sayısı bulunur. Private Sub Form_Load() Open “Adres.dat” For Random As #1 Len = Len (Alanlar) KayıtNo = LOF (1) / Len (Alanlar) End Sub Proje çalıştırılıp dosya açıldıktan sonra imleç formdaki ilk TextBox’ta kullanıcıdan okunup silinecek kaydın numarasını girmesini bekler. İstenen kayıt numarası girilip Enter veya Tab tuşuna basılırsa, ilgili kayıt dosyadan okunup ekrana getirilir. Kayıt numarası girilip Enter tuşuna basıldığında KayıtNo KeyPress olayı meydana gelir. KayıtNo_KeyPress yordamı bir önceki bölümde verilen aynı adlı yordamdan pek farklı değildir (Şekil 7.e-17). Şekil 7.e-17 Kayıt numarası girilen kayıt dosyada yoksa zil sesi ile uyarılır. Sil adlı düğmede tıklama yapılınca Visual Basic dahilinde Sil_Click adında bir yordamı arar. Kayıt silmek için gerekli program kodları Sil_Click yordamında yazılmıştır (Şekil 7.e-18). 162 Şekil 7.e-18 Sil Click yordamında kayıt silmek için daha doğrusu silinen kaydın dosyada yer kaplamasını önlemek için Adres.Tmp adında geçici bir dosya oluşturulur. Silinen kayıt hariç dosyadaki bütün kayıtlar bu dosyaya yazılır. Daha sonra bu geçici dosya asıl dosyanın üzerine kopyalanır. En son olarak geçici dosya KILL deyimi ile hard diskten silinir 5. Menü Hazırlamak Şimdi yukarıda sıra ile verilen GİRİŞ, OKUMA, DÜZELTME ve SİLME adlı projeleri bir araya getirelim. Bu örnek projeleri birer modül olarak değerlendirip bir menüde birleştirelim. Bunun için menü seçeneklerini içeren bir Form hazırlayıp, formu hard diske ANAFORM.FRM adıyla kaydedelim (Şekil 7.e-19). 163 Şekil 7.e-19 Daha sonra hard diske ANA.VBP adıyla kaydedilen projeye GİRİŞ.FRM, OKUMA.FRM, DÜZELTME.FRM ve SİLME.FRM adlı form dosyaları ve kayıt tipi değişken tanımlama satırlarını içeren GİRİŞ.BAS adlı Module dosyaları projeye Project menüsündeki Add File komutu ile dahil edilir. Kullanıcı formdaki Kayıt Girişi başlıklı ilk düğmede tıklama yapınca proje içindeki adı GİRİŞ olan form aktive olur. Bunun için menü görevi gören Ana formun KayıtGir_Click yordamı aşağıdaki şekilde düzeltilir. Private Sub KayıtGir_Click () GİRİŞ.Show End Sub ANA.VBP adlı projeye eklenen GİRİŞ formunda biraz değişiklik yaparak bu forma Menüye Dönüş başlıklı ve Dönüş adında bir düğme ekleyelim. Menüde Dönüş düğmesinde tıklama yapılınca tekrar projenin Ana adlı formu Show methodu ile aktif duruma getirmelidir. Private Sub Dönüş_Click () Close #1 AnaForm.Show End Sub Çalışma anında Kayıt Giriş yapılan formdaki Menüye Dönüş başlıklı düğmede tıklama yapılınca Ana adlı Form Aktif duruma getirilir. Bu sırada Giriş adlı formun bellekte olma özelliği devam eder. Üzerinde çalışılan projede çok sayıda form varsa bütün formları bellekte tutmak bellek yetersizliğine sorunlarına neden olabilir. Bu nedenle o sırada kullanılmayan formların UnLoad deyimi ile bellekten çıkarılmaları gerekir. 164 Private Sub Dönüş_Click () Close #1 UnLoad GİRİŞ :AnaForm.Show End Sub 7.f. Dosya ve Dizinler Üzerinde İşlem Yapmak Bu bölümde Visual Basic projeleri dahilinde dosya ve dizinler üzerinde işlem yaparken kullanılan bazı deyim ve fonksiyonlar hakkında bilgi verilecektir. Bu deyim ve fonksiyonlardan yararlanarak Visual Basic projeleri dahilinde dosya kopyalayabilir, silebilir veya klasör hazırlayabilirsiniz. 1. CurDir, ChDir, MkDir ve RmDir Deyim ve Fonksiyonları Bu deyim ve fonksiyonlar sayesinde çalışma anında geçerli klasör veya dizinin adını öğrenebilir, başka bir dizine geçebilir, istediğinizi silebilir veya yeni bir dizin hazırlayabilirsiniz. Bu 165 fonksiyonlarının işlevini anlatmak için önce yeni bir proje hazırlayalım ve bu projenin Form_Click yordamını aşağıdaki gibi düzenleyelim. Private Sub Form_Click() MsgBox CurDir End Sub Çalışma anında formun üzerinde tıklama yapılarak bu yordam işletilirse projenin çalıştırıldığı sırada geçerli olan sürücü ve dizinin adı MsgBox deyimi ile ekrana yazılır. Bu projeyi hazırladığım sırada C: sürücüsünün “\VB32” klasörü geçerli klasör durumundaydı. Şimdi yukarıda ekran görüntüsü verdiğim Form_Click yordamında ChDir deyimi ile geçerli sürücü ve dizini değiştirelim Form_Click yordamına eklediğimiz bu program satırı ile C: sürücüsünün kök (\) dizisinin geçerli dizin olmasını sağlayalım. Private Sub Form_Click() ChDir “C: \ ” MsgBox CurDir End Sub Bu değişiklikten sonra bu proje çalıştırılıp Form_Click yordamı işletilirse MsgBox deyimi bu kez aşağıdaki gibi bir mesajı ekrana getirir (Şekil 7.f-1). Şekil 7.f-1 CurDir fonksiyonu projenin çalıştırıldığı sırada geçerli olan sürücü ve dizinin adını belirler. CurDir fonksiyonu parametre verilmeden deyim gibi kullanıldığı zaman geçerli sürücüdeki dizin hakkında bilgi vermektedir. Diğer taraftan ChDrive fonksiyonu kullanılarak geçerli sürücüyü değiştirebilirsiniz. Private Sub Form_Click() ChDrive “D” ChDir “D: \Program Files ” MsgBox CurDir End Sub Şimdi ise MkDir deyimi ile çalışma anında “D:” sürücüsünde kök dizisinin altında bir dizin hazırlayalım. Bu amaçla Form_Click yordamını aşağıdaki gibi değiştirelim. 166 Private Sub Form_Click() ChDrive “D” ChDir “D: \ ” MkDir “Örnejkler” ChDir “D:\ Örnekler” MsgBox CurDir End Sub İçeriği boş olan dizinleri silmek için RmDir deyiminden yararlanabilirsiniz. Private Sub Form_Click() ChDrive “D” ChDir “D: \ ” RmDir “Örnekler” End Sub 2. FileCopy Deyimi Bu deyimle bir sürücüden başka bir sürücüye, bir klasörden başka bir klasöre dosya kopyalayabilir veya aynı klasör içinde dosyanın adını değiştirerek başka bir kopyasını hazırlayabilirsiniz. Private Sub Kopyala_Click() FileCopy “C:\VB5Book \Ic.Doc”, “A:\Ic.Doc” End Sub 3. Kill Deyimi – Dosya Silmek Bilgisayarın herhangi bir sürücü ve dizinindeki bir veya birden fazla dosyayı bir seferde silmek istiyorsanız Kill deyiminden yararlanabilirsiniz. Private Sub Sil_Click() Kill “A:\Ic.Doc” End Sub 167 4. Name Deyimi – Dosya Adı Değiştirmek İstediğiniz dosyanın veya dizinin adını değiştirebilirsiniz. Private Sub Değiştir_Click() Name Text1.Text As Text2.Text End Sub 5. FileLen ve FileDateTime Fonksiyonları Diskte bulunan bir dosyanın byte olarak büyüklüğünü öğrenmek istiyorsanız FileLen fonksiyonundan yararlanabilirsiniz. Bu fonksiyon dışardan parametre olarak büyüklüğü öğrenilmek istenen dosyanın adını almaktadır. Dosya geçerli sürücü ve dizinde değilse, dosyanın yer aldığı dizini dosya adına ekleyebilirsiniz. Private Sub Büyüklük_Click() Text2.Text = FileLen(Text1.Text) End Sub FileDateTime fonksiyonu sayesinde istediğiniz istenen dosyanın zaman bilgisini öğrenebilirsiniz. Bu fonksiyona parametre olarak zaman bilgisi veya en son değiştirildiği tarihi öğrenilmek istenen dosyanın adı verilir. Private Sub Form_Click() Dosya = FileDateTime(“C:\WINDOWS\Win.Com”) MsgBox (Dosya) End Sub 6. GetAttr Dosyaların Özniteliklerini Öğrenmek GetAttr fonksiyonu ile çalışma anında istediğiniz dosyanın özniteliklerini öğrenebilirisiniz. GetAttr fonksiyonu dışarıdan parametre olarak özniteliği öğrenilmek istenen dosyanın adını almaktadır. Eğer GetAttr fonksiyonu kendisine parametre olarak verilen dosyanın özniteliği normal ise geriye 1 sayısal değerini döndürür. Geriye Döndürülen Değer Dosyanın Özniteliği 0 Normal 1 Read only (Yalnız Okunur) 2 Hidden (Gizli Dosya) 4 System (Sistem Dosyası) 16 Directoy (Dizin) 7. SetAttr Dosyaların Özniteliklerini Değiştirmek 168 Diğer yandan çalışma anında SetAttr fonksiyon ile istediğiniz dosyanın özniteliğinde değişiklik yapabilirsiniz. Eğer SetAttr deyimine ikinci parametre olarak 7 değerini verirseniz dosyaya Hidden, ReadOny ve System özelliklerini bir seferde verilir. Private Sub System_Click() SetAttr, 7 End Sub 8. Dir Fonksiyonu Bu fonksiyon DOS’un DIR komutu ile benzer işleve sahiptir. Bu fonksiyon sayesinde istediğiniz klasördeki istediğiniz özelliklere sahip dosyaları bir formun üzerine yazabilir veya liste kutusu nesnesine listeleyebilirsiniz. Private Sub Form_Click() Dosya = Dir (“*.*”) End Sub C:\ sürücüsündeki Windows klasöründeki EXE uzantılı dosyaların listelenmesi Private Sub Form_Click() Dosya = Dir (“C:\WINDOWS\ *.EXE”) End Sub 8.a. Formlar ve Özellikleri Visual Basic başlatıldığı zaman hazırlanan ve varsayılan adı Project1 olan projeye otomatik olarak eklenen Form1 adındaki formu biraz yakından izleyelim. Daha konulardan bildiğiniz gibi projeye dahil edilen her form tasarım anında Visual Basic penceresi içinde ayrı bir pencerenin içine alınmaktadır (Şekil 8.a-1). Şekil 8.a-1 169 Bütün pencerelerde olduğu gibi bir formu çevreleyen pencerenin başlık çubuğu vardır. Başlık çubuğundan başka form nesnesini sınırlayan pencerenin sağ üst köşesinde Ekranı kapla, Simge Durumuna Küçült ve Kapat düğmeleri bulunmaktadır. Üzerinde tire işareti olan düğmede tıklama yapıldığı zaman formu içeren pencere form ile birlikte simge durumuna küçülmektedir. Şekil 8.a-2 Denetim Menüsü Eğer üzerinde çalıştığınız projede çok sayıda form varsa bazı formları simge durumuna küçültmek isteyebilirsiniz. Form nesnesini çevreleyen pencerenin sol üst köşesinde Denetim Düğmesi bulunmaktadır. Bu düğmede tıklama yaparsanız Denetim Menüsü açılır. Form nesnesini çevreleyen pencerenin denetim menüsünde, pencereyi simge durumuna küçültmede kullanılan Simge Durumuna Küçült ve Visual Basic penceresini kaplamasını sağlayan Ekranı Kapla gibi komutlar bulunmaktadır. Formu içeren pencerenin denetim menüsündeki Close komutu ile form kapatılır. Formu içeren pencereyi kapattıktan sonra, form üzerinde işlem yapmaya gerek duymanız halinde Project Explorer penceresinden veya View menüsündeki Object komutundan yararlanabilirsiniz. Formlarla ilgili olarak anlatılacak olanları 3 gruba ayırmak gerekir. Bunlardan birincisi ve syıca en kalabalık olanı formun özelliklerini belirlemede kullanılan Properties’lerdir. Formların birçok özelliğinin Properties penceresinden yararlanarak belirlendiğini biliyorsunuz. Formlarla ilgili olarak 2. sırada anlatılması gerekenler ise formlara uygulanan Olaylar yani Event’lardır. Formun yüklenmesi (Load) ve formun üzerinde fare ile tıklama yapılması (Click) akla gelecek Event’lardır. Formla ilgili olarak 3. sırada anlatılması gerekenler, formlara uygulanan methodlardır. Örneğin formun üzerine Print methodu ile sabit bir bilgi veya bir değişkenin içeriğini yazmak, formlara uygulanan işlemlere örnek olarak verilebilir. 1. Properties Formlar Visual Basic projelerinin en önemli nesneleridir. Bütün nesnelerde olduğu gibi formların boyutlar, aktif olduğu sırada ekrandaki yeri, rengi, kenar çizgileri başlığı gibi özellikleri söz konusudur. Üzerinde çalıştığınız projeye yeni bir form eklediğinizde veya daha önce hazırlanıp hard diske kaydedilmiş bir formu projeye dahil ettiğinizde formun her özelliği için ayrı bir değişken Visual Basic tarafından otomatik olarak tanımlanır. Çalışma veya tasarım anında söz konusu form kapatıldığında ise bu forma ait bütün değişkenler bellekten silinir. Forma ait olan ve formun hazırlanıp projeye dahil edilmesi ile birlikte otomatik olarak tanımlanan değişkenlerden, kitabın bazı sayfalarında Sistem Değişkenleri diye söz edildi. Forma ait veya form hakkında bilgi içeren değişkenlere Visual Basic dahilinde Properties veya Özellik denilmektedir. Bu değişkenlerinin çoğunun içeriklerini tasarım anında View menüsündeki Properties Window (F-4) komutu ile ekrana getirilen Properties penceresinde değiştirebilirsiniz (Şekil 8.a-3). Buna göre tasarım anında formların bir çok özelliği Properties penceresinden ayarlanabilmektedir. 170 Şekil 8.a-3 Formların bazı özellikleri var ki bunları ancak çalışma anında değiştirmek mümkün ve anlamlı olmaktadır. Örneğin Print gibi çıkış deyimleri ile Formlara bilgi yazmadan önce yazma işleminin başlayacağı yeri belirlemeye yarayan CurrentX ve CuurentY gibi değişkenlerin içeriğini tasarım anında Properties penceresinde değiştirmek anlamlı değildir. Şekil 8.a-4 Projelerde birden fazla form bulunabileceğinden Properties penceresinde sıralanan özelliklerin hangi forma ait olduğunu Properties penceresinin başlık satırından sonraki ilk satırına bakarak tespit edebilirsiniz. Visual Basic, adı gibi Görsel bir uygulama geliştirme aracı olduğu için Formların bir çok özelliği için Properties penceresine başvurmaya gerek kalmadan fare ile ekranda çizim yapar gibi işlem yapabilirsiniz. Örneğin formun boyutlarını fare ile belirliyebilirsiniz. Yine Formların bazı özellikleri var ki çalışma anında bunlarda değişiklik yapmak mümkün değildir. Formların bu özelliklerine ancak tasarım anında müdahale edilebilir. Çalışma anında formların özelliklerinde değişiklik yapmak, normal bir değişkene bilgi aktarmaktan farklı değildir. 171 Daha önceki konulardan hatırlayacağınız gibi program kodu yazarak nesnelerin özelliklerinde değişiklik yapmadan önce nesnenin (Form) adı ve ardından nesnenin değişiklik yapılmak istenen özelliğinin adı yazılır. En son olarak aktarma operatörü (=) ile değişkene bilgi aktarma işlemi yapılır. Örneğin formların başlık bilgileri Caption değişkeninde veya Caption özelliğinde saklanmaktadır. Çalışma anında Formun başlığında değişiklik yapmak istiyorsanız Caption adlı Form değişkeninin içeriğini aşağıdaki gibi değiştirebilirsiniz. Private Sub Form_Click() Form1.Caption = “Visual Basic” End Sub 2. Formlara Simge Durumuna Küçültme Özelliği Vermek Visual Basic dahilinde yeni hazırlanan formlarda varsayım olarak simge durumuna küçültme özelliği bulunmaktadır. Ancak bazı durumlarda kullanılan formların simge durumuna küçülebilir olması istenmez. Visual Basic projesi dahilinde hazırladığınız formun simge durumuna küçülebilme özelliğinin olmasını istemiyorsanız Properties penceresinde Forma ait MinButton özelliğine False değerini aktarmanız gerekir (Şekil 8.a-6). Şekil 8.a-5 Visual Basic projeleri dahilinde açılan Windows uyumlu pencerelerde varsayım olarak Simge durumuna Küçült düğmesinden başka bir de pencerenin bütün ekranı kaplamasını sağlayan Ekranı Kapla düğmesi bulunur. Eğer pencerede ekranı kapla özelliğinin olmasını istemiyorsanız MaxButton özelliğine False değerini aktarmanız gerekir (Şekil 8.a-6) 172 Şekil 8.a-6 3. Formlara Ekranı Kaplama Özelliği Vermek Visual Basic projeleri dahilinde Windows uyumlu pencerelerde varsayım olarak Simge Durumuna Küçült düğmesinden başka bir de pencerenin ekranı kaplamasını sağlayan Ekranı Kapla düğmesi bulunur (Şekil 8.a-5). Eğer pencerede ekranı kaplama özelliğinin olmasını istemiyorsanız Properties penceresinde MaxButton özelliğine False değerini aktarmalısınız.(Şekil 8.a-7). Şekil 8.a-7 4. Denetim Düğmesi ve Menüsü Bütün Windows uyumlu pencerelerde olduğu gibi Visual Basic projeleri dahilinde hazırlanan Form veya pencerelerde varsayım olarak Denetim düğmesi bulunmaktadır. Denetim düğmesinde tıklama yaparsanız denetim menüsü açılır. Denetim Menüsünü açmak için Alt tuşundan yararlanabilirsiniz. Alt tuşuna basarsanız denetim düğmesi seçili duruma gelir. Denetim düğmesi seçili durumda iken aşağı ok veya enter tuşuna basılırsa formun veya pencerenin denetim menüsü açılır. Şekil 8.a-8 Denetim Menüsündeki komutlarla pencerenin (Form) simge durumuna küçültmesi, ekranı kaplaması ve kapatılması gibi işlemler yapılabilir. Eğer pencerenin simge durumuna küçülebilme özelliği yoksa, Denetim menüsünde Simge Durumuna Küçült komutu bulunmaz 173 Şekil 8.a-9 Formlarda denetim düğmesinin ve dolayısıyla denetim menüsünün bulunmasını istemiyorsanız Properties penceresinde ControlBox özelliğine false değerini aktarmanız yeterlidir (Şekil 8.a-9). ControlBox özelliği False yapılan Formda, çalışma anında MaxButton ve Minbutton özelliklerinin içeriklerine bakılmaksızın Ekranı Kapla, Simge durumuna Küçült ve Kapat düğmeleri formun sağ üst köşesinden kaldırılır. 5. Çalışma Anında Formun Boyutlarını Fare İle Değiştirmek Çalışma anında fare ile veya program kodu yazarak formların boyutlarını istediğiniz gibi değiştirebilirsiniz. Eğer Visual Basic uygulamaları dahilinde hazırladığınız form veya pencerelerin boyutlarında projenin çalışması sırasında değişiklik yapılmasını engellemek istiyorsanız, formu hazırlarken Properties penceresinde forma ait BorderStyle özelliğinde değişiklik yapmalısınız. Forma ait Border Sytle özelliği 2-Sizable değerini içeriyorken çalışma anında formun boyutlarını fare ile değiştirebilirsiniz. 174 Şekil 8.a-10 Eğer çalışma anında formun sınırlarını çizgi ile belirlemek istemiyorsanız BorderStyle özelliğine 0-None değerini aktarmalısınız. BorderStyle özelliğine 0-None değeri aktarılan pencere veya form ekrana getirildiği zaman pencerede başlık bilgisi hem de düğmeler kaybolur (Şekil 8.a-11). Şekil 8.a-11 BorderStyle özelliğine 3-Fixed Dialog değerini aktaracak olursanız forma ait Maxbutton ve MinButton özelliğinin True veya False olup olmadığına bakılmaksızın simge durumuna küçült ve ekranı kapla düğmeleri pencerenin sağ üst köşesinden kaldırılır. Formun BorderStyle özelliğine 4-Fixed ToolWindow değerini aktarırsanız çalışma anında Formun ControlBox özelliğine bakılmaksızın denetim düğmesi kapatılır. 6. Form Başlığı ve Form Adı 175 Formun başlık bilgisini değiştirmek için Properties penceresinde Caption özelliğinden yararlanılır. Properties penceresinde forma verilen başlık bilgisi eş zamanlı olarak formun başlığına yazılır (Şekil 8.a-12). Şekil 8.a-12 Çalışma anında formların başlıklarında değişiklik yapabilirsiniz. Private Sub Form_Click() Caption =” Tutanak” End Sub Ancak üzerinde çalışılan prpjede çok sayıda form varsa hangi formun başlığında değişiklik yapılacağı belirtilmelidir. Gerçekte bir Object (nesne) olan formların özelliklerinde değişiklik yaparken önce nesnenin ve ardından özellik adının yazıldığını biliyorsunuz. Nesne adı ile özellik adını birbirinden ayırmak için aralarına nokta (.) konur. Private Sub Form_Click() Form1.Caption =”Tutanak” End Sub Formların başlıklarından başka bir de proje içinde geçerli olmak üzere adı vardır. Form ile ilgili olarak yapılan her işlemde sürekli olarak o formun proje içindeki adına başvurulur. Yukarıda verilen program kodundaki “Form1” aslında formun adıdır. Projeye eklenmiş olan formlara ad vermek veya verilen adlarda değişiklik yapmak için Properties penceresinde Name özelliğinden yararlanılır (Şekil 8.a-12). 176 Formlara ad verirken Formun adı ile Formun kullanım amacı arasında benzerlik olması önerilir. Formun adı ile işlevi arasında benzerlik olması halinde program kodlarını incelemek ve anlamak daha kolay olur. Çalışma anında program kodu yazarak Formların Name özelliklerini değiştiremezsiniz. 7. Formun Boyutlarını Belirlemek Yukarıdaki sayfalarda formun boyutlarını çalışma anında ve tasarım anında Fare ile veya Denetim menüsündeki Boyut komutu ile değiştirilebileceği belirtilmişti. Çalışma ve tasarım anında form veya pencerenin güncel boyutları Visual basic tarafından otomatik olarak tanımlanan Width ve Height değişkenlerinde tutulmaktadır. Yine hatırlatmak gerekirse Visual Basic’te varsayım olarak Twip birimi kullanılmaktadır. Şekil 8.a-13 Width Değişkeni Tasarım anında fare ile formun boyutlarında yapılan değişikliklerden Width ve Height değişkenleri anında etkilenir. Programcı isterse formun boyutlarını fare ile belirlemek yerine doğrudan Properties penceresinde Twip cinsinden Width ve Height değişkenlerin içeriklerinde değişiklik yapabilir. Şekil 8.a-14 Height Değişkeni 177 Formların boyutlarını çalışma anında program kodu yazarak Width ve Height değişkenleri yardımıyla değiştirebilirsiniz. Private Sub Form_Click() Form1. Width = Form1.Width - Form1.Height = Form1.Height - 250 250 End Sub 8. Formun Masaüstündeki Yerini Belirlemek Formun ekrandaki konumu Left ve Top özellikleri ile belirlenir. Başlangıçta yani proje çalıştırıldığı zaman forma ait Left ve Top özellikleri 0 değerini içerdikleri için projenin başlangıç formu ekranın sol üst köşesine yerleşir. Formun masaüstündeki konumunu tasarım anında Properties penceresinden yararlanarak belirlemek yerine program kodu yazarak Left ve Top değişkenlerinin içeriklerinde değişiklik yapabilirsiniz (Şekil 8.a-15 ve Şekil 8.a-16). Şekil 8.a-15 Şekil 8.a-16 Formun masaüstündeki konumunu tasarım anında Properties penceresinden yararlanarak belirlemek yerine program kodu yazarak Left ve Top değişkenlerinin içeriklerinde değişiklik yapabilirsiniz. Private Sub Form_Click() 178 Form1. Left Form1.Top = = Form1.Left Form1.Top + + 250 250 End Sub Diğer taraftan StartUpPosition özelliğinden yararlanarak form açılıp ekrana ilk getirildiği zaman masaüstündeki yerini belirleyebilirsiniz. Bu özelliğe CenterScreen değerini aktarmanız halinde form ekrana ilk getirildiği zaman form ekranın ortasına yerleştirilir (Şekil 8.a-17). Şekil 8.a-17 9. Formlar İçin Font Seçimi Form dahilinde yapılacak yazma ve çizme işlemlerinde geçerli olacak Font ve Punto değeri Visual Basic tarafından otomatik olarak hazırlanan değişkenlerde saklanmaktadır. Üzerinde çalışılan projeye yeni bir form eklendiği zaman Formda 8 punto büyüklüğünde Ms Sans Serif fontunun kullanılacağı varsayılır. Form dahilinde geçerli olacak fontun adı ve Punto değeri Font adlı form değişkeninde saklanmaktadır (Şekil 8.a-18). Şekil 8.a-18 179 Properties penceresinde Font seçeneğinin sonuna konulan ve üzerinde 3 nokta olan düğmede tıklama yaparsanız ekrana bir diyalog kutusu içinde ona kadar sisteme yüklenmiş olan fontlar listelenir (Şekil 8.a-19). Şekil 8.a-19 Bilgisayara kurulu olan fontlardan istediğinizi seçip kullanabilirsiniz. Ancak Türkçe karakter desteği olmayan fontları kullanmanız halinde Türkçe’ye özgü harfleri ekrana yazarken bazı sorunlarla karşılaşabilirsiniz. Diğer yandan program kodu yazarak çalışma anında istediğiniz şekilde Font ve punto değişikliği yapabilirsiniz. FontName özelliğinden yararlanarak seçtiğiniz fonta koyu özelliği vermek istiyorsanız FontBond değişkenine True değerini aktarmanız gerekir. Benzer şekilde yazıların italik olmasını istiyorsanız ve altı çizili olmasını istiyorsanız FontUnderline adlı Form değişkenlerine True değerini aktarmalısınız. FontStrikeThru değişkenin içeriği True iken yazıların üstü çizilir. Private Sub Form_Click() CurrentX = 700 : CurrentY = 700 FontSize = 20 FontName = “Ariel” FontBond = True FontItalic = True Print “ Hasan DURGUT” End Sub Diğer yandan kullanılacak fontların programın yazımı sırasında programcı tarafından belirlenmesi pratik değildir. Çünkü programın yazımı sırasında kullanılan bilgisayara yüklü olan bilgisayara yüklü olan fontlar, yazılan programın çalıştırılacağı bilgisayara yüklü olan fontlar farklı olabilir. 180 10. Forma Resim Dosyası Yüklemek Varsayım olarak başlangıçta formun zemini boş durumdadır. Eğer form içinde tasarım veya çalışma anında hazır bir resim dosyasını kullanmak istiyorsanız forma ait Picture değişkeninden yararlanabilirsiniz. Formların üzerinde değişik tip ve formatta (Bitmap, Icon, Metafile) dosyalar kullanılabilir. Formun zemin rengini BackColor adlı form değişkeni ile değiştirebilirsiniz. Şekil 8.a-20 Çalışma anında forma ikon ve bir resim dosyası eklemek için LoadPicture fonksiyonundan yararlanılır. LoadPicture fonksiyonu ile hard disken okunan resim veya ikon dosyası forma ait Picture değişkenine aktarılır. Private Sub Form_Load() Form1. Picture End = LoadPicture(C:\VB5\Graphic\Resim.Bmp Sub Forma dahil edilecek resim dosyası, programın işletimi sırasında yani çalışma anında belirlenebilir. Bu amaçla çalışma anında Forma dahil edilecek resim dosyasının adı kullanıcıdan istenir. Kullanıcının seçtiği dosyanın adı bir değişkene aktarılır. Private Sub Form_Load() Resim = InputBox ( “Forma dahil edilecek resim dosyası”) Form1. Picture End = LoadPicture(Resim) Sub 11. Zemin Rengi Seçimi Formlarda zemin rengi varsayım olarak gridir. Eğer zemin rengi olarak griden farklı bir rengi kullanmak istiyorsanız BackColor özelliğinden yararlanmanız gerekir (Şekil 8.a-21) 181 Şekil 8.a-21 Properties penceresinde ışıklı bantı BackColor değişkenin üzerinde götürecek olursanız geçerli renk adının yazıldığı metin liste kutusu özelliğini kazanır. Bu liste kutusunu açarak daha önce Denetim Masası uygulamasından yararlanarak menüler, masaüstü ve pencere başlıkları için seçilen renklerden birini seçebilirsiniz. Formların zemin renklerini tasarım anında olduğu gibi çalışma anında program kodu yazarak değiştirebilirsiniz. Yapmanız gereken, zeminde kullanmak istediğiniz rengin kodunu formun BackColor değişkenine aktarmaktan ibarettir. Private Sub Form_Load() Form1. BackColor End = &H8OFF80 Sub Kullanılacak renklerin sayısı bilgisayarın grafik özelliklerine bağlı olarak değişmekle birlikte Visual Basic 16 milyon rengi desteklemektedir. Zamana bağlı olarak BackColor değişkenin içeriğini değiştirmek için Form dahilinde renk geçişleri yapılabilir. Çalışma anında renk seçimi için RGB() fonksiyonundan yararlanabilirsiniz. RGB() fonksiyonu dışarıdan 3 parametre almaktadır. Bu parametreler sırası ile Kırmızı, Yeşil ve Mavi renkleri temsil eden sayısal kodlardır. Bu 3 parametre 0 ile 255 arasında değişen değeler alabilmektedir. Eğer BackColor değişkenine aktarılmak üzere RGB() fonksiyonuna 255,0,0 değerleri verilirse, zemin rengi tam kırmızı olur. Çünkü kırmızı renk için en yüksek değer verilirken, yeşil ve mavi renk için en düşük değer verilmiş durumdadır. Eğer renk elde etmek amacıyla kullanılan RGB() fonksiyonu RGB(0,0,255) şeklinde kullanılırsa bu kez zemin rengi tam mavi olurdu. Her üç parametrede 100 olarak seçilmiş olunsaydı RGB() fonksiyonu ile kırmızı, mavi ve yeşil renklerin aynı oarnda birbirine karıştırılmış bir renk elde edilirdi. Form_Load fonksiyonu dahilinde kullanılan “BackColor= &H80FF80” satırında “&H” karakterleri renk kodlarını belirlemek üzere kullanılan sayıların 16 tabanlı olduğunu belirtmektedir. Yazılıştaki 182 “80” rakamı kırmızı renk oranını belirtirken , “FF” yeşil ve ikinci 80 ise mavi renk oranını belirtmektedir. 12. Formun Başlangıç Durumunu Seçmek Şimdiye kadar verilen örneklerde Visual Basic projesine dahil edilen bir form yüklendiği zaman, tasarlandığı şekli ile ekrana geliyordu. Formun Simge Durumuna Küçültme ve Ekranı kaplama özellikleri pasif durumda getirilmediyse daha sonra kullanıcı Formun ekranı kaplamasını veya simge durumuna küçültmesini sağlayabiliyordu. WindowState adlı form özelliği ile yüklenen bir formun başlangıç durumunu seçebilirsiniz. Şekil 8.a-22 WindowState değişkeni varsayım olarak 0-Normal değerine sahiptir. Eğer formun yüklenir yüklenmez ekranı kaplamasını veya hemen simge durumuna geçmesini istiyorsanız WindowState değişkeninin içerisinde değişiklik yapmalısınız. Form ekrana getirilir getirilmez simge durumuna geçmesini istiyorsanız WindowsState özelliğine 1-Minimized, ekranı kaplamasını istiyorsanız 2Maximized değerini aktarmanız gerekir. Formun ekrandaki durumunu program kodu yazarak çalışma anında değiştirebilirsiniz. Private Sub Form_Click() Form1. WindowState = 2-Maximized End Sub 13. Formlar İçin İkon Seçmek Eğer çalışma anında Visual Basic dahilinde ekrana getirilen formun görev çubuğunda varsayılan ikondan farklı bir ikon ile temsil edilmesini istiyorsanız formlara ait Icon değişkeninden yararlanabilirsiniz. 183 Şekil 8.a-23 Visual Basic dahilinde hazırlanan projede çok sayıda Form varsa her form için farklı ve formun kullanış amacını anımsatan ikonlar kullanılabilir. Tasarım anında Properties penceresinde Icon değişkenin üzerinde çift tıklama yapılırsa Visual Basic ile birlikte verilen ikonlar Load Icon diyalog kutusu içinde listelenir. Başlangıçta Visual Basic projeleri dahilinde açılan her form için Görev Çubuğunda bir düğme hazırlanmaktadır. Eğer bu özelliği kapatmak ShowInTaskbar özelliğine False değerini aktarmanız yeterlidir. Şekil 8.a-24 14. Ölçekleme Birimini Seçmek Visual Basic’te nesne veya formlarda varsayım olarak Twip ölçü birimi kullanılmaktadır. 1 inç yaklaşık olarak 1440 Twip’e karşılık gelmektedir. Visual Basic dahilinde Twip’ten farklı ölçü birimlerini kullanma imkanı kısıtlı da olsa vardır. Width ve Height ile formun genişliğini ve yüksekliğini belirlerken, Left ve Top özellikleri ile Formun ekrandaki konumu belirlenmektedir. Width, Height, Top ve Left için ölçü birimi mutlaka Twip olmak zorundadır. 184 Şekil 8.a-25 Formun boyutlarını ve ekrandaki yerini belirleme dışında, Form dahilinde kullanılmak üzere yeni bir ölçü birimi kullanılabilir. Form dahilinde geçerli olmak üzere ölçü birimini değiştirmek için ScaleMode değişkeninden yararlanılır (Şekil 8.a-25). Form dahilinde kullanılabilecek ölçü birimi çalışma anında da değiştirilebilir. Bunun için ScaleMode değişkenine kullanılmak istenen ölçü biriminin adını aktarmak yeterlidir. Private Sub Form_Load() Show FontSize = 20 FontName = “Arial” ScaleMode = 6-Milimeter CurrentY = 10 CurrentX = 10 Print “Deneme yazısı” End Sub ScaleLeft ve ScaleTop değişkenleri mevcut koordinat sistemini yeniden tanımlamaya yararlar. Başlangıçta form penceresinin sol üst köşesinin koordinatının (0,0) olduğunu biliyorsunuz. Form penceresinin sağ alt köşesinin koordinatı ise (Width, Height) değişkenlerinin içeriklerine veya formun boyutlarına göre değişmektedir. ScaleLeft ve ScaleTop değişkenlerine Negatif değerinin aktarılması işlemin yapıldığı program kodu çalıştırılınca formun bilgi yazılacak yerini aşağıya ve sağa doğru çekmektedir. ScaleLeft ve ScaleTop değişkenlerine aktarılan Pozitif değerler ise formun bilgi yazılacak yerini yukarıya ve sola doğru çekmektedir. 15. Farenin Şeklini Değiştirmek Windows uyumlu programlarda fare işareti bulunduğu ortama göre yapılabilecek işlemleri işaret etmek üzere şekil değişikliğine uğramaktadır. Benzer etkiyi Visual Basic programların dahilinde vermek mümkündür. Bu amaçla MousePointer adlı Form değişkeninden yararlanılır (Şekil 8.a-26). 185 Şekil 8.a-26 MousePointer değişkenine aktarılabilecek ve fare işaretini temsil eden 13 adet sabit değer vardır. 0 numaralı olan ilki fare işareti görünümünü temsil eder. Fare işaretlerini ve bunları temsil eden sayısal değerler aşağıda gösterilmiştir. İçerik Değer Tanımlama vbDefault 0 Default Vbarrow 1 Arrow VbCrosshair 2 Cross VbIbeam 3 I beam. VbIconPointer 4 Icon VbSizePointer 5 Size VbSizeNESW 6 Size NE SW VbSizeNS 7 Size N S VbSizeNWSE 8 Size NW SE VbSizeWE 9 Size W E VbUpArrow 10 Up Arrow. VbHourglass 11 Hourglass VbNoDrop 12 No Drop. VbArrowHourglass 13 Arrow and hourglass. vbArrowQuestion 14 Arrow and question mark VbSizeAll 15 Size all. VbCustom 99 Custom icon specified by the MouseIcon property. 186 Fare işaretini projenin çalışması sırasında alacağı görünümü tasarım veya çalışma anında değiştirmek için MousePointer değişkenine simgeyi temsil eden sayısal değer aktarılır. Private Sub Form_Click () Dim I Screen.MousePointer = vbHourglass ‘11 For I = 0 To ScaleWidth Step 50 ForeColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255) Circle (I, ScaleHeight * Rnd), 400 Next End Sub Fare işareti olarak hard diskte bulunan ICO uzantılı dosyalardan birini kullanmak istiyorsanız önce MousePointer özelliğine 99 değerini aktarmanız gerekir. MousePointer özelliğine 99 değerini aktardıktan sonra MouseIcon özelliğinden yararlanarak ICO dosyası seçimi yapmalısınız (Şekil 8.a27) Şekil 8.a-27 16. Formları Kullanılamaz Duruma Getirmek Özellikle çok sayıda form içeren projelerde bazı durumlarda formlardan birinin kullanılamaz duruma getirilmesi istenebilir. Bu formu kullanılamaz duruma getirmek için Enabled özelliğinden yararlanılır (Şekil 8.a-28). 187 Şekil 8.a-28 Bu değişkenin içeriği True ise söz konusu Form üzerinde izin verilen her türlü işlem yapılabilir. Enabled değişkeninin içeriği False olduğu sürece Form üzerinde herhangi bir işlem yapılamaz. Form kapatılamaz ve simge durumuna küçültülemez. Private Sub Command_Click() Form1. Enabled End = False Sub 17. Çizgi Kalınlığını Seçmek Formun üzerine Line fonksiyonu ile çizgi çizerken veya Circle ile daire çizerken geçerli olmak üzere çizgi kalınlığını tasarım veya çalışma anında değiştirebilirsiniz. Bu amaçla DrawWidth adlı form değişkeninden yararlanılır. Şekil 8.a-29 DrawWidth değişkeni başlangıçta 1 değerine sahiptir. Bu değişkenin işlevini göstermek için Form1 adında bir tek form içeren örnek proje aşağıda gösterilmiştir. Private Sub Command1_Click() For S =1 To 30 Step 188 2 DrawWidth = S Line (S * 200, 300)-(S * 200,1500) Next S End Sub Çalışma anında Form_Click yordamını işletmek üzere Formun üzerine tıklama yapılınca aşağıda verilen ekran görüntüsü elde edilir. Şekil 8.a-30 18. Projelerde Birden Fazla Form Kullanmak Projelerde ilk formun proje hazırlandığında otomatik olarak oluşturulup dahil edildiğini biliyorsunuz. Projeye ikinci bir formu eklemek için Project menüsünden Add Form komutunu vermeniz gerekir. İki form içeren proje çalışmaya başlatıldığında projenin ilk formu durumundaki “Form1” otomatik olarak yüklenir. Projedeki ilk formun tersine ikinci form otomatik olarak yüklenmez ve ekrana getirilmez. Projedeki 2.formun ayrıca Show veya Load komutu ile belleğe yüklenmesi gerekir. Projedeki 2.formun yüklenmesini sağlamak için ilk forma ait Form_Click yordamına Form2.Show satırını eklemek gerekir. Show deyimi (method) ile kendisinden önce yazılan Form, daha önce belleğe yüklenmişse hemen aktif duruma getirilir. Form belleğe henüz yüklenmemişse belleğe yüklenip hemen aktif duruma getirilir. Aynı anda birden fazla Form belleğe yüklenebilir ama bunlardan yalnızca birisi aktif durumda olabilir. 19. Örnek / Formu yeniden boyutlamak Private Sub Form_Resize() Check1.Move 50, 50 Label1.Move 90, Check1.Height + 150 End Sub 189 Private Sub Check1_Click() If Check1.Value = 1 Then Form1.Height = 500 + Check1.Height + Label1.Height Else Form1.Height = 500 + Check1.Height End If End Sub Private Sub Form_Load() Check1.Caption = "Show me more" Label1.Caption = "Teşekkür ederim" Form1.Height = 500 + Check1.Height End Sub 20. Örnek / Formu aktif hale getirmek Form1 Sub Form2_load() lngOrigParenthWnd = SetWindowWord(Me.hwnd, -8, mdiMain.hwnd) End Sub Private Sub Form_Unload(Cancel As Integer) Dim lngResult& lngResult = SetWindowWord(Me.hwnd, -8, lngOrigParenthWnd) End Sub Sub Command1_click() Form2.Show End Sub 190 Form2 General Declaration Private Declare Function SetWindowWord Lib "user32" (ByVal hwnd&,_ ByVal nIndex&, ByVal wNewWord&) As Long Private lngOrigParenthWnd& 8.b. Formlara Uygulanan Olaylar Visual Basic uygulaması dahilinde hangi nesne kullanılırsa kullanılsın, o nesne için tanımlı olan birkaç olay mutlaka vardır. Formun üzerinde farenin tıklaması, farenin gezdirilmesi veya formun boyutlarının değiştirilmesi işlemi birer olaydır. Henüz herhangi bir nesne eklenmemiş bir form için Visual Basic tarafından otomatik olarak tanımlanan olayların adlarını görmek için formun kod penceresi açılır. Bildiğiniz gibi kod penceresinde 2 liste bulunmaktadır. Object liste kutusunda üzerinde çalışılan formun üzerine yerleştirilmiş olan nesneler listelenmektedir. Nesnelerden başka Object kutusunda (general) adında bir seçenek daha bulunmaktadır. Form dahilinde hazırlanan bütün yordamlarda geçerli olması istenen değişkenler forma ait (general) kısmında tanımlanır (Şekil 8.b-1). Şekil 8.b-1 Object liste kutusunda Form nesnesi seçili durumda iken kod penceresindeki Prog liste kutusunda formlar için önceden tanımlı olan olaylar listelenir. Daha önceden tanımlı olan olaylardan biri çalışma anında meydana geldiği zaman yapılacak işlemleri belirlemek için olayla aynı ada sahip bir yordam hazırlanır. Yordam adında ayrıca “Form” ön eki bulunur. Aslında burada yordam hazırlamaktan öte yordam için program kodu girişi yapılır. Çünkü üzerinde çalışılan projeye yeni bir form dahil edildiği zaman, form için önceden tanımlı her olay için otomatik olarak ayrıca bir yordam kalıbı hazırlanmaktadır. 191 Şekil 8.b-2 1. Formların Yüklenmesi – Form_Load Yordamı Visual Basic programları dahilinde bir formun belleğe yüklenmesi veya Load edilmesi bir olaydır (Event). Bu olaya karşılık olarak forma ait program kodu penceresinde Form_Load yordamının kalıbı otomatik olarak hazırlanır. Formun yüklenmesi sırasında işletilmesini istediğiniz program kodlarını Form_Load yordamına yazmanız gerekir. Bir formun aktive olması için belleğe yüklenmesi yeterli olmaz. Formun ayrıca aktif form olarak seçilmesi gerekir. Bu amaçla Show methodunun kullanılması gerekir. Private Sub Form_Click() Form2.Show End Sub 2. Formların Aktif ve Pasif Duruma Getirilmesi Eğer üzerinde çalıştığınız proje yalnızca bir forma sahipse, formların belleğe yüklenmesi veya bellekten silinmesi gibi sorunlarla ilgilenmenize gerek yoktur. Belleğe yüklenen bir formu ekrana getirmek veya aktive etmek için Show deyiminden yararlanılmaktadır. Show deyimi ile ekrana getirilmek istenen form önceden belleğe yüklenmişse hemen aktive edilir. Ancak Show deyimi ile ekrana getirilmek istenen form henüz belleğe yüklenmemişse önce belleğe yüklenir ondan sonra ekrana getirilir. Buna göre Show deyimi gerektiğinde Load deyiminin işlevini de yüklenmektedir. 192 Private Sub Form_Activate() Private Sub Form_Activate() Cls Cls FontSize = 20 FontSize = 20 CurrentX = 700 CurrentX = 700 CurrentY = 700 CurrentY = 700 Print "Aktif Form" Print "Aktif Form" End Sub End Sub Private Sub Form_Deactivate() Private Sub Form_Deactivate() Cls Cls FontSize = 20 FontSize = 20 CurrentX = 700 CurrentX = 700 CurrentY = 700 CurrentY = 700 Print "Pasif Form" Print "Pasif Form" End Sub End Sub Private Sub Form_Load() Form2.Show End Sub Bir Show deyimi ile ekrana getirilirken Activate olayı meydana gelir. Activate olayı meydana geldiği zaman söz konusu forma ait Form_Activate yordamı otomatik olarak işletilir. Başlangıçta işletilecek herhangi bir kod içermeyen Form_Activate yordamına formun aktive edildiği sırada işletilmesini istediğiniz program kodlarını dahil edebilirsiniz. Pencereler arasında dolaşırken üzerinde tıklama yapılarak aktif duruma getirilen formda Activate olayı, pasif duruma getirilen form da ise Deactivate olayı meydana gelir. 3. Formların Bellekten Çıkarılması Olayı Bir Visual Basic projesinin çalışması sona erdirilirken projenin formu bellekten silinir. Bu sırada Unload olayı meydana gelir. 193 Şekil 8.b-3 Yukarıdaki Unload olayına ait ekran görüntüsüne dikkat ederseniz Form_Unload yordamı şimdiye kadar hakkında bilgi verilen olay veya yordamlardan farklı olarak dışarıdan Cansel adında bir parametre almaktadır. Cansel değişkenin içeriği –1 olduğu zaman Unload işlemi iptal edilmektedir. Kullanıcıdan onay almak üzere ekrana getirilen diyalog kutusunda Tamam ve İptal adında iki düğme olacaktır. MsgBox() fonksiyonu tarafından ekrana getirilen bu diyalog kutusunda kullanıcı Tamam düğmesinde tıklama yaparsa MsgBox() fonksiyonu geriye 1, İptal düğmesini seçerse 2 sayısal değeri döndürülür. MsgBox() fonksiyonu tarafından geriye döndürülen değere göre Cansel değişkenin içeriği değiştirilmelidir. Cansel değişkenin içeriği –1 iken Unload olayı iptal edilir. Başlangıçta Cansel değişkeninin içeriği –1’dir. Private Sub Form_Unload ( Cansel As Integer) Mesaj = MsgBox(“ Projeden Çıkılacak”, 65 ,“Projeden Çıkış”) If Mesaj = 2 Then Cansel = -1 End If End Sub Visual Basic Projelerine dahil edilen Formlardan birini bellekten çıkarmak için Unload deyiminden yararlanılmaktadır. Private Sub Form_Load() Form2.Show End Sub Private Sub Form_DbClick() Unload.Form2. End Sub 194 4. Formların Yeniden Boyutlandırılması Bir önceki bölümde belirtildiği gibi varsayım olarak çalışma anında formların genişlik ve yüksekliklerinde değişiklik yapılabiliyordu. Formların boyutlarında değişiklik yapılması sırasında ReSize olayı meydana gelmektedir. Çalışma anında bir formun boyutlarında değişiklik yapılıp yapılamayacağı forma ait BorderStyle değişkeninin içeriğine bağlıdır. ReSize olayının etkisini göstermek için basit bir örnek yapalım. Bu örnek projede formun boyutlarında değişiklik yapıldıkça Line() fonksiyonu ile Formun sol üst köşesinden sağ alt köşesine doğru bir çizgi çizelim. Private Sub Form_Resize() Line (0, 0)-(ScaleWidth, ScaleHeight) End Sub Line Fonksiyonu dışarıdan ikisi seçimlik 4 parametre almaktadır. ScaleWidth özelliği formun iç genişliğini, ScaleHeight özelliği ise iç yüksekliğini belirtmektedir. ReSize yordamı bu şekilde hazırlanan örnek proje çalıştırılacak olursa Şekil 8.b-4’teki görüntü elde edilir. Şekil 8.b-4 Şekil 8.b-5 Çalışma anında fare işareti formun sağ kenarına götürüp formun genişliğini biraz azaltınca Şekil 8.b-5’te verilen ekran görüntüsü elde edilir. Çalışma anında fare ile Formun genişliği azaltılınca ReSize olayı meydana geldi ve forma ait Form_ReSize yordamı otomatik olarak çalıştırıldı. ReSize yordamında kullanılan Line() fonksiyonuna parametre olarak formun güncel genişliğini ve yüksekliğini verildiği için Resize olayı sonrası tekrar çizilen çizgi ilkinden farklı olacağından sonuçta formda iki çizgi olur. 5. KeyPress -Bir Tuşa Basma Olayı 195 Çalışma anında klavyenin yön ve kontrol (Control, Alt, Shift Vs.) tuşları dışında her hangi bir tuşa basılması halinde KeyPress olayı meydana gelir. KeyPress olayı için Visual Basic tarafından hazırlanan yordama basılan tuşun Ascii kodu parametre olarak gösterilir. Private Sub Form_KeyPress (KeyAscii As Integer) Show FontSize = 20 Print Chr(KeyAscii) & “tuşuna basıldı” End Sub Private Sub Text1_KeyPress (KeyAscii As Integer) Char = Chr(KeyAscii) KeyAscii = Asc(UCase(Char)) End Sub Private Sub Form_KeyPress(KeyAscii As Integer) Show FontSize = 20 Print Chr(KeyAscii) & " tusuna basildi" End Sub Şekil 8.b-6 Formlar için KeyPress olayının olabilmesi için formda düğme ve metin kutusu gibi nesnelerin olmaması gerekir. Bu olay veya yordam daha çok dışarıdan bilgi girişi yapılan nesneler için kullanıldığı zaman işlevsel olmaktadır. 6. KeyDown olayı KeyDown olayı tuşa basıldığı anda, bu olayı temsil eden yordamlar KeyPress olayına ait yordamdan farklı olarak dışarıdan 2.bir parametreyi daha alırlar. Basılan tuşun Ascii kodu KeyCode adlı parametreye aktarılır. Shift adındaki 2. parametreye ise bu olay meydana geldiği zaman Shift, Ctrl ve Alt tuşlarının birinin basılı durumda olup olmadığı konusunda bilgi aktarılır. KeyDown olayı sırasında Shift tuşu basılı durumda ise Shift değişkeni 1, basılı durumda değilse 0 değerini içeriri. Bu olay sırasında Ctrl tuşu basılı durumda ise Shift parametresi 2 değerini ve Alt tuşu basılı durumda ise 4 değerini alır. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = 13 And Shift = 1 Then 196 MsgBox “Shift Tuşu basılı durumda iken Enter’e basıldı” End If End Sub Shift Parametresinin İçeriği Basılı Durumda Olan Tuşlar 0 Shift.Ctr ve Alt tuşları basılı durumda değil 1 Shift tuşu basılı durumda 2 Ctrl tuşu basılı durumda 3 Shift ve Ctrl tuşları basılı durumda 4 Alt tuşu basılı durumda 5 Shift ve Alt tuşları basılı durumda 6 Ctr ve Alt tuşları basılı durumda 7 Shift ,Ctr ve Alt tuşları basılı durumda 7. KeyUp olayı KeyUp olayı KeyDown farklı olarak tuşa basıldığı sırada değil, tuşun serbest bırakıldığı yani kullanıcının elini tuşun üstünden kaldırdığı zaman meydana gelir. Bu olayı temsil eden yordam KeyPress olayına ait yordamdan farklı olarak dışarıdan 2.bir parametreyi daha alırlar. Basılan tuşun Ascii kodu KeyCode adlı parametreye aktarılır. Shift adındaki 2. parametreye ise bu olay meydana geldiği zaman Shift, Ctrl ve Alt tuşlarının birinin basılı durumda olup olmadığı konusunda bilgi aktarılır. Private Sub Form_KeyUp (Keycode As Integer, shift As Integer) 8. MouseDown Olayı Bu olay çalışma anında formun üzerinde farenin herhangi bir tuşuna basılması halinde meydana gelir. Bu olayı temsil eden Form_MouseDown yordamı dışarıdan 4 adet parametre alır. Private Sub Form_MouseDown(button As Integer, shift As Integer, x As Single, y As Single) Private Sub MDIForm_MouseDown(button As Integer, shift As Integer, x As 197 Single, y As Single) Private Sub object_MouseDown([index As Integer,]button As Integer, shift As Integer, x As Single, y As Single) Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then MsgBox (“Farenin sol tuşuna basıldı”) End If End Sub Şekil 8.b-7 Button adlı ilk parametrede MouseDown olayı sırasında farenin hangi tuşuna basıldığı konusunda bilgi bulunur. (1 sol tuş, 2 sağ tuş, 3 her iki tuş ) 2.nci parametrede Shift, Alt ve Ctr tuşlarının basılı durumda olup olmadığı konusunda bilgi bulunur. 3 ve 4 parametrelerine MouseDown olayı meydana geldiği zaman fare işaretinin form üzerindeki yeri hakkında Twip cinsinden bilgi aktarılır. Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then MsgBox (“Farenin yeri :” & Str(X) End If End Sub Şekil 8.b-8 198 & “,” & Str (Y) ) Şekil 8.b-9 Dim PaintNow As Boolean Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) PaintNow = True End Sub Private Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) PaintNow = False End Sub Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) If PaintNow Then PSet (X, Y) End If End Sub Private Sub Form_Load () DrawWidth = 10 ForeColor = RGB(0, 0, 255) . End Sub 9. MouseUp Olayı MouseUp olayı kullanıcı farenin basılı durumda olan tuşundan elini kaldırdığı zaman meydana gelir. MouseUp yordamı da dışarıdan 4 adet parametre alır. Bu olaydan form veya başka bir nesne üzerinde fare ile taşıma veya boyut değişikliği yapılırken de yararlanılabilir. 199 Private Sub Form_MouseUp(button As Integer, shift As Integer, x As Single, y As Single) 10. MouseMove Olayı MouseMove olayı fare işaretinin form üzerindeki yeri değiştirildiği zaman meydana gelir. Bu olayın meydana gelmesi için tıklama yapmaya gerek yoktur. Çalışma anında farenin yeri değiştirildikçe bu olay meydana gelir ve olayı temsil eden yordamda herhangi bir program satırı varsa işletilir. Private Sub Form_MouseMove(button As Integer, shift As Integer, x As Single, y As Single) 11. Formların Silinen Yerlerini Yeniden Yazmak ve Çizmek Visual Basic projeleri genellikle birden fazla form içerirler. Programın çalışması sırasında büyük bir olasılıkla pencereler veya formlar üst üste gelirler. Altta kalan formda daha önce Print ve Line gibi bir deyimle bilgi yazımı yapılmışsa bazı bilgiler kaybolur. Üzeri başka bir pencere ile kapatılan bir pencerenin eski halini korumak için Paint olayından yararlanılmaktadır. Paint olayı formun üzerine başka bir form geldiğinde ve Formun boyutlarında değişiklik yapıldığında meydana gelir. Şekil 8.b-10 200 Şekil 8.b-11 Private Sub Form_Paint () Dim HalfX, HalfY HalfX = ScaleLeft + ScaleWidth / 2 HalfY = ScaleTop + ScaleHeight / 2 . Line (ScaleLeft, HalfY) - (HalfX, ScaleTop) Line -(ScaleWidth + ScaleLeft, HalfY) Line -(HalfX, ScaleHeight + ScaleTop) Line -(ScaleLeft, HalfY) End Sub Private Sub Form_Resize Refresh End Sub 8.c. Formlara Uygulanan Metotlar Visual Basic’te nesnelerin özelliklerinden başka, nesnelere uygulamak üzere önceden tanımlı olan çok sayıda olay vardır. Önceden tanımlı olan olaylar nesneden nesneye değişiklik göstermektedir. Bir önceki bölümde formlara uygulanabilen bazı olaylar hakkında bilgi verildi. Nesneler için anlatılması gereken bir diğer konu ise nesneler üzerinde işlem yapmada kullanılan Method’lardır. 1. Cls Methodu Cls metodu ile formların üzerine Print veya başka bir method ile yazılanlar silinir. Cls metodundan formdaki diğer nesneler etkilenmez. Private Sub Form_Click Form1.Cls End Sub 201 Şekil 8.c-1 Private Sub Form_Click () Dim Msg AutoRedraw = -1 ForeColor = QBColor(15) BackColor = QBColor(1) FillStyle = 7 Line (0, 0)-(ScaleWidth, ScaleHeight), , B Msg = "Merhaba Dünya" CurrentX = ScaleWidth / 2 - TextWidth(Msg) / 2 CurrentY = 2 * TextHeight(Msg) Print Msg Msg = "Geri zemini temizleyin " MsgBox Msg Cls End Sub 2. Line Methodu Bu metot ile aktif veya belirtilen formun üzerine çizgi çizilir. Line metodu ile çizgi çizilmek istenen Form aktif değilse, Line metodundan önce üzerinde çizgi çizilecek form veya nesne belirtilmelidir. Genel yazılışı Line (Başlama X, Başlama Y) - ( Bitiş X, Bitiş Y), Çizgi Rengi, BF object.Line [Step] (x1, 1) [Step] (x2, y2), [color], [B][F] Genel yazılıştan görüleceği gibi Line metodu dışarıdan toplam 4 parametre alabilmektedir. Bunlardan 3 tanesinin kullanımı isteğe bağlıdır. Çizginin başlayacağı yer belirtilmezse, çizginin başlama yeri olarak Forma ait CurrentX ve CurrentY değişkenlerinin o an ki içerikleri baz alınır. 4 nci parametre olarak yalnızca “B” harfi verilirse, belirtilen başlangıç ve bitiş koordinatları esas alınarak bir dikdörtgen çizilir. Eğer “B” harfi ile “F” harfi kullanılırsa dikdörtgenin içi çizgi rengine boyanır. 202 Private Sub Form_Click DrawWidth = 3 CurrentX=500 Currenty = 500 Line –(5000,1500),RGB(0,255,0) End Sub Şekil 8.c-2 Şekil 8.c-3 PrivateSubForm_Click Şekil 8.c-4 Private Sub Form_Click Şekil 8.c-5 Private Sub Form_Click DrawWidth = 3 DrawWidth = 3 DrawWidth = 3 CurrentX=500 CurrentX=500 CurrentX=500 Currenty = 500 Currenty = 500 Currenty = 500 Line–(5000,1500) Line–3000,1500),RGB_ Line–(3000,1500),_ End Sub (0,255,0),B End Sub RGB(0,255,0),BF End Sub Eğer çizginin başlangıç koordinatı verilmeseydi, Formun sol üst köşesi olduğu varsayılırdı. Çünkü başlangıçta CurrentX ve CurrentY değişkenleri 0 değerine sahip olurlar. Line metoduna ait üçüncü parametrede çizgi rengi belirlenir. Line metoduna çizginin rengini belirtmek üzere üçüncü parametre verilmezse çizgi rengi Forma ait ForeColor değişkeninin içeriğine göre belirlenir. Tahmin edileceği gibi 4. parametrede “B” harfi kullanılmadan Full anlamına gelen “F” harfi kullanılamaz. Eğer 4. parametrede “F” harfi tek başına kullanılacak olursa hata meydana gelir. 203 Şekil 8.c-6 Çizgi kalınlığını Forma ait DrawWidth özelliği ile sağlanır. Sub Form_Click () Dim CX, CY, F, F1, F2, I ScaleMode = 3 . CX = ScaleWidth / 2 . CY = ScaleHeight / 2 . DrawWidth = 8 . For I = 50 To 0 Step -2 F = I / 50 F1 = 1 - F: F2 = 1 + F. Forecolor = QBColor(I Mod 15) Line (CX * F1, CY * F1)-(CX * F2, CY * F2), , BF Next I DoEvents If CY > CX Then . DrawWidth = ScaleWidth / 25 Else DrawWidth = ScaleHeight / 25 End If For I = 0 To 50 Step 2. F = I / 50 F1 = 1 - F: F2 = 1 + F Line (CX * F1, CY)-(CX, CY * F1) Line -(CX * F2, CY) Line -(CX, CY * F2) Line -(CX * F1, CY) ' Draw lower-left. Forecolor = QBColor(I Mod 15) 204 Next I DoEvents End Sub 3. Circle Methodu Bu method veya deyimle istenen forma istene çap, renk ve kalınlıkta çember veya elipsler çizilir. Genel yazılışı Circle (Başlama X, Başlama Y), YarıÇap, Çizgi Rengi object.Circle [Step] (x, y), radius, [color, start, end, aspect] Şekil 8.c-7 Sub Form_Click () Dim CX, CY, Radius, Limit ScaleMode = 3 CX = ScaleWidth / 2 CY = ScaleHeight / 2 If CX > CY Then Limit = CY Else Limit = CX For Radius = 0 To Limit . Circle (CX, CY), Radius,RGB(Rnd * 255, Rnd * 255, Rnd * 255) Next Radius End Sub 205 Private Sub Form_Click DrawWidth = 2 X = ScaleWidth / 2 Y = ScaleHeight / 2 Circle(X,Y),X/2,RGB(255,0,0) End Sub Şekil 8.c-8 Dairenin çapı ve başlama yeri istenildiği gibi değiştirilebilir. Aşağıda verilen örnekte dairenin çapı ve başlama yeri, çalışma anında söz konusu formun boyutlarına bağlı olarak belirlendi. 3 ncü parametre ise dairenin rengi belirtilir. 4 ve 5 nci parametre ile çemberin çizilecek miktarını belirtmeniz gerekir. Kullanılması isteğe bağlı olan 4 ve 5 nci parametreler kullanılmazsa çemberin tam olduğu varsayılır. 6 ncı parametre olarak kullanılan değer 1 den küçük bir değer verilmesi halinde çemberin genişliği artar. Circle (X, Y ), X/2 , RGB ( 255 , 0 , 0 ), , , 0.7 Private Sub Form_Click DrawWidth = 2 Circle(1000,1000),750 End Sub Şekil 8.c-9 Private Sub Form_Click DrawWidth = 2 Circle(1000,1000), 750,RGB (255 ,0 ,0) End Sub Şekil 8.c-10 206 Private Sub Form_Click DrawWidth = 2 Circle (1000,1000),750,RGB (255 ,0 ,0), , ,0.7 End Sub Şekil 8.c-11 4. Pset Methodu Bu method ile istenen formun üzerine veya forma dahil edilmiş olan resim kutusuna bir nokta konulur. Genel yazılışı Pset(Pozisyon X, PozisyonY), Nokta Rengi object.PSet [Step] (x, y), [color] Pset metoduna forma konulacak noktanın rengi 3. parametre olarak verilmezse bunun o anda geçerli renk olacağı varsayılır. Bu metoda 1. ve 2. parametre olarak verilen bilgiler ile noktanın formun neresine konulacağı belirlenir. Şekil 8.c-12 Sub Form_Click() Dim CX, CY, Msg, XPos, Ypos ScaleMode = 3 DrawWidth = 2 ForeColor = QBColor(4) FontSize = 24 207 CX = ScaleWidth / 2 CY = ScaleHeight / 2 Cls Msg = "Happy New Year!" CurrentX = CX - TextWidth(Msg) / 2 CurrentY = CY - TextHeight(Msg) Print Msg Do XPos = Rnd * ScaleWidth YPos = Rnd * ScaleHeight PSet (XPos, YPos), QBColor(Rnd * 15) DoEvents Loop End Sub Forma konulacak noktanın yerini belirlemek için Pset metoduna parametre olarak koordinat değerleri için sürekli olarak formun sol üst köşesi baz alınır. Eğer formlara Pset metodu ile arka arkaya nokta eklerken baz olarak forma eklenen bir önceki noktanın yeri alınmak isteniyorsa Pset metoduna Step parametresi eklenmelidir. Private Sub Form_Click DrawWidth = 2 For S = 500 To 2500 Step 10 PSet(S,S) Next S End Sub Şekil 8.c-13 5. Move Methodu Bu metot ile formların ekrandaki konumlarında değişiklik yapılır. Formun ekrandaki konumu forma ait Left ve Top değişkenlerinde saklanır. Bu iki değişken ile formun sol üst köşesinin koordinatı belirlenir. Genel yazılışı Move(SolÜstKöşe X, SolÜstKöşe Y) object.Move left, top, width, height 208 Move metodunun genel yazılışına göre dışarıdan iki parametre alınmaktadır. Bu parametrelerden 2’sinin kullanımı isteğe bağlıdır. 2. parametre kullanılmazsa formun ekrandaki konumunu Move metodu ile değiştirirken formun boyutlarında değişiklik yapılabilir. Bunun için Move metodunun kullanılması isteğe bağlı olan 3. ve 4. parametre verilir. 3. parametre ile formun genişliğinde ve 4. parametre ile yüksekliğinde değişiklik yapılabilir. Private Sub Form_Click Move 1000, 2500, Width + 500, Height + 500 End Sub Private Sub Form_Click () Dim Inch, Msg Msg = "Choose OK to resize and move this form by " Msg = Msg & "changing the value of properties." MsgBox Msg Inch = 1440 Width = 4 * Inch Height = 2 * Inch . Left = 0 Top = 0 . Msg = "Now choose OK to resize and move this form " Msg = Msg & "using the Move method." MsgBox Msg Move Screen.Width - 2 * Inch, Screen.Height - Inch, 2 * Inch, Inch End Sub 6. Refresh Methodu Projelere eklenen formlarla ilgili olarak temelde en çok 3 işlem yapılmaktadır. Bunlar formların hard diskten belleğe okunması (Load) , ekranda gösterilip aktif duruma getirilmesi (Show) ve ekrandan kaldırılıp gizlenmesidir (Hide). Form bellekte iken kullanıcı listelenen dosyalardan birini silmiş olabilir. Bu durumda formun bellekteki kopyasındaki bilgiler ile diskteki bilgiler arasında farklılıklar olur. Bu nedenle formun ReFresh metoduna tabi tutulması gerekir. 209 Şekil 8.c-14 Private Sub Form_Click () Dim FilName, Msg as String, I as Integer File1.Pattern = "TestFile.*" For I = 1 To 8 FilName = "TESTFILE." & I Open FilName For Output As FreeFile File1.Refresh Close. Next I Msg = "Choose OK to remove the created test files." MsgBox Msg Kill "TESTFILE.*" File1.Refresh . End Sub 7. TextWidth ve TextHeight Methodları Bir form veya başka bir nesnenin üzerine yazılacak karaktersel sabit bir bilgi veya değişkenin içeriği, formun üzerinde o anda geçerli olan Font ve Punto değerlerine bağlı olarak belli bir genişlik ve yüksekliğe sahip olur. Sabit bir bilginin geçerli font ve punto değerine bağlı olarak form üzerinde genişliği TextWidth, yüksekliği ise TextHeight ile öğrenilebilir. Bu metotların işlevini göstermeden önce hiçbir nesne olmayan bir forma sabit bir bilgiyi yazalım. Formun genişliğini 4 inç yani 1440 * 4 Twip olsun. Private Sub Form_Load() Show FontName = "Arial" FontSize = 14 Print "Microsoft Visual Basic" 210 FontSize = 20 Print "Microsoft Visual Basic" FontSize = 28 Print "Microsoft Visual Basic" End Sub Forma “Microsoft Visual Basic ” sabit bilgisini 14,20 ve 28 punto değerleri ile üç kez yazalım. Şekil 8.c-15 Bu ekran görüntüsünden çıkarılması gereken sonuç şu olmalıdır. Bir sabit bilgi ister ekranda ister yazıcıdan alınan kağıtta, kullanılan Font ve Puntoya bağlı olarak belli bir metin genişliğine sahip olur. 14 Punto ile yazılan metin form üzerinde yaklaşık 2 inç kadar yer kaplarken punto değeri 20 seçilince aynı sabit bilgi tam tamına 4 inçlik bir genişliğe sığdı. İşte TextWidth methodu bir bilginin geçerli olan font ve punto değerine bağlı olarak form üzerinde kaplayacağı genişliği Twip cinsinden bulmaya yaramaktadır. TextHeight ise metnin yüksekliğini bulmada kullanılmaktadır. Private Sub Form_Load() Show FontName = "Arial" FontSize = 14 Mesaj = "Microsoft Visual Basic" Genişlik = TextWidth(Mesaj) Yükseklik = TextHeight(Mesaj) Print "Genişlik : "; Genişlik Print "Yükseklik :"; Yükseklik FontSize = 20 Genişlik = TextWidth(Mesaj) Yükseklik = TextHeight(Mesaj) Print "Genişlik : "; Genişlik 211 Print "Yükseklik :"; Yükseklik End Sub Bu yordamın dahil olduğu proje çalıştırıldığında aşağıda verilen ekran görüntüsü elde edildi. Şekil 8.c-16 8.d. MDI Özellikli Formlar Visual Basic uygulamaları dahilinde aynı anda birde fazla pencereyi açık tutma imkanı vardır. Gerektiğinde aynı anda birden fazla pencereyi açık tutmaya imkan vermek için şimdiye kadar 212 projelerde kullanılan formlardan farklı olarak MDI (Multiple Document Interface) adı verilen çoklu formlar kullanılır. Üzerinde çalıştığınız projeye MDI özellikli bir form eklemek istiyorsanız Project menüsünden Add MDI Form komutunu vermelisiniz (Şekil 8.d-1). Project menüsünden Add MDI Form komutunu verirseniz, daha önce Form1 adında normal bir form içeren projeye “MDIForm1” adında MDI özellikli yeni bir form eklenir (Şekil 8.d-2) Şekil 8.d-1 MDI özellikli Form projede tek başına yer alabileceği gibi çok sayıda alt form (Child) da içerebilir. Diğer taraftan bir projede yalnızca bir tek MDI özellikli form bulunabilir. Üzerinde çalıştığım projeye MDI özellikli bir form dahil ettikten sonra Project menüsündeki Add MDI Form komutu kullanılamaz duruma gelir. Buna göre projelerde yalnızca bir MDI özellikli form bulunabilir Şekil 8.d-2 Üzerinde çalıştığınız projeye MDI özellikli bir form ekledikten sonra istediğiniz sayıda alt formu başka bir deyişle Child formu projeye dahil edebilirsiniz. Ayrıca projedeki normal formların sonradan Child özellikli form olmalarını sağlayabilirsiniz. Daha önceki sayfalarda formlarla ilgili olarak verilen Properties penceresinde MDIChild adında bir değişken veya özellik vardı. Bu değişken varsayım olarak False değerine sahiptir. Projede MDI özellikli form yokken bu özelliği mantıksal True değeri aktarılıp proje çalıştırılacak olursa hata meydana gelir. 213 Şekil 8.d-3 Projedeki MDI özellikli forma alt formlar dahil etmek için Project menüsünden Add Form komutu ile yeni bir form dahil edip bu formun Child Form olması sağlanır veya projedeki mevcut formlara Child özelliği verilir. Örneğin üzerinde çalışılan projede biri normal form ve 2 adet ait formu olan bir MDI formun olması istensin. Bu durumda proje oluşturulduğu sırada projeye otomatik olarak normal bir form eklendiği için önce Project menüsündeki Add MDI Form komutu ile projeye MDI özellikli bir form eklenir.Daha sonra alt (Child) form olarak kullanılmak üzere iki adet normal form daha projeye dahil edilir. Visual Basic tarafından formlara varsayım olarak verilen adlara bağlı kalınırsa Project Explorer penceresi Şekil 8.d-4’teki gibi olur. Şekil 8.d-4 Şimdi Form2 ve Form3 formlarına Child özelliğini verelim. Bu amaçla Properties penceresinde ilgili forma ait bilgiler varken MDIChild değişkenine True değeri aktarmak yeterlidir. Form2 ve 214 Form3 formlarının MDIChild özelliklerini True yaptıktan sonra bu projeye ait pencere Şekil 8.d-5’teki gibi olur. Şekil 8.d-5 Proje penceresinde formların ikonalarına bakarak hangi formun normal, hangisinin MDI veya alt (Child) form olduğunu anlamanız mümkündür. Bu örnek proje için MDI ve alt form hazırlığı yapıldıktan sonra proje başlatılabilir. Bu ilk formun dışında kalan formları aktif duruma getirmek için formların belleğe yükletilmesi ve gösterilmesi gerekir. Bizim örnekte Form1 adlı form otomatik olarak yüklenilecektir. Projedeki MDI özellikli formu belleğe yüklemek için Form1 adlı formun herhangi bir yordamına MDI formun yüklenmesini sağlayacak program satırlarının eklenmesi gerekir. Private Sub Form_Load MDIForm1.Show End Sub Bu program satırı ile projenin başlangıç formu olan Form1’in belleğe yüklenilmesi biter bitmez MDI özellikli form Show metodu ile belleğe yüklenilip aktive edilir. Form1’e ait Form_Load yordamı bu şekilde düzenlenip proje çalıştırılırsa Şekil 8.d-6’daki ekran görüntüsü elde edilir. 215 Şekil 8.d-6 Çalışma anında alınan bu ekran görüntüsünde alttaki form MDI özellikli formdur. Bu sırada MDI özellikli formun herhangi bir yerinde tıklama yapılacak olursanız bu kez MDI özellikli form aktif form olur (Şekil 8.d-7). Şekil 8.d-7 Bu şartlarda henüz Child Form2 ve Form3’ü kullanma veya ekrana getirme imkanı yoktur. Bu iki formun diğer formlar gibi belleğe yüklenilmesi gerekir. Bu nedenle MDI özellikli formun Form_Load yordamına aşağıdaki gibi iki program satırı eklenmelidir. Private Sub MDIForm_Load Form2.Show Form3.Show End Sub 1. MDI Formların Özellikleri 216 MDI formlarla ilgili olarak bazı işlemleri yapmak için yeni bir proje hazırlayacağım. Bu projeye biri MDI özellikli olmak üzere 4 form ekleyeceğim. Ayrıca MDI özellikli formu, Project menüsündeki Properties komutu ile ekrana getirilen Procject Properties diyalog kutusunda başlangıç formu olarak seçeceğim. MDI özellikli formlar ile normal formların özellikleri arsında bazı farklılıklar bulunmaktadır. Normal formların ekrandaki konumunu ve büyüklüklerini programcı tasarım veya çalışma anında belirleyebilir. Şekil 8.d-8 Windows ve Windows uyumlu programların pencerelerine dahil edilen alt pencere veya bilgiler pencereye sığmıyorsa, pencerenin sağ kenarına otomatik olarak düşey ve yatay kaydırma çubukları eklenir. Benzer durumda MDI özellikli pencereler için de geçerlidir. MDI özellikli pencereye dahil edilen pencerelerin (Child Form) boyutları çalışma anında değiştirilip alt pencerelerden birinin pencereye sığmaması halinde, MDI özellikli forma düşey kaydırma çubuğu otomatik olarak eklenir. MDI özellikli formlara kaydırma çubuklarının eklenmesini istemiyorsanız Properties penceresinde MDI özellikli Formun özellikleri varken ScollBars özelliğine False değerini aktarmalısınız (Şekil 8.d8). Ayrıca Properties penceresinden yararlanarak MDI özellikli form hariç diğer 3 formun MDIChild özelliklerine True değerini aktaralım. Ardından MDI özellikli başlangıç formuna ait Form_Load yordamında alt programların yüklenmesini sağlayacak program satırlarını ekleyelim. 2. MDI Formlar İçin Araç Çubuğu Hazırlamak Visual Basic’ te MDI özellikli formlara araç çubuğu eklemek için kullanılan Toolbar adında özel bir kontrol bulunmaktadır. MDI özellikli formlara araç çubuğu eklemek için PictureBox kontrolünden yararlanabilirsiniz (Şekil 8.d-9). Toolbar’da Picture Box kontrolünü temsil eden düğmeyi seçili duruma getirdikten sonra MDI özellikli forma eklenmiş olan ve formu boydan boya kaplatan Picture Box nesnesinin üzerine araç çubuklarında düğmelerin büyüklüğüne sahip ikinci bir Picture Box nesnesi alınır. Çalışma anında bu düğmenin üzerinde tıklama yapıldığı zaman yapılacak işlemleri belirlemek için program kodu yazılır. 217 Şekil 8.d-9 3. Çalışma Anında Projeye Yeni Child Formlar Eklemek Visual Basic projeleri dahilinde çalışma anında yeni alt formlar hazırlamak mümkündür. Private Sub MDI Form_Load Dim YeniForm As New Form1 Yeniform.caption = ”Deneme formu” YeniForm.Show Form1.Show End Sub 4. Child Formların MDI Form İçindeki Yerleşimi Child özellikli pencerelerin düzenleniş şekline Arrange methodu ile etkide bulunabilir. Child formlar kademeli yerleşirse bu basamak şekline (Cascade) adı verilir. Arrange methodu ile özellikle form ve pencereler 4 değişik tipte MDI pencereye yerleştirilmektedir. Arrange methoduna parametre olarak “0” sayısal değeri verilirse formlar basamaklanır (Şekil 8.d-10). Arrange methoduna parametre olarak “1” sayısal değeri verilirse formlar yataylanır (Şekil 8.d-11) Eğer pencereler üst üste konularak dizilmek istenirse “2” parametresi kullanılmalıdır (Şekil 8.d-12). Private Sub MDIForm_Load() Form1.Show Form2.Show Form3.Show MDIForm1.Arrange 0 ‘ 0,1,2 kullanılır End Sub 218 Şekil 8.d-10 Şekil 8.d-11 219 Şekil 8.d-12 5. Örnek /Arrange Const FormSayı = 3 Dim F(1 To FormSayı) As New Form1 Private Sub Picture1_Click() Static Sayı Dim I, Ebat, Basla Sayı = Sayı + 1 Select Case Sayı Case 1 MDIForm1.Arrange 1 Case 2 MDIForm1.Arrange 2 220 Case 3 Ebat = MDIForm1.Width MDIForm1.Width = Ebat / 2 Form1.WindowState = 1 For I = 1 To FormSayı F(I).WindowState = 1 Next I Basla = Timer Do Loop Until Timer = Basla + 3 MDIForm1.Arrange 3 End Select End Sub Const FormSayı = 5 Dim F(1 To FormSayı) As New Form1 Private Sub MDIForm_Load() Dim I Load Form1 For I = 1 To FormSayı F(I).Caption = "Form" & I + 1 Next I End Sub 6. Örnek / Activate, Deactivate Events Form1 Private Sub Form_Activate() MDIForm1.Label1.Caption = "Güncel form: " & Me.Caption End Sub 221 MDIForm Private Sub MDIForm_Load() Form1.Caption = "Form #1" Dim NewForm As New Form1 yaratır Load NewForm NewForm.Caption = "Form #2" NewForm.Show End Sub ' Form1’in başlığı ' Yeni bir child form ' Yeni formun başlığı ' Yeni bir form 8.e. Hazır Formlar ve Şablonlar Verilen ekran görüntüsünde tespit edebildiğiniz gibi Visual Basic çok sayıda farklı görünüm ve işleve sahip form tipini veya şablonunu sunmaktadır. Visual Basic ile birlikte hazır olarak verilen ve yeni bir form hazırlamak üzere File menüsünden New komutu verildiği zaman işlevsel olan şablonlar gerçekte birer normal Visual Basic formundan farklı değildir. Her Bir şablon Visual Basic’in kurulduğu dizinin altında yer alan “\Template” adlı alt dizinde FRM uzantılı bir form dosyası ile temsil edilmektedir 222 Şekil 8.e-1 1. About Dialog Eğer Visual Basic ile hazırladığınız uygulamalar hakkında ekrana bilgi vermek istiyorsanız, bu amaca yönelik olarak bir diyalog kutusunu veya boyutları değişmeyen bir form hazırlamanız gerekir. Visual Basic bu amaçla kullanabileceğiniz About Dialog adında bir şablona sahiptir (Şekil 8.e-1). Bu şablondan yararlanarak projeniz hakkında bilgi içeren diyalog kutusuna kolay bir şekilde hazırlayabilirsiniz. Add Form diyalog kutusunda About Dialog şablonunu seçerek Aç düğmesine basarsanız Visual Basic aşağıdaki ekran görüntüsünü verir. Daha sonra bu form üzerinde istediğiniz değişiklikleri yapabilirsiniz. Bu forma yeni nesneler ekleyebilir, varsayım olarak forma eklenen Picture Box nesnesinin içerdiği resmi değiştirebilirsiniz. 223 Şekil 8.e-2 About Box şablonuna dayandırarak hazırlanan bu forma eklenmiş olan nesneleri görmek için Properties penceresine bakabilirsiniz (Şekil 8.e-3). Şekil 8.e-3 Visual Basic ile birlikte hazır olarak verilen ve yeni bir Form hazırlamak üzere File menüsünden New Form komutu verildiği zaman işlevsel olan şablonlar gerçekte birer normal Visual Basic formundan farklı değildir. Her bir şablon Visual Basic’in kurulduğu dizinin altında yer alan “ 224 Template” adlı alt dizinde FRM uzantılı bir form dosyası ile temsil edilmektedir. Sık sık benzer özelliklere sahip formlar hazırlıyorsanız, hazırladığınız formları şablon olarak kullanabilirsiniz. 1. Options Dialog Page Setup gibi diyalog kutularını sıfırdan hazırlamak yerine Options Dialog adlı şablondan yararlanabilirsiniz (Şekil 8.e-4). Bu şablon ile hazırlanan formda varsayım olarak Group1, Group2, Group3 ve Group4 adında 4 sayfa veya sekme bulunmaktadır. Daha sonra Options Dialog şablonu ile hazırladığınız bu formda istediğiniz değişiklikleri yapabilirsiniz. Şekil 8.e-4 2. Log In Dialog Şablonu 225 Şekil 8.e-5 Özellikle çok kullanıcılı ortamlar için hazırlanan programlar çalıştırıldıklarında kullanıcıdan ilk olarak adını ve şifresini girmesi istenir. Eğer yalnızca kullanıcı adı ve şifresi girişinde kullanılmak üzere iki metin kutusuna sahip bir form hazırlamak istiyorsanız Log In Dialog adlı şablondan yararlanabilirsiniz (Şekil 8.e-5). 3. FrmSplash Şablonu Şekil 8.e-6 4. FrmTip Şablonu 226 Şekil 8.e-7 5. FrmODBCLogon Şablonu Şekil 8.e-8 227 8.f. Kontroller Formlara eklenecek her kontrol ToolBox penceresinde bir düğme ile temsil edilmektedir. Tasarım anında çalıştığınız forma veya projeye yeni bir nesne veya kontrol eklemek istiyorsanız ToolBox penceresi ekranda değilse ekrana getirmeniz gerekir. ToolBox penceresini ekrana getirmek için View menüsündeki ToolBox komutundan yararlanabilirsiniz (Şekil 8.f-1). ToolBox penceresini ekrandan kaldırmak için Toolbox penceresinin sağ alt köşesindeki düğmeden yararlanabilirsiniz veya Toolbox penceresi aktif pencere iken Alt+F4 tuşlarına basabilirsiniz. Şekil 8.f-1 Visual Basic başlatıldığında ToolBox penceresinde toplam 21 adet düğme bulunmaktadır. Bu 21 düğmeden üzerinde ok işareti hariç her biri bir nesneyi veya kontrolü temsil etmektedir (Şekil 8.f-2). 228 Şekil 8.f-2 ToolBox penceresinde bir düğme ile temsil edilmeyen kontrolleri kullanabilmek için söz konusu kontrole ait OCX uzantılı dosyanın üzerinde çalışılan projeye dahil edilmesi gerekir. Projeye eklenen her OCX uzantılı kontrol dosyası projenin büyümesine neden olur. Üzerinde çalıştığınız projeye OCX uzantılı bir kontrol dosyası eklemek istiyorsanız Project menüsündeki Components komutundan yararlanmanız gerekir (Şekil 8.f-3). Şekil 8.f-3 Üzerinde çalıştığınız projeye OCX uzantılı özel kontrol dosyalarından bir veya birden fazlasını dahil etmek üzere Project menüsünden Components komutunu verecek olursanız ekrana Components diyalog kutusu gelir. Bu diyalog kutusunda projeye eklenmek üzere istenen özel kontrol dosyası seçilir. 229 Şekil 8.f-4 Yeni bir proje hazırlandığı zaman projeye otomatik olarak dahil edilen ve ToolBox araç çubuğunda birer düğme ile temsil edilen kontrollerden başka Components diyalog kutusundan yararlanarak Visual Basic ile birlikte verilen özel kontrolleri üzerinde çalıştığınız projeye dahil edebilirsiniz. Projelere otomatik olarak dahil edilmeyen kontrollerden her biri ayrı OCX dosyası olarak hard diskte bulunmaktadır. OCX uzantılı özel kontrol dosyaları varsayım olarak \WINDOWS\SYSTEM klasörüne kopyalanmaktadır. Bu klasörde bulunan OCX uzantılı dosyaları istediğiniz zaman üzerinde çalıştığınız projeye dahil edebilirsiniz. Eğer Components diyalog kutusunda yalnızca o ana kadar projeye dahil etmiş olduğunuz OCX uzantılı özel kontrol dosyalarının ve diğer nesnelerin listelenmesini istiyorsanız Selected Items Only onay kutusunu seçili duruma getirmeniz gerekir (Şekil 8.f-4). Selected Items Only onay kutusunu seçili duruma getirdikten sonra Components diyalog kutusunda yalnızca o ana kadar üzerinde çalışılan projeye dahil edilmiş olan nesneler ve özel kontrol dosyaları listelenir. 230 Şekil 8.f-5 Bilgisayara kopyalamanıza rağmen Components diyalog kutusunda listelenmeyen özel kontroller varsa Browse düğmesinde tıklama yapabilirsiniz. Ekrana bilgisayara kurulu olan OCX uzantılı dosyaların listelendiği Add ActiveX Control diyalog kutusu gelir (Şekil 8.f-6). Hangi özel kontrol dosyasını üzerinde çalıştığınız projeye dahil etmek istiyorsanız o dosyayı seçip Aç düğmesinde tıklama yapmanız gerekir. Şekil 8.f-6 231 Şekil 8.f-4’te verilen ekran görüntüsünden tespit edeceğiniz gibi Components diyalog kutusunda Controls, Designers ve Insertable Objects adında 3 sekme bulunmaktadır. Insertable Objects sekmesi özel kontrol dosyalarından başka bilgisayara kurulmuş olan programlara ait nesnelerden yararlanmak için seçilir (Şekil 8.f-7). Şekil 8.f-7 Üzerinde çalıştığınız projeye bir metin kutusu veya düğme eklemek için Projeye özel kontrol dosyası eklemeye gerek yoktur. Çünkü sözü edilen iki kontrol Visual Basic projelerine otomatik olarak eklenmektedir. Eğer üzerinde çalıştığınız proje dahilinde Microsoft Graph nesnesini kullanmak istiyorsanız önce Graph nesnesini temsil eden özel kontrol dosyasını Components diyalog kutusu aracılığı ile Toolbox penceresine dahil etmelisiniz. Toolbox penceresine dahil edilen kontrol projenin istenilen formunda kullanılabilir. 1. Label Kontrolü 232 Daha önceki konulardan hatırlanacağı gibi kontroller veya nesneler formların üzerlerine yerleştirilmektedir. Bu nedenle ToolBox penceresinde bir düğme ile temsil edilen kontrolleri kullanabilmek için daha önceden kontrollerin yerleştirileceği formun hazırlanması gerekir. Label kontrolü, üzerinde çalışılan forma sabit bir bilgiyi yazmak amacıyla kullanılmaktadır. Şekil 8.f-8 Toolbox penceresinde üzerine “A” harfi olan düğmede tıklama yapılarak seçili duruma getirilir (Şekil 8.f-8). Bu düğme seçili duruma getirildikten sonra fare işareti formun bilgi girişi için mesaj yazdırılacak yerine götürülür. ToolBox penceresinde üzerinde ok işareti bulunan düğmenin dışında herhangi bir düğme seçili durumda iken fare işareti formun üzerine götürüldüğünde şekil değişikliğine uğrar ve “+” işareti gibi görünür. Formun üzerine mesaj yazmada kullanılacak Label nesnesinin boyutları fare ile belirlenip farenin sol tuşu serbest bırakılır. Label nesnesi seçili durumda olduğu zaman Label nesnesinin form üzerindeki yeri ve boyutlarını değiştirebilir veya Del tuşu ile silip formdan çıkarabilirsiniz. Forma eklenen nesnenin özellikleri hakkında bilgiyi Properties penceresinde bulmanız mümkündür. Çoğu zaman formlara birden fazla kontrol veya nesne eklendiği için hangi nesnenin özelliklerini Properties penceresinde görmek istiyorsanız o nesneyi seçili duruma getirmeniz gerekir. a. Label nesnesinin başlığını değiştirmek Tasarım anında aktif forma eklenen ilk Label nesnesine Label1, ikinci sırada eklenen varsayım olarak Label2 adı ve başlığı verilmektedir. Label nesnesinin başlığında değişiklik yapmak için Caption özelliğinden yararlanılır. Bir Label nesnesinin Caption özelliği hem tasarım anında hem de çalışma anında değiştirilebilir (Şekil 8.f-9). Private Sub Label1_Click() Label1.Caption = “ Merhaba Dünya ” End Sub Şekil 8.f-9 233 b. Label nesnesinin adını değiştirmek Forma eklenen Label nesnesine Label1, ikincisine Label2 adının verildiğini biliyorsunuz. Visual Basic tarafından Label nesnelerine varsayım olarak verilen adları değiştirmek için Name özelliğinden yararlanılır (Şekil 8.f-10). Label ve diğer nesnelerin adları ancak Properties penceresinde tasarım anında değiştirilebilir. Nesnenin adları çalışma anında değiştirilemez. Şekil 8.f-10 c. Label nesnesi metninde font kullanımı Properties penceresinde Font özelliğinin karşısında MS Sans Serif yazılıdır. Işıklı bantı font özelliğinin sonuna götürünce üç adet nokta (...) olan bir düğme eklenir. Bu düğmede tıklama yaparsanız ekrana Yazı Tipi diyalog kutusu gelir. Bu fontlardan hangisini kullanmak istiyorsanız o fontu seçebilirsiniz. Label nesnesinin boyutlarını fare ile değiştirmek yerine Properties penceresinde Label nesnesinin Width özelliği için istediğiniz değeri girebilirsiniz. Bunun için ışıklı bant Properties penceresinde Width özelliğinin üzerine götürülür. Ardından Label veya seçili durumda olan nesne için Twip cinsinden genişlik değeri Width ve Height (yükseklik) değeri Twip cinsinden yazabilirsiniz. Çalışma anında Label nesnesinin üzerinde tıklama yapıldığı zaman aşağıdaki program kodları “Merhaba Dünya” yazısını ile elde etmek mümkündür. Private Sub Label1_Click() Label1.Caption = “Merhaba Dünya” End Sub 234 Şekil 8.f-11 Eğer Properties penceresinde AutoSize değişkenin içeriği True yapılırsa Label nesnesinin genişliği Label metnine bağlı olarak otomatik olarak belirlenir (Şekil 8.f-11). Eğer AutoSize değişkeni False değerini içeriyorsa ve Label metni Label alanına sığmıyorsa Label metninin bir kısmı formun üzerinde görünmez. Bazen Label nesnesinin genişliğini fazla arttırma imkanı yoktur. Böyle durumlarda Label metni birden fazla satıra bölünür. Bu amaçla Label nesnesinin WordWrap özelliğine True değeri aktarılır (Şekil 8.f-12). Şekil 8.f-12 d. Label metnini çerçeve içine almak Eğer Label nesnesinin sınırlarını çizgi ile belirlemek istiyorsanız Label nesnesine ait BorderStyle değişkeninden veya özelliğinden yararlanılır. Label nesnesinin sınırlarını çizgi ile belirlemek istiyorsanız BorderStyle değişkenine “1-Fixed Single” değilse “0-None” değerini aktarmanız gerekir (Şekil 8.f-13). 235 Şekil 8.f-13 e. Label metninin label alanı içindeki yeri Eğer Label metninin Label alanı içinde ortalamasını veya sağ tarafa hizalanmasını istiyorsanız Label nesnesine ait Alingment özelliğinden yararlanmanız gerekir. Label metninin Label alanı içindeki yeri hem tasarım hem de çalışma anında değiştirilebilir (Şekil 8.f-14). Private Sub Form_Load() Label1.Alignment = 2- Center End Sub Şekil 8.f-14 Eğer Label kutusunun üç boyutlu olarak görüntülenmesini istiyorsanız Label nesnesine ait Apperance özelliğinden yararlanmanız gerekir. Apperance özelliğindeki 1-3D özelliğini seçerseniz label kutusu boyutlanır (Şekil 8.f-15). 236 Şekil 8.f-15 2. TextBox Kontrolü ToolBox’ta üzerinde “ab” harfleri olan düğme ile formlara metin kutusu nesnesi eklenir. ToolBox penceresinde TexBox kontrolünü temsil eden düğme seçili durumda iken fare işareti formun TexBox nesnesi eklenmek istenen yerine götürülür. Ardından farenin sol tuşu basılı durumda iken fare sürüklenerek metin kutusunun boyutları belirlenir. Ekran görüntüsünden tespit edileceği gibi forma eklenen ilk TetBox’in içeriği varsayım olarak “Text1” şeklindedir (Şekil 8.f-16. Private Sub Form_Load() Text1.Text = ““ End Sub Şekil 8.f-16 Çalışma anında metin kutusuna girilen bilgi, proje dahilinde varsayılan adı “Text1” olan metin kutusu nesnesine aktarılır. Programcı daha sonra bu metin kutusunun içeriğini istediği gibi değerlendirebilir. Yukarıda verilen program kodu ile Text1 adlı TextBox’ in içeriği form yüklenir yüklenmez boşaltılır. Bu program kodları üzerinde çalışılan projenin tek formuna dahil edildikleri için TextBox’ların hangi Forma dahil oldukları konusunda bilgi vermeye gerek duyulmadı. Eğer bu program kodları BAS uzantılı bir module dosyasına yazılmış olsaydı TextBox adlarından önce TextBox’ların dahil edildiği formun adı belirtilirdi. Private Sub Test() Form1.Text1.Text = ““ End Sub 237 Şekil 8.f-17 TextBox nesnelerine girilen değerler varsayım olarak sol tarafa göre hizalanır. Eğer TextBox nesnesine girilecek bilgilerin sağ tarafa hizalanmasını istiyorsanız Alignment özelliğinden yararlanmanız gerekir. Bunun için Alignment değişkenine 1-Right Justify özelliğini aktarmanız gerekir. 2-Center’i seçerseniz TextBox nesnesine giren değerler ortalanır (Şekil 8.f-17). a. TextBox nesnelerini kopyalamak Üzerinde çalıştığınız projenin formuna arka arkaya birkaç TextBox nesnesi dahil etmek yerine mevcut TextBox nesnesini kopyalayabilirsiniz. Formun üzerine yerleştirdiğiniz Text1 adındaki metin kutusu nesnesini seçtikten sonra Edit menüsünden Copy komutunu verip metin kutusunun bir kopyasını alabilirsiniz. Edit menüsünden Paste komutunu verip aynı nesnenin aynı form üzerinde birden fazla kopyasının olmasını sağlayabilirsiniz. Bu durumda nesne dizisinin elemanlarına erişim sağlamak için Index özelliğinden yararlanılır. Bu şekilde çoğaltılan bütün TextBox nesneleri aynı ad ve içeriğe sahiptir. Ancak Visual Basic kopyalama işlemi sırasında TextBox nesnelerinin Index özelliğinin içeriğini değiştirir (Şekil 8.f-18). Şekil 8.f-18 238 Şekil 8.f-19 Private Sub Form_Load() Text1(0).Text = “ Adana“ Text1(1).Text = “ Ankara“ Text1(2).Text = “ Afyon“ Text1(3).Text = “ Aydın“ End Sub b. TextBox’a girilen bilgiyi satırlara bölmek Eğer metin kutusuna girmek istediğiniz bilgiyi metin kutusu içinde birden fazla satıra bölmek istiyorsanız, tasarım anında Properties penceresinde söz konusu metin kutusu nesnesine ait MultiLine özelliğine True değerini aktarmalısınız. MultiLine özelliğine sahip TextBox’a bilgi girerken Enter tuşu ile bir sonraki satıra inilebilir. Şekil 8.f-20 Diğer yandan TextBox nesnesine program kodu yazarak aktarılan bilgiyi birden fazla satıra bölmek için Chr fonksiyonundan yararlanılır. Bunun için label metnine satır sonu karakterini eklemek gerekir. 239 Private Sub Form_Load() Text1.Text = “ Merhaba Dünya“ + Chr(13) + Chr(10) + “Merhaba İnsanlar” End Sub c. TextBox’ lara kaydırma çubuklarını eklemek TextBox nesnelerine MultiLine özelliğini vermekten başka kelime işlem programlarında olduğu gibi kaydırma çubukları (ScrollBar) eklenebilir. Kaydırma çubukları eklemek istenen metin kutusunun mutlaka MultiLine özelliğine sahip olması gerekir. TextBox’lara kaydırma çubukları eklemek için ScrollBars özelliğinden yararlanılır (Şekil 8.f-21). Şekil 8.f-21 ScrollBars değişkenine 4 değişik değer aktarılabilir. Aktarılan değerleri yukarıda verilen ekran görüntüsünde tespit edebilirsiniz. MultiLine özelliğine sahip TextBox’ların kenarlarına varsayım olarak kaydırma çubukları konulmaz. Bu nedenle başlangıçta TextBox nesnesine ait ScrollBars değişkeni “0-None” değerini içermektedir. TextBox’a yatay kaydırma çubuğu eklemek istiyorsanız ScrollBars değişkenine “1-Horizontal” değerini aktarmanız gerekir. Şekil 8.f-22’de verilen ekran görüntüsünü formdaki ilk Textbox nesnesine ait ScrollBars özelliğine “1-Horizontal” değerini aktardıktan sonra çalışma anında alınmıştır. 240 Şekil 8.f-22 Yatay kaydırma çubuğu, kutudan daha geniş satırlar söz konusu olduğu zaman işlevsel olmaktadır. TextBox’a yalnızca düşey kaydırma çubuğu eklemek için ScrollBars değişkenine “2-Vertical” değeri aktarılır (Şekil 8.f-23). Şekil 8.f-23 TextBox’a hem yatay hemde düşey kaydırma çubuğu eklemek için ScrollBars değişkenine “3Both” değeri aktarılır (Şekil 8.f-24). ScrollBar değişkeninin içeriği ancak tasarım anında Propertiee penceresinde değiştirilebilir. Şekil 8.f-24 241 d. TextBox nesnesine girilecek bilgi miktarı Bir TextBox nesnesine en fazla 64KB kadar metin girilebilir. Ancak programcı TextBox’a girilecek bilgi miktarını veya karakter sayısını sınırlayabilir. TextBox’a girilecek karakter sayısı MaxLength değişkeni aracılığı ile belirlenir. Bu değişkende varsayım olarak 0 değeri bulunur. Bu sırada kutuya girilecek bilgi konusunda bir engelleme yapılmaz. Eğer bir metin kutusuna çalışma anında 20 karakterden fazla bilgi girişine izin vermek istemiyorsanız MaxLength özelliğine 20 değerini aktarmanız gerekir. Şekil 8.f-25 e. Tablndex özelliği Çalışma anında forma dahil edilmiş olan bir sonraki nesnenin üzerine gitmek için Tab tuşuma, sıradaki bir önceki nesnenin üzerine gitmek için Shift+Tab tuşlarına basılır. Forma eklenen ilk nesnenin sıra numarası varsayım olarak 0, 2. sırada eklenen nesneninki 1’ dir. Ancak bu sıra çoğu zaman sorunlar çıkarır. Bu nedenle programcının formlara dahil ettiği nesnelere kendi sıra numarasını vermesi gerekir. Nesnelerin form içindeki sıra numarası Tablndex değişkeni aracılığı ile izlenir (Şekil 8.f-26). . Şekil 8.f-26 Bu genellemeye Label’ler dahil değildir Çünkü çalışma anında kullanıcının Label nesneleri üzerinde yaptığı işlemler sınırlıdır. Dolayısıyla çalışma anında sıradaki nesne bir Label ise Tab tuşuna basıldığı zaman Label nesnesi atlanılır. Formdaki nesnelerin sıra numarası veya TabIndex değerleri tasarım veya çalışma anında değiştirilir. 242 f. TabStop ve locked özelliği Bazı durumlarda formlara eklenen TextBox’lara kullanıcının müdahale etmesi istenmez. Örneğin kayıt düzeltmek amacıyla hazırlanan bir formdaki Kayıt Numarası yazılı olan TextBox’ın içeriğinin kayıt okuma işleminden sonra değiştirilmemesi gerekir. Bu ve benzeri bir nedenle TextBox’ın atlanması istenmiyorsa TextBox’a ait TabStop özelliğinden yararlanılır (Şekil 8.f-27). Şekil 8.f-27 Tab tuşuna basıldığı zaman sırada TabStop değişkeni False olan bir TextBox nesnesi varsa söz konusu TextBox atlanır. Ancak fare ile TabStop özelliği false yapılan metin kutusuna geçebilirsiniz. Eğer TextBox nesnesinin içeriğinin değiştirilmesine izin vermek istemiyorsanız Locked özelliğine True değerini aktarmanız yeterlidir (Şekil 8.f-28). 243 Şekil 8.f-28 Başlangıçta False değerini içeren Locked özelliğine program kodu yazarak çalışma anında True değerini aktarabilirsiniz. Locked özelliği True değerini içerdiği sürece TextBox nesnesinin içerdiği bilgide herhangi bir değişiklik yapamazsınız. g. Şifre karakteri Özellikle ticari amaçlı programlarda programa girişte şifre istenir. Visual Basic programcıları ek bir çaba harcamadan Kullanıcıdan şifre isterken TextBox nesnesinden yararlanabilirsiniz. Şifre olarak girilen karakterler ekranda görünmemelidir. Girilen her karakterin yerine “*” gibi bir şifre karakterinin ekranda ilgili yere yazılması gerekir. Forma eklenen TextBox nesnesini şifre girişinde kullanmak için şifre olarak girilecek bilgilerin yerine yazılacak karakterleri PassWordChar özelliğinden yararlanarak seçmeniz gerekir (Şekil 8.f-29). Şekil 8.f-29 Varsayım olarak başlangıçta PassWordChar değişkeninin içeriği boştur. Bu değişkene tasarım veya çalışma anında istenen karakter atanabilir. 244 Şekil 8.f-30 Şimdi size basit şifre örneği vereceğim. Bu amaçla hazırlanan form yüklenir yüklenilmez çalışan Form_Load yordamı dahilinde şifre karakteri seçilir ve TextBox’ın içeriği boşaltılır. Private Sub Form_Load() Text1.Text = “” Text1.PasswordChar = “*” End Sub Kullanıcı şifre girmek üzere her bir tuşa bastığında çağrılan TextBox’a ait olan Text1_KeyPress yordamına girişi yapılan şifrenin karakter ve tekrar sayısı hesaplanır. Girilen karakterler belirlenen sayıda ve belirlenen şifre ile aynı ise kullanıcı programa girebilecek, değilse programın çalışması sona erdirilecek. Private Sub Text1_KeyPress(KeyAscii As Integer) Static Sifre As String Static Tur As Integer Sifre = Sifre + Chr$(KeyAscii) If Len(Sifre) = 5 Then Tur = Tur +1 If Tur > 2 Then MsgBox (“Şifreniz yanlış”) End End If If Sifre = “Basit” Then MsgBox (“Şifreniz doğru”) KeyAscii = 0 245 Sifre = “” Form2.Show Else Text1.Text = “” KeyAscii = 0 Sifre = “” End If End If End Sub Eğer üzerinde çalıştığınız projenin formuna yerleştirdiğiniz metin kutularını daha önce açtığınız veri tabanı dosyasının içeriğini görüntülemek veya değiştirmek amacıyla kullanmak istiyorsanız DataField ve DataSource özelliklerinden yararlanmanız gerekir. Şekil 8.f-31 h. Yazı ve zemin rengini seçmek Forma eklenen Textbox nesnelerinde başlangıçta zemin rengi beyaz ve yazı rengi ise siyahtır. Eğer metin kutusuna yazacağınız karakterlerin farklı bir renkte olmasını istiyorsanız ForeColor özelliğinden yararlanmanız gerekir. Bu amaçla Properties penceresinde kendisi için yazı rengi seçilmek istenen metin kutusuna ait özellikler listelenirken ForeColor özelliğinin üzerine gidilir ve renklerin yer aldığı liste kutusu açılır. ForeColor özelliğine ait liste kutusunda Palette ve System adında iki sekme bulunmaktadır (Şekil 8.f-32). 246 . Şekil 8.f-32 System sekmesinde daha önce Windows 95’in Denetim Masasından yararlanarak menüler, kaydırma çubukları, başlık çubukları ve diyalog kutuları için belirlenen renkler listelenir. Palette sekmesinde ise renk paleti ekrana getirilmektedir. Metin kutusu nesnesi için başlangıçta beyaz olan zemin rengini değiştirmek istiyorsanız BackColor özelliğinden yararlanabilirsiniz. i. Format fonksiyonu ile TextBox nesnesinin içeriğini biçimlemek Format Fonksiyonu ile TextBox nesnelerinin içeriklerini veya herhangi bir bilgiyi biçimlemek, tarihsel bilgi olarak değerlendirilmesini sağlamak mümkündür. Şimdi bir metin kutusuna girdiğiniz bilgiyi nasıl üçer hanelere ayırabileceğinizi görelim. Bu amaçla üzerinde çalıştığımız projenin formuna bir metin kutusu nesnesi dahil edelim ve formun üzerinde tıklama yapıldığı zaman işletilmek üzere aşağıdaki yordamı hazırlayalım. Private Sub Form_Click() Dim Sayı As Long Sayı = Str (Text1.text) ‘ 65784929 Text1.Text = Format (Sayı , “###,###,###”) ‘ 65.784.929 End Sub Bu yordamda önce Dim ve Long bildiri deyimleri ile sayısal bir değişken tanımlanır. Ardından Text1 adındaki metin kutusunun Text özelliğinin içeriği Str fonksiyonu ile sayısal bilgi türüne çevirip tanımladığımız değişkene aktaralım. Ardından sayısal bilgi içeren değişkeni ve metin kutusunu biçimlemede kullanacağımız biçim kodunu Format fonksiyonuna parametre olarak verelim. Format fonksiyonu kendisine 1.parametre olarak verilen bilgiyi, ikinci parametrede verilen biçim koduna göre biçimleyip geri göndermektedir ( Şekil 8.f-33). 247 Şekil 8.f-33 Tam bu sırada formun üzerinde tıklama yapıp yukarıda ekran görüntüsünü verdiğimiz yordamı işletince, metin kutusunun içeriği, Format fonksiyonuna ikinci parametre olarak verdiğimiz biçim koduna göre biçimlenir (Şekil 8.f-34). Şekil 8.f-34 Eğer metin kutusuna yazılan virgülden sonra iki hanesinin olmasını isterseniz format aşağıdaki şekilde düzenlenirdi. Private Sub Form_Click() Dim Sayı As Long Sayı = Str (Text1.text) ‘ 65784929 Text1.Text = Format (Sayı , “###,###,###,00”) ‘ 65.784.929.00 End Sub Metin kutusu nesnesine girmiş bulunduğunuz bilginin bir kısmını seçebilirsiniz. Nesnenin seçili duruma getirilen içeriği SelText değişkenine aktarılmaktadır. Aşağıda verilen program satırı ile metin kutusu nesnesinin içeriğinin seçili durumda olan kısmı Format fonksiyonundan yararlanılarak büyük harfe çevrilmekte ve ikinci bir metin kutusuna aktarılmaktadır. Private Sub Form_Click() Text2.Text = Format (Text1.SelText, “>”) End Sub 3. Masket Edit Kontrolü 248 Visual Basic İle birlikte belli tip ve uzunluktaki bilgileri girerken kullanabileceğiniz Masked Edit adında bir özel kontrol verilmektedir. Başlangıçta Components diyalog kutusundan yararlanarak projeye dahil etmeniz gerekir. Şekil 8.f-35 Forma eklenen ilk Masked Edit nesnesine varsayım olarak MaskEdBox1 adı verilmektedir. Masked Edit nesnelerinin içerikleri başlangıçta boştur. Projeyi çalıştırırsanız Masked Edit nesnesi TextBox nesnesinden farklı olmaz. Forma yerleştirmiş olduğunuz Masked Edit nesnesinin özelliklerini bir diyalog kutusu aracılığı ile değiştirmek istiyorsanız Custom özelliğinden yararlanmanız gerekir. Propeties penceresinde Masket Edit nesnesinin özellikleri listelenirken ışıklı bantı Custom özelliğinin üzerine götürecek olursak özelliğe ait metin kutusuna bir düğme yerleştirilir. Bu düğmede tıklama yapacak olursanız Masked Edit nesnesinin özelliklerinde değişiklik yapabilen Property Pages diyalog kutusu ekrana getirilir. Bu diyalog kutusunda Masked Edit nesnesi ile ilgili özellikler 4 sekmeye ayrılmış durumdadır (Şekil 8.f-36). Şekil 8.f-36 249 Bu diyalog kutusunda ilk olarak nesne için Maske hazırlamak gerekir. Bu amaçla Mask özelliğinden yararlanmak gerekir. Forma yerleştirdiğimiz Masked Edit nesnesini şehirler arası telefon kodu ile birlikte telefon numarasını girmek için Şekil 8.f-37’teki gibi bir maske hazırlayalım. Maskeyi hazırlarken girdiğimiz her “#” karakteri çalışma anında girilecek bir rakamı temsil edecektir. Şekil 8.f-37 Properties Pages diyalog kutusunda forma yerleştirdiğim Masked Edit nesnesi için bu şekilde maske hazırlayıp diyalog kutusunu Tamam düğmesi ile kapatınca hazırladığım maske tasarım anında Masket Edit nesnesi içinde görüntülendi. Şekil 8.f-38 Masked Edit nesnesinin Mask özelliğini değiştirmek için Custom özelliğine başvurmadan Properties penceresinde direk Mask özelliğine başvurabilirsiniz. 250 Şekil 8.f-39 Masket Edit nesnesinin Mask özelliğini bu şekilde değiştirdikten sonra projeyi çalıştıracak olursanız aşağıdaki gibi bir ekran görüntüsü ile karşılaşırsınız. Bu sırada direk olarak 3 haneli alan kodunu girebilirsiniz. Şekil 8.f-40 Alan kodunun giriş tamamlandıktan sonra ekleme noktası 7 haneli telefon numarasını girebileceğiniz yerde hazır olarak beklemeye başlar. Aşağıda verilen ekran görüntüsünü projeyi çalıştırdıktan sonra direk”322” yazdıktan sonra alırsak Şekil 8.f-41’ deki görüntü elde edilir. Şekil 8.f-41 Verilen ekran görüntülerinden tespit edebileceğiniz gibi Maske yardımı ile bilgi girilecek yerler tire(-) karakteri ile işaret edilmektedir. Eğer bilgi girilecek yerleri işaret ederken başka bir karakteri kullanmak istiyorsanız Madket Edit nesnesinin PromptChar özelliğinden yararlanmanız gerekir (Şekil 8.f-42). 251 Şekil 8.f-42 Hazırladığınız maskenin uzunluğu MaxLength özelliğine aktarılır. Masked Edit nesnesinin Mask özelliğini değiştirmek için Custom özelliğine başvurmadan Properties penceresinde direk Mask özelliğine başvurabilirsiniz. MasKed Edit nesnelerine en fazla 64 karakter uzunluğunda bilgi girilebilir. Eğer forma yerleştirmiş olduğunuz Masked Edit nesnesine daha az veya daha fazla bilgi girmek istiyorsanız MaxLenght özelliğinden yararlanmanız gerekir (Şekil 8.f-43). Verilen örnekte MaxLenght özelliği 15 karakter olarak belirlenmiştir. Şekil 8.f-43 4. CommandButton Kontrolü 252 ToolBox penceresinde Command Box nesnesini temsil eden düğmeyi fare ile seçili duruma getirdikten sonra formun üzerinde sürükleme işlemini yaparak düğmenin boyutları fare ile belirlenir. Formlara eklenen ilk düğmenin veya Command Box nesnesinin başlığı ve program içindeki adı varsayım olarak Command1 seçilir. Bu düğmenin adını değiştirmek için Properties penceresinde Command Box nesnesine ait Caption özelliğinde değişiklik yapılır Düğme metninin ilk harfinin altının çizili olmasını sağlamak için düğme başlığının önüne “&” işareti konur. Şekil 8.f-44’de “G” harfinin önüne konulduğu için tasarım ve çalışma anında “G” harfinin altı çizili olur. Ancak aynı diyalog kutusunda veya pencerede ilk harfi aynı olan birden fazla seçenek veya düğme varsa, düğme metninde hangi harfin altı çizili olmasını istiyorsanız “&” işaretini o harfin önüne koymanız gerekir (Şekil 8.f-44). Düğmenin başlığı Properties penceresinde olduğu gibi çalışma anında da değiştirilebilir. Private Sub Form_Click() Command1.Caption = “Kaydet” End Sub Şekil 8.f-44 Command Button nesnesine ait Cancel değişkeni başlangıçta False değerini içerir. Cansel değişkeninin içeriği Properties penceresinde veya çalışma anında program kodu yazılarak değiştirilebilir. Bu şekilde Esc tuşunu işlevi kullanılabilir. Private Sub Form_Click() Command1.Cansel = True End Sub Cancel özelliğinin etkisini görebilmek için İptal_Click yordamında MsgBox() fonksiyonu yardımıyla ekrana mesaj yazdıralım. 253 Private Sub İptal_Click() Onay = MsgBox(“Esc tuşuna basıldı programdan çokılacak”,4) If Onay = 6 Then End End If End Sub Şekil 8.f-45 İptal_Click yordamı bu şekilde düzenlenmiş olan Proje çalıştırıldığında Esc tuşuna basılırsa Cansel özelliği True olan düğmede tıklama yapılmış gibi İptal_Click yordamı çalıştırılır. Aynı form içinde Cansel özelliği True yapılmış birden fazla düğme varsa TabIndex değişkeni daha küçük olan düğmede tıklama yapılmış olur. Eğer başlangıçta yani söz konusu form ekrana geldiğinde Tablndex değeri en küçük olan düğmenin yerine başka bir düğmenin seçili durumda olmasını istiyorsanız o düğmeye ait Default değişkeninden yararlanılır. Şekil 8.f-46 Forma eklenen düğmelerin Default değişkeni başlangıçta False değerine sahip olur. Default değişkeni True yapılan düğmenin TabIndex değişkeni hangi değeri içerirse içersin düğmenin dahil olduğu form çalışma anında aktif yapıldığında düğme seçili duruma gelir (Şekil 8.f-46). Bir forma eklenen düğmeler başlangıçta varsayım olarak seçilebilir durumda yani Enabled özelliği True değerine sahiptir. Kullanılamaz duruma getirilmek istenen düğmenin Enabled değişkeni False duruma getirilmelidir (Şekil 8.f-47). 254 Şekil 8.f-47 Programın çalışması sırasında Çıkış düğmesine ait Enabled değişkeni True yapılmadığı sürece düğme, fare ile yapılan tıklama ve diğer işlemlere duyarsız olur. Eğer program çalışırken o sırada gerek duyulmayan düğmeleri ekrandan tamamıyla kaldırmak istiyorsanız Visible değişkeninden yararlanabilirsiniz. Visible değişkeni False durumuna getirilen düğme ekrandan kaldırılır (Şekil 8.f48). Şekil 8.f-48 Eğer Tab veya Shift+Tab tuşları ile nesneler arasında dolaşırken atlanılmak istenen bir nesne varsa bu nesnenin TabStop değişkeni False durumuna getirilmelidir (Şekil 8.f-49). Bir nesnenin TabStop özelliği tasarım anında olduğu gibi çalışma anında da değiştirilebilir Private Sub Form_Click() Form1.Command1.TabStop = False End Sub Şekil 8.f-49 255 a. Düğmelerin üzerine resim yerleştirmek Şimdiye kadar verilen düğme örneklerinde düğmenin işlevini işaret etmek için düğmenin başlığından veya Caption özelliğinden yararlanıldı. Ancak düğmelerin işlevini işaret etmek için, düğmelerin üzerine resim ekleyebilirsiniz. Düğmelerin üzerine resim yerleştirmek istiyorsanız ilk olarak Style özelliğinden yararlanarak düğmenin stilini Graphical olarak değiştirmeniz gerekir. Stilini Graphical olarak değiştirdiğiniz düğmenin üzerine resim koymak için Command Button nesnesinin Picture özelliğinden yararlanılmaktadır. Şekil 8.f-50 Style Graphical olarak değiştirdiğiniz düğmenin üzerine resim koymak için Command Button nesnesinin Picture özelliğinden yararlanabilirsiniz. Bu düğmeler için ICO uzantılı resim dosyaları kullanmak gerekir. Diğer yandan bazen düğme basılı iken düğmenin üzerinde farklı bir resim görüntülenmesi istenir. Eğer düğmenin üzerinde başlık metnine yer vermek istemiyorsanız Caption özelliğinin içeriğini silmeniz gerekir. Şekil 8.f-51 Diğer yandan bazen düğme basılı durumda iken düğmenin üzerinde farklı bir resmin görüntülenmesi istenir. Düğme basılı durumda iken düğmenin üzerinde başka bir resim görüntülemek 256 istiyorsanız Command Button nesnesinin DownPicture özelliğinden yararlanmanız gerekir (Şekil 8.f51). Şekil 8.f-52 Command Button nesnesi seçilemez durumda iken veya Enabled özelliği True değeri içerdiği zaman düğmenin üzerine başka bir resim görüntülenmesini istiyorsanız bu kez DisablePicture özelliğinden yararlanmanız gerekir (Şekil 8.f-52). b. ToolTipText özelliği Eğer fare işaretini Visual Basic ile hazırladığınız proje dahilinde kullandığınız bir nesnenin üzerine götürdüğünüzde ekrana araç çubuklarındaki gibi kısa bir açıklayıcı bilginin getirilmesini istiyorsanız söz konusu nesnenin ToolTextTip özelliğinden yararlanmanız gerekir (Şekil 8.f-53). Açıklama metnini Properties penceresinde ToolTipText özelliğine ait metin kutusuna yazabilirsiniz. Şekil 8.f-53 5. CheckBox (Onay Kutuları) 257 Onay kutuları (Check Box) ve Radyo düğmeleri Windows uyumlu profesyonel programlarda çok sık kullanılmaktadır. Onay kutuları aç-kapa şeklinde çalışmaktadır. Visual Basic projeleri dahilinde formlara onay kutusu nesnesi eklemek için önce ToolBox penceresinde CheckBox kontrolünü temsil eden düğme seçili duruma getirilir. CheckBox kontrolünü temsil eden düğme seçili durumda iken formun üzerinde fare ile sürükleme yapılarak onay kutusunun Forma dahil edilmesi işlemi tamamlanır. Şekil 8.f-54 Formlara eklenen ilk onay kutusunun adı ve başlığı varsayım olarak Check1, ikinci sırada eklenen kutuya ise Check2 adı ve başlığı verilir (Şekil 8.f-54). Diğer nesne başlıklarında olduğu gibi onay kutusu başlığı metni içinde altı çizilmek istenen harfin önüne “&” karakteri konulmalıdır. Onay kutusunda onay işareti varken seçili durumdadır, yoksa değildir. CheckBox’lar, küçük bir kare ve küçük karenin sağında yer alan başlık bilgisinden meydana gelirler. Eğer onay kutusu başlığı metni içinde altı çizili bir harf varsa onay kutusunun seçili olma veya olmama durumunda değişiklik yapmak için Alt tuşu ile birlikte altı çizili harfe basılabilir. Bir diyalog kutusu veya formunda istenilen sayıda Onay kutusu bulunabilir. Onay kutuları birbirlerinden bağımsızdır. Birbirlerine etkileri yoktur CheckBox nesnesine ait Alignment değişkeninden yararlanarak programcı kutuyu sağa ve başlığı ise sol tarafa alabilir. CheckBox’lara ait Alignment özelliği başlangıçta varsayım olrak 0-Left Justify değerine sahiptir. Şekil 8.f-55’de verilen ekran görüntüsündeki ilk onay ktusunun Alignment özelliği “0-Left Justify” değerine ve ikinci onay kutusunun Alignment özelliği “1-Right justify” değerine sahip olması sağlandı. 258 Şekil 8.f-55 Formlara eklenen CheckBox’ lar başlangıçta seçili durumda değildir. Bu onay kutusunun seçili durumda olup olmadığı CheckBox’ a ait Value değişkeni ile izlenir. Onay kutularına ait Value değişkenine ait properties penceresinde 1-Checked değerini aktarmak yeterlidir. Şekil 8.f-56 Bazı durumlarda CheckBox’ın yapılan başka bir işlemden dolayı bloke edildiğini belirtmek için CheckBox’a ait kutu 2-Grayed seçeneği ile gri renge boyanır (Şekil 8.f-56).CheckBox’ın seçili olma özelliğini veya Value özelliğinin içeriği çalışma anında program kodu yazılarak değiştirilebilir. Çalışma anında fare veya baoşluk tuşu ile kutuya onay işareti konulur veya kaldırılır. Eğer çalışma anında kutu gri renge boyanmak isteniyorsa kond penceresinde Value özelliğine 2-Grayed değeri aktarılmalıdır. Private Sub Check2_Click() Check2.Value = 2- Grayed End Sub Fare ile CheckBox sınırları üzerinde tıklama yapılırsa hem CheckBox’a ait Value değişkenin içeriği değişir hem de Click olayı meydana gelir. Söz konusu onay kutusunda tıklama yapıldığında otomatik olarak çalıştırılan yordamın aşağıdaki gibi düzenlendiğini varsayalım. Bu yordamda üzerinde tıklama yapılan onay kutusunda (Check1) onay karakteri varsa, başka bir deyişle Value değişkeni “1Checked” değerine sahipse değişkenin içeriği”0-UnChecked” olarak değiştirilmektedir. 259 Private Sub Check2_Click() If Check1.Value = 1- Checked Then Check1.Value = 0 – Unchecked Elseif Check1.Value = 0- Unchecked Then Check1.value = 1- Checked End If End Sub 6. OptionButton (Radyo Düğmeleri) Radyo düğmeleri ile onay kutuları bir özellik dışında birbirinden farklı değildir. Aynı form içinde yan yana konulan bütün onay kutuları seçili durumda olabilir. Ancak Radyo düğmeleri böyle değildir. Bir forma dahil edilen Radyo düğmelerinden ancak birisi seçili duruma getirilebilir. Forma eklenen ilk Radyo düğmesine varsayım olarak Option1, ikinci sırada eklenen Radyo düğmesine ise Option2 adı ve başlığı verilir (Şekil 8.f-57). Forma eklediğiniz radyo düğmesinin adını ve başlığını Properties penceresinde değiştirebilirsiniz. Şekil 8.f-57 Alinment değişkenine “1-Right Justify” değeri aktarılan radyo düğmesinin başlığı sol tarafa, düğme ise sağ tarafa alınır (Şekil 8.f-57). Radyo düğmelerinin Aligment özelliklerinin içeriği çalışma 260 anında program kodu yazılarak değiştirilemez. Bir düğmesinin seçili olup olmadığı düğmeye ait Value değişkeni ile izlenir(Şekil 8.f-58). Tasarım anında varsayım olarak bütün radyo düğmelerine ait Value değişkenleri False değerine sahiptir. Bu durumda çalışma anında ilk sıradaki radyo düğmesi otomatik olarak seçili duruma getirilir. Seçili durumdaki radyo düğmesinin Value değişkeni “-1”, seçili olmayanların ki ise “0” değerini içerir. Şekil 8.f-58 Tasarım anında proje ilk çalıştırıldığında seçili durumda olması istenen radyo düğmesinin Value değişkenine Properties penceresinde True değeri aktarılmalıdır. Private Sub Form_Load() Option1.Value=True End Sub 7. Frame (Çerçeveler) Radyo düğmeleri çerçevelerle gruplaşmadığı sürece birden fazla düğmenin seçili duruma getirilmesi mümkün değildir. Eğer üzerinde çalışılan forma eklenmek istenen nesneler çerçeve içine alınmak veya gruplaşmak isteniyorsa, Forma önce çerçeve nesnesi eklenir. Forma çerçeve nesnesi eklemek için ToolBox penceresinde çerçeve nesnesini temsil eden düğme seçili duruma getirilir. İlgili düğme seçili iken formun istenen yerine istenen büyüklükte çerçeve eklenebilir. Forma eklenen ilk çerçeveye varsayım olarak Frame1 adı ve başlığı verilir (Şekil 8.f-59). 261 Şekil 8.f-59 Çerçevenin varsayılan adını değiştirmek için çerçeveye ait Name başlığını değiştirmek için Caption değişkeninden yararlanılır. Çerçevenin başlığı çalışma anında program kodu yazılarak değiştirebilir. Private Sub Form_Load() Frame1.Caption = “Hizalama” End Sub Forma dahil edilen bir çerçevenin içine daha sonradan onay kutuları ve radyo düğmeleri gibi nesneler eklenebilir (Şekil 8.f-60). Şekil 8.f-60 8. VScrollBar (Düşey Kaydırma Çubuğu) Diyalog kutuları veya pencerelerin içinde görüntülenmek istenen belge, çalışma tablosu veya dosya listesi, bir seferde pencereye sığamıyorsa söz konusu bilginin o anda ekranda gösterilen kısmını değiştirmek için kaydırma çubuklarından yararlanılır. Tasarım anında üzerinde çalışılan projedeki 262 formun birine düşey veya yatay kaydırma çubuğu eklemek için önce ToolBox penceresinde ilgili düğme seçili duruma getirilir. Şekil 8.f-61 ToolBox penceresinde düşey ve yatay düğmeler yan yana bulunmaktadır. Forma eklenen ilk düşey kaydırma çubuğuna varsayım olarak Vscroll1 adı verilmektedir. Bir düşey kaydırma çubuğunda, çubuğun üst kısmında ucu yukarı bakan, alt kısmında ise ucu aşağıya bakan ok işareti içeren iki düğme bulunmaktadır. Kaydırma çubuklarında maksimum ve minimum değerleri vardır. Çubuktaki düğme en alt noktada iken maksimum değere, en üst noktada iken minimum değere ulaşılmış olur. Şekil 8.f-62 Kaydırma çubuğu içeren bir proje çalıştırıldığında kaydırma çubuğundaki kutu başlangıçta çubuğun en üst noktasında yer alır. Düşey kaydırma çubuğunun maksimum değeri başlangıçta 32767 ve minimum değeri ise o dır (Şekil 8.f-62). Kaydırma çubuğuna verilecek en yüksek değer Max değişkenine, en düşük değer ise Min değişkenine aktarılır. Max ve Min değişkenlerinin içerikleri tasarım ve çalışma anında istenildiği gibi değiştirilmektedir. 263 Şekil 8.f-63 Çalışma anında yeri değiştirilen kaydırma düğmesinin çubuk üzerindeki yerinin sayısal karşılığı Value değişkeni ile izlenir. Value değişkeninin başlangıçtaki içeriği ile Min değişkeninin içeriği aynıdır (Şekil 8.f-63). Value değişkenin içeriği kaydırma çubuğuna ait LargeChange değişkeni kadar artar. LargeChange değişkeni başlangıçta 1 değerine sahiptir. Private Sub Form_Load() Vscroll1.Value = Vscroll1.Max / 2 End Sub Value değişkeninin içeriği LargeChange değişkeni kadar artıyorsa benzer şekilde yukarı kaydırma düğmesinde yapılan her tıklama işleminden sonra Value değişkeninin içeriği SmallChange değişkeni kadar azalır (Şekil 8.f-64). Şekil 8.f-64 SmallChange değişkeni başlangıçta 1 değerine sahiptir. Düşey kaydırma çubukları daha çok veri tabanı dosyasında okunan kayıtların bir pencere içinde ekrana getirilmesi veya Browse yapılması sırasında kullanılır. Bu nedenle programcının söz konusu düşey kaydırma çubuğuna ait Max, Min, SmallChange ve LargeChange değişkenlerin içeriklerini çalışma anında belirlemesi gerekir. VScroll ile ilgili örnek program 264 ‘Value =50 : Min=0 : Max=100 Private Sub VScroll1_Change() Label1 = "Seçilen sayı: " + Str(VScroll1.Value) End Sub Private Sub VScroll1_Scroll() Label1 = "Seçilen sayı: " + Str(VScroll1.Value) End Sub Private Sub Command1_Click() Dim I, R For I = 1 To VScroll1.Value Step 1 R = R + I Next Text1.Text = Str(R) I = 1 Do While I R = R + I = I + Loop Text1.Text <= VScroll1.Value I 1 = Str(R) End Sub 9. HscrollBar (Yatay Kaydırma Çubuğu) Ekranda duruş şekli ve kaydırmanın yönü dışında, düşey kaydırma çubuğu ile yatay kaydırma çubuğu arasında pek fark yoktur. Forma eklenen ilk yatay kaydırma çubuğunun adı Visual Basic tarafından Hscroll1 olarak seçilir. Programcı tasarım anında yatay kaydırma çubuğuna istediği adı verebilir. Düşey kaydırma çubukları için sözü edilen bütün değişkenler veya özellikler yatay kaydırma çubukları için geçerlidir. 265 Şekil 8.f-65 HScroll ile ilgili örnek program Private Sub HScroll1_Change() ‘Value =50 : Min=0 : Max=100 Text1.Text = Str(HScroll1.Value) + " mph" End Sub Private Sub HScroll1_Scroll() Text1.Text = Str(HScroll1.Value) + " mph" End Sub Private Sub cmdExit_Click() End End Sub 10. ListBox (Liste Kutuları) 266 Windows uyumlu programlarda temelde iki çeşit liste kutusu kullanılmaktadır. Bunlardan ilki normal liste kutusu, diğeri ise açılan liste kutusudur. Açılan liste kutularına ComboBox adı verilmektedir. Eğer liste kutusundaki seçeneklerin hepsi aynı anda liste kutusunun içine sığmayacak kadar çok sayıda olsaydı, liste kutusunun sağ kenarına düşey kaydırma çubuğu eklenirdi. Örneğin aşağıda verilen liste kutusundaki bütün seçenekleri aynı anda liste kutusu içinde görebilme imkanı olmadığı için liste kutusunun sağ kenarına düşey kaydırma çubuğu eklenmiş durumdadır. Şekil 8.f-66 Kaydırma çubuğundan başka liste kutusu içinde hareket etmek için ok tuşlarından yararlanabilirsiniz. Diğer nesnelerde olduğu gibi formun liste kutusu eklemek istenen yerine istenen boyutlarda fare ile liste kutusu dahil edilir. Aktif forma dahil edilen ilk liste kutusuna List1 adı verilmektedir. Tasarım anında liste kutusunun içi boş olduğundan liste kutusunun adı aynı zamanda kutunun içine yazılır. Şekil 8.f-67 Çalışma anında Liste kutusunun adı kutunun içinden silinir. Liste kutusunda listelenecek seçenekler çalışma veya tasarım anında belirlenebilir. Liste kutusunda yer alacak seçenekleri tasarım anında 267 belirlemek istiyorsanız ListBox nesnesinin List özelliğinden yararlanmanız gerekir (Şekil 8.f-68). Propreties penceresinde ışıklı bantı List özelliğinin üzerine götürdüğünüz zaman List özelliğinin sonuna bir liste kutusu eklenir. Bu liste kutusundan yararlanarak Liste kutusu nesnesinin seçeneklerini belirleyebilirsiniz. Şekil 8.f-68 Bu liste kutusunu açtığınızda ekleme noktası seçenekleri girebilmeniz için hazır olarak bekler. Ancak liste kutusunda yer alacak seçeneklerden birini yazdıktan sonra bir sonraki satıra geçmek için enter tuşuna basmak gerekir. Enter tuşu ile bir sonraki satıra geçilmek istendiğinde ise liste kutusu kapanmaktadır. Bu durumda her seferde ancak bir seçeneğin girişini yapabilirsiniz. Çalışma anında liste kutusuna eleman veya seçenek eklemek için AddItem methodundan yararlanılır. Aşağıda verilen program kodu ile üzerinde çalışılan proje çalıştırılırsa, projenin formuna daha önce dahil edilmiş olan List1 adlı liste kutusunda 4 seçenek dahil edilir (Şekil 8.f-69). Private Sub Form_Load() List1.AddItem “Adana” List1.AddItem “Ankara” List1.AddItem “Antalya” List1.AddItem “Aydın” End Sub Şekil 8.f-69 Bu değişiklikten sonra liste kutusunun dahil olduğu proje çalıştırılırsa aşağıda verilen ekran görüntüsü elde edilir. Şekil 8.f-70 268 Bu liste kutusuna AddItem ile birkaç seçenek daha dahil edilecek olursa, bütün seçenekler liste kutusunda aynı anda görüntülenemeyeceği için liste kutusunun sağ kenarına otomatik olarak düşey kaydırma çubuğu eklenir (Şekil 8.f-71). Şekil 8.f-71 Visual Basic projesi dahilinde hazırlanan liste kutusunda seçim yapmak için diğer Windows uyumlu programlarda olduğu gibi fareden faydalanılabilir. Seçili durumda olan seçeneğin metni liste kutusuna ait Text adlı değişkende saklanır (Şekil 8.f-72). Liste kutularına ait Text değişkeni ancak çalışma anında tanımlı olduğu için Properties penceresinde bulunmaz. Form üzerinde tıklama yapıldığında ekrana diyalog kutusu içinde liste kutusunun seçili durumda olan seçeneği ekrana gelir. Liste kutusu hareket ettikçe Liste kutusuna ait Text değişkeninin içeriği otomatik olarak değişir. Private Sub Form_Click() MsgBox (List1.Text) End Sub Şekil 8.f-72 Liste kutusunda seçilen veya üzerinde bulunulan elemanın sıra numarasını öğrenmek için liste kutusu nesnesine ait ListIndex değişkeninden yararlanılır. Liste kutusunun üzerinde dolaştıkça ListIndex değişkenin içeriği otomatik olarak değişir. Seçili durumda olan liste kutusu elemanının sıra numarasını öğrenmek üzere Form_Click yordamına tek satırlık program kodu ekledim. Private Sub Form_Load() MsgBox (List1.Text) MsgBox (“Seçilen elemanın (List1.ListIndex)) sıra numarası :” & Val End Sub Visual Basic’te dizi değişkenlerinin ilk elemanlarının sıra numarası varsayım olarak 0 ‘dan başlamaktadır. Bu nedenle aşağıda verilen ekran görüntüsü sizi yanıltmasın. 269 Private Sub Form_Click() MsgBox("Sırano:"&Val(List1.ListI ndex)) End Sub Şekil 8.f-73 Liste kutusunda aynı anda birden fazla seçeneğin seçilip seçilemiyeceği liste kutusuna ait MultiSelect değişkenin içeriğine bağlıdır (Şekil 8.f-74). MultiSelect değişkeninin içeriği “0-None” ise liste kutusunda aynı anda ancak bir seçenek seçilebilir. MultiSelect değişkeni “1-Simple” değerine sahipken ok tuşları ile kutu içinde hareket etmenin bir etkisi olmaz. MultiSelect değişkenin içeriği “2Extend” iken liste kutusunda seçme işlemi Word, Excel ve diğer Windows uyumlu programlarda olduğu gibi Shift tuşu basılı tutulup seçenekler arasında hareket edilerek yapılır. Şekil 8.f-74 Normal şartlarda liste kutusuna AddItem methodu ile dahil edilen seçenekler liste kutusuna dahil edildikleri sırada gelirler. Eğer seçeneklerin liste kutusunda alfabetik sırada yer almaları isteniyorsa liste kutusuna ait Sorted değişkeninden yararlanılmalıdır (Şekil 8.f-75). Şekil 8.f-75 270 Sorted değişkeni başlangıçta False değerine sahiptir. Sorted değişkenin içeriği tasarım anında True olarak değiştirilirse seçenekler liste kutusu içinde sıralı bir şekilde dururlar. Sorted değişkenin içeriği çalışma anında değiştirilemez. Windows uyumlu diğer programlarda olduğu gibi bazen seçeneklerin iki veya daha fazla sütun halinde listelenmesi istenebilir. Bu durumda söz konusu liste kutusuna ait Columns değişkeninden yararlanılır (Şekil 8.f-76). Bu değişkenin içeriği varsayım olarak 0’ dır. Columns değişkeninin içeriği 2 olarak değiştirilirse liste kutusundaki seçenekler 2 sütun halinde görüntülenir. Ancak bu durumda liste kutusunun genişliği iki sütunun sığabileceği kadar olmalıdır. Şekil 8.f-76 Tek sütun olarak düzenlenen başka bir deyişle Columns değişkenin içeriği 0 olan liste kutularında sola ok tuşuna basıldığı zaman bir önceki, sağa ok tuşuna basıldığında ise bir sonraki seçeneğin üzerinde gidilmektedir. Columns değişkeninin içeriği 1 olarak değiştirilse bile liste kutusunda seçenekler yine yalnızca bir sütun olarak ekrana gelirler. Ancak bu durumda kullanıcı sağa ok tuşuna bastığında liste yukarı değil sol tarafa doğru kayar. Ayrıca Columns değişkeni 1 değerine sahipken liste kutusunun alt kenarına otomatik olarak yatay kaydırma çubuğu eklenir. Şekil 8.f-77 Liste kutusuna ait Text değişkeninin içeriği liste kutusunda seçim yapıldıkça veya liste kutusu içinde hareket edildikçe TextBox’a ait Text değişkenine aktarılır. Private Sub List1_Click() Text1.Text = List1.Text End Sub Liste kutusu üzerinde hareket edildikçe liste kutusuna ait Text değişkenin içeriği otomatik olarak değişmektedir. Bu özelliğinden yararlanan List1_Click yordamı sayesinde Liste kutusunda üzerinde bulunan seçenek TextBox nesnesine yazılır. 271 Private Sub List1_Click() Text1.Text List1.Text = End Sub Şekil 8.f-78 Bir liste kutusunda bulunan seçeneklerin veya elemanların sayısını öğrenmek için Liste kutusu nesnesine ait ListCount değişkeninden yararlanılır. ListCount değişkeni yalnızca çalışma anında tanımlı olabilmektedir. Liste kutusunda bulunan elemanlardan herhangi birinin seçili olup olmadığını öğrenmek için Selected değişkeninden yararlanılır. Sıra numarası Selected değişkenine parametre olarak verilen liste kutusu elemanı seçili durumda ise Selected değişkeninin içeriği True, değilse False olur. Private Sub Form_Click() MsgBox (List1.Selected (1)) End Sub Şekil 8.f-79 Bu sırada Visual Basic’te liste kutusu ve dizi de ğişkenlerde ilk elemanın sıra numarasının “0” olduğunu hatırlatmak gerekir. Selected değişkeni ile liste kutusunda herhangi bir eleman ın seçili olup olmadığını öğrenmenin yanında listelenen eleman seçili duruma getirilebilir veya seçili durumda olan bir elemanın seçili olma özelli ği kaldırılabilir. Aşağıda verilen program kodu ile liste kutusuna dahil edilen form yüklenir yüklenilmez liste kutusunun 3. eleman ı Selected değişkeni aracılığı ile seçili duruma getirilir. Private Sub Form_Click() List1.AddItem “Adana” List1.AddItem “Adana” List1.AddItem “Adana” List1.AddItem “Adana” List1.AddItem “Adana” List1.Selected(2) = True 272 End Sub Seçili duruma getirilmek istenen liste kutusu eleman ın sıra numarasını parametre olarak alan Selected dizi değişkenine True veya False mantıksal değerleri aktarır. Çalışma anında liste kutusuna eleman ekleme yanı sıra eleman silme gereği duyulabilir. Liste kutusunun herhangi bir elemanını çıkarmak için Removeltem metdodu kullanılır. RemovelItem metoduna liste kutusundan silinmek istenen elemanın sıra nosu parametre olarak verilir. Private Sub Çıkar_Click() List1.RemoveItem List1.ListIndex End Sub Liste kutusunda bulunan elemanları RemoveItem ile tek tek silmek yerine bütün elemanları bir seferde liste kutusundan silmek istiyorsanız Clear methodundan yararlanabilirsiniz. Clear methodundan önce elemanları silinmek istenen liste kutusunun adı yazılır. Private Sub Çıkar_Click() List1.Clear End Sub Eğer liste kutusu nesnesi içinde listelenen her seçeneğin bir onay kutusu ile temsil edilmesini istiyorsanız liste kutusunun nesnesinin Style özelliğinden yararlanmanız gerekir. Style özelliğine 1Checkbox değerini aktarırsanız liste kutusundaki her seçeneğin önüne küçük bir kare şekli eklenir. Şekil 8.f-80 a. Örnek / Liste kutusuna yatay hareket çubuğu eklemek Module Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long Const WM_USER = &H400 273 Const LB_SETHORIZONTALEXTENT = WM_USER + 21 Sub CheckListBox() Dim i%, res& Dim Scrollwidth& For i% = 0 To Form1.List1.ListCount If Form1.TextWidth(Form1.List1.List(i%)) > Scrollwidth& Then _ Scrollwidth& = Form1.TextWidth(Form1.List1.List(i%)) Next i% res& = SendMessage(Form1.List1.hWnd, LB_SETHORIZONTALEXTENT, Scrollwidth&, 0&) End Sub Form Private Sub Form_Load() CheckListBox End Sub b. Örnek / List kutusundan kayıt seçme 274 Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long,lParam As Any) As Long Private Const LB_FINDSTRING = &H18F Private Sub Text1_Change() List1.ListIndex=SendMessage(List1.hwnd,LB_FINDSTRING,-1,_ ByVal CStr(Text1.Text)) End Sub c. Örnek / ListBox’ta parça seçme Private Sub Command1_Click() Dim i As Integer For i = 0 To List1.ListCount - 1 If List1.Selected(i) Then MsgBox List1.List(i) & " seçildi" End If Next i End Sub 275 11. ComboBox (Açılan Liste Kutuları) Açılan liste kutuları normalde tek satır halinde gelirler. Forma eklenen ilk açılan liste kutusuna Combo1 adı verilir (Şekil 8.f-81). Açılan liste kutusu başlangıçta eleman içermediği için ayrıca varsayım olarak Combo1 adında bir eleman otomatik olarak kutuya eklenir. Seçili durumda olan elemanın içeriği Text adlı değişkende tutulur. Forma eklenen liste kutusunda herhangi bir değişiklik yapmadan bu şartlarda proje çalıştırılırsa, liste kutusunun henüz herhangi bir elemanı olmadığı için ekleme noktası liste kutusuna ait metin kutusunun içinde bilgi girişi için hazır olarak bekler. Şekil 8.f-81 Normal liste kutusunda olduğu gibi liste kutusuna seçenek dahil etmek için AddItem methodundan yararlanılır. Liste kutularında olduğu gibi ComboBox’ta seçili durumda olan eleman sürekli olarak ComboBox’a ait Text değişkeninde tutulur. Forma ComboBox nesnesi eklendiğinde başlangıçta Name değişkeni ile Text değişkenin içeriği aynıdır. Ancak tasarım veya çalışama anında Text değişkenin içeriği istenildiği gibi değiştirlebilir. Örnek olması için şehir adlarını içeren liste kutusunun Text değişkenine tasarım anında “Adana” bilgisini aktaralım. Şekil 8.f-82 Söz konusu açılan liste kutusunun dahil olduğu proje çalıştırıldığında liste kutusunda seçilen veya girişi yapılan elemanın yazıldığı yere otomatik olarak Text değişkenine tasarım anında aktarılan bilgi yazılır. 276 Şekil 8.f-83 Normal liste kutusunda olduğu gibi açılan liste kutusuna seçenek dahil etmek için AddItem methodundan yararlanılır. Çalışma anında forma eklediğimiz açılan liste kutusuna eleman aktarmak için aşağıda verilen program satırlarını hazırlayalım. Private Sub Form_Load() Combo1.AddItem "Adana" Combo1.AddItem "Ankara" Combo1.AddItem "Antalya" Combo1.AddItem "Aydın" End Sub . Şekil 8.f-84 Eğer kullanıcının çalışma anında liste kutusuna dışarıdan bilgi girmesini engellemek istiyorsanız, açılan liste kutusu nesnesine Style özelliğinden yararlanmanız gerekir Şekil 8.f-85 277 Forma yeni eklenen açılan liste kutusunun Style değişkeni “0-Dropdown Combo” sabit değerini içermektedir. ComboBox Style olarak 2-DropDown List seçilirse kullanıcı dışarıdan bilgi girişi yapamaz. Kullanıcı ancak ok tuşlarından yararlanarak liste kutusunun seçeneklerinden seçim yapabilir. Eğer Style değişkenine 1-Simple Combo değeri aktarılırsa liste kutusunu açan düğme iptal edilir. Bu durumda liste kutusunun elemanlarını açıp listelemek imkanı ortadan kalkar. Şekil 8.f-86 Kullanıcı bu açılma özelliği olmayan liste kutusunun diğer elemanlarını görmek istiyorsa, aşağı ve yukarı ok tuşlarını kullanmalıdır. İlk seçeneğin üzerinde iken yukarı oku işlevsizdir. 12. FileListBox (Dosya Listesi Nesnesi) Üzerinde çalışılan projenin aktif formuna Dosya listesi nesnesi eklemek için ToolBox penceresinden önce ilgili düğme seçili duruma getirilir. Forma eklenen Dosya listesi kutusu nesnesine tasarım anında bile aktif sürücünün aktif dizininde bulunan bütün dosyalar otomatik olarak yazılır (Şekil 8.f-87) Şekil 8.f-87 278 Forma eklenen ilk dosya listesine Visual Basic tarafından File1 adı verilir. Diğer nesnelerde olduğu gibi dosya listesi nesnesinin adı Name değişkeninde saklanılır(Şekil 8.f-88). Dosya Listesi nesnesinin dahil olduğu form çalışma anında aktive olduğunda dosya listesindeki ilk dosyanın etrafı küçük noktalarla çevrili durumda olur. Yani varsayım olarak başlangıçta hiçbir dosya seçili durumda değildir. Bu sırada kullanıcı ok tuşları ile veya fare ile kaydırma çubuğundan yararlanarak dosya listesi üzerinde dolaşabilir. Şekil 8.f-88 Dosya listesi kutusunda başlangıçta aynı anda yalnızca bir dosya seçili duruma getirilebilir. Seçili durumda olan dosyanın adı FileName adlı Dosya listesi nesnesine ait değişkende saklanır. Dosya Listesi üzerinde dolaştıkça FileName değişkenin içeriği otomatik olarak güncelleşir. FormName değişkenin işlevini göstermek için dosya listesi eklenen formun Form_Click yordamına aşağıda verilen program satırını ekleyelim. Private Sub Form_Click() MsgBox (“Seçili Durumdaki dosya :” & File1.filename) End Sub 279 Bu program satırı sayesinde çalışma anında formun üzerinde tıklama yapılınca MsgBox() fonksiyonu ile o sırada seçil durumda olan dosyanın adı ekrana yazılır. Şekil 8.f-89 FileName değişkeni ancak çalışma anında tanımlı olabilmektedir. Bu nedenle FileName değişkeni Properties penceresinde bulunmaz. Bildiğiniz gibi Properties penceresinde seçili durumda olan nesnenin içeriği tasarım anında değişebilen değişkenler bulunmaktadır. Dosya listesi kutusunda o anda geçerli olan sürücünün geçerli olan dizininde bulunan bütün dosyalar listelenmektedir. Yani ba şlangıçta listelenecek dosyalar konusunda bir ayrım veya seçim yapılamayacağı varsayılır. Listelenecek dosyaların seçimi işlemi için Liste kutusu nesnesine ait Pattern değişkeninden yararlanılır (Şekil 8.f-90) Şekil 8.f-90 Pattern değişkeninin başlangıçtaki içeriği bütün dosyalar anlamında “*.*” şeklindedir. Listelenecek dosyalar seçilirken joker karakterinden (* ve ?) yararlanılabilir. Properties penceresinde içeri ğini “*.jpg” olarak değiştirip projeyi çalıştırırsak Şekil 8.f-91’deki görüntüyü elde ederiz. 280 Şekil 8.f-91 Pattern değişkenin içeriğinde Properties penceresinde yapılan değişikliğin etkisi anında Forma eklenmiş dosya nesnesine yansır. Bunun dışında çalışma anında Pattern değişkenin içeriğini istediğiniz gibi değiştirebilirsiniz. Private Sub Form_Click() File1.Pattern = “*.*” End Sub Yukarıdaki sayfada Dosya Listesi nesnesinden seçilen dosyanın adının FileName değişkeninde tutulduğu belirtilmişti. Dosya seçimi kullanıcı tarafından anında yapılabildiği gibi program kodu ile yapılabilir. Private Sub Form_Click() File1.Pattern = “*.DLL” End Sub Dosya liste kutusunun hemen üstüne bir TextBox nesnesi konulur. Bu Textbox’a girilen bilgi FileName de ğişkenine aktarılır. TextBox’a girişi yapılan dosya adı ve uzantısının FileName değişkenine aktarılması halinde Dosya Listesi kutusunda listelenen dosyalar FileName değişkeninin yeni içeri ğine göre seçilir. TextBox’a girilen dosya ad ı uzantısını FileName değişkenine aktarmak için KeyPress olayından yararlanılır. Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then File1.filename = Text1.Text End If End Sub Listelenecek dosyaların adı ve uzantısı TextBox’ a girilip enter tuşuna basılana kadar FileName değişkenine aktarılmaz. KeyPress olayı yerine LostFocus olayından da yararlanabilir. Text1 adlı TextBox’ın içeriği File Name değişkenine aktarılabilir. Text1 adlı TextBox’tan tab tuşu ile ayrılınca LostFocus olayı meydana gelir. Bu sırada TextBox’ın içeriği FileName değişkenine aktarılır. Private Sub Text1_LostFocus() File1.filename = Text1.Text End Sub 281 Şekil 8.f-92 Hazırlanan dosya listesi nesnesine hangi özelliğe sahip dosyaların dahil edileceği Normal, Archive, System, ReadOnly ve Hidden değişkenlerinin içeriğine bağlıdır. Başlangıçta Normal ve Archive değişkenleri True, diğerleri False değerini içerir. Gizli dosyaların da listelenmesini istiyorsanız Hidden değişkenine True değerini aktarmalısınız (Şekil 8.f-93). Şekil 8.f-93 Hangi dizinin aktif dizin olduğu konusunda bilgi Dosya Listesi nesnesine ait Path değişkeninden sağlanır. Path değişkeni ancak çalışma anında tanımlı olabilir. Private Sub Form_Click() MsgBox (“Geçerli sürücü ve dizin :” & File1.Path) End Sub Liste kutularında olduğu gibi Dosya Listesi kutularında bulunan dosyalardan varsayım olarak yalnızca biri seçili duruma getirilebilir. Eğer aynı anda birden fazla dosyanın seçilebilmesi isteniyorsa dosya listesi nesnesine ait MultiSelect değişkeninden yararlanılmalıdır (Şekil 8.f-94). Dosya listesi kutusunda listelenen dosyaların sayısı ListCount değişkeninde saklanır. Bu değişkenin içeriği dosya listeleme kriterleri değiştikçe otomatik olarak güncelleşir. 282 Şekil 8.f-94 a. Örnek / Dosya Silme Private Sub DeleteFilesinDirectory() Dim t% If File1.ListCount - 1 = 0 Then List1.Clear For t% = 0 To File1.ListCount File1.ListIndex = t% File1.Selected(t%) = True List1.AddItem File1 Next t% Dim antwoord antwoord = MsgBox("Are you sure If antwoord <> 6 Then Exit Sub For t% = List1.ListCount - 1 To List1.ListIndex = t% List1.Selected(t%) = True Kill Dir1 & "\" & List1 283 Exit Sub 1 about this?", 36) 0 Step -1 Next t% End Sub Private Sub Dir1_Change() File1 = Dir1.Path Call DeleteFilesinDirectory End Sub Private Sub Drive1_Change() Dir1 = Drive1 End Sub 13. DirListBox (Dizin Listesi Kutusu) Dosya listesinden başka bir de dizin kutusu vardır. Visaul Basic uygulamaları dahilinde formlara dizin listesi dahil edilebilir. Bu amaçla ToolBox’tan ilgili düğme seçilir. Tasarım anında forma eklenen Dizin Listesi kutusuna otomatik olarak geçerli dizinin adı, alt dizinleri ile birlikte ekrana getirilir. Forma eklenen ilk dizin nesnesine Dir1 adı verilir. Eğer dizinde çok sayıda alt dizin varsa ve bu dizinlerin hepsi bir seferde dizin kutusuna sığmıyorsa, dizin listesi kutusunun sağ kenarına otomatik olarak bir düşey kaydırma çubuğu eklenir. Şekil 8.f-95 Seçili durumda olan dizinin adı dizin listesine ait Path değişkeninde saklanır. Ancak programın çalışması sırasında tanımlı olabilen Path değişkenin içeriğinin program kodu yazılarak değiştirilmesi halinde dizin listesi kutusunun içeriği kendiliğinden güncelleşir. Dizin listesi nesnesinin üzerinde çift tıklama yapılarak Dizin Listesi nesnesine ait Path değişkeninde değişiklik yapma işlemi sırasında Change olayı meydana gelir. Dizin listesi nesnesine ait Path değişkeninin içeriği Change olayı meydana geldiğinde söz konusu TextBox’a aktarılır. 284 Private Sub Dir1_Change() Text1.text = Dir1.Path End Sub Change olayı meydana geldikçe Path özelliğinin içeriği otomatik olarak değişmektedir. Bu sırada dizin listesi nesnesine ait Path özelliğinin içeriği geçerli dizini göstermek için formdaki TextBox’a aktarılır. Şekil 8.f-96 Bunun için yine Dizin listesine ait Change olayından yararlanılır. Private Sub Dir1_Change() File1.Path = Dir1.Path Text1.text = Dir1.Path End Sub a. Örnek / Dosya sayma 285 Private Sub Command1_Click() stijd = Time List1.Clear List2.Clear Dir1.Path = Left$(Drive1.Drive, 2) + "\" File1.Path = Dir1.Path ' "C:\" For t& = 0 To File1.ListCount - 1 If Right$(Dir1.Path, 1) <> "\" Then List2.AddItem Dir1.Path + "\" + File1.List(t&) Else List2.AddItem Dir1.Path + File1.List(t&) End If Next For t& = 0 To Dir1.ListCount - 1 List1.AddItem Dir1.List(t&) Next If t& = 0 Then GoTo finishedpoint cnt& = 0 startpoint: Dir1.Path = List1.List(cnt&) File1.Path = Dir1.Path For t& = 0 To Dir1.ListCount - 1 List1.AddItem Dir1.List(t&) Next For t& = 0 To File1.ListCount - 1 List2.AddItem Dir1.Path + "\" + File1.List(t&) Next cnt& = cnt& + 1 If cnt& < List1.ListCount Then GoTo startpoint finishedpoint: Label1.Caption = "Total:" + Str$(List2.ListCount) etijd = Time Label2.Caption = "Time slipped away... Started at " & 286 Format(stijd, "hh:mm:ss") & ". Ended after " & Format(stijd etijd, "hh:mm:ss") End Sub 14. DriveListBox (Sürücü Listesi Nesnesi) Sürücü listesi nesnesinden yararlanarak Dizin ve Dosya Listesi nesneleri için geçerli olmak üzere sürücü seçimi yapılabilir. Üzerinde çalışılan aktif formuna sürücü listesi eklemek için geçerli olmak üzere sürücü seçimi yapılabilir. Forma eklenen ilk Sürücü Listesi nesnesine Drive1 adı verilir. Sürücü listesi nesnesi aç ılan liste kutusu görünümündedir. O anda geçerli olan sürücünün ad ı tasarım anında bile sürücü listesi kutusuna otomatik olarak yazılır. Şekil 8.f-97 Seçili durumda olan sürücünün adı Sürücü listesi nesnesine ait Drive değişkeninde saklanır. Sürücü nesnesinde değişiklik yapıldığında yani Change olayı meydana geldiğinde nesneye ait Drive değişkeninin içeriği Dizin Listesi nesnesinin Path değişkenine aktarılır. Sürücü listesi nesnesinin Dizin Listesi nesnesi ile birlikte çalışması sağlanır. Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub Örnek 287 Option Explicit Private Sub File1_Click() Dim Dosya_Adı As String On Error GoTo Hata Dosya_Adı = File1.Path + "\" + File1.filename Caption = "İzleme [" & Dosya_Adı & "]" MousePointer = vbHourglass DoEvents Image1.Picture = LoadPicture(Dosya_Adı) MousePointer = vbDefault Exit Sub Hata: Beep MousePointer = vbDefault Caption = "İzleme [Geçersiz resim]" Exit Sub End Sub Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Drive1_Change() 'On Error GoTo DriveError Dir1.Path = Drive1.Drive Exit Sub DriveError: Drive1.Drive = Dir1.Path Exit Sub End Sub Private Sub Form_Load() Combo1.AddItem "Bitmaps (*.bmp)" 288 Combo1.AddItem "GIF (*.gif)" Combo1.AddItem "JPEG (*.jpg)" Combo1.AddItem "Icons (*.ico)" Combo1.AddItem "Matafiles (*.wmf)" Combo1.AddItem "DIBs (*.dib)" Combo1.AddItem "Graphic (*.gif;*.jpg;*.ico;*.bmp;*.wmf;*.dib)" Combo1.AddItem "All Files (*.*)" Combo1.ListIndex = 0 End Sub Private Sub Form_Resize() Const GAP = 60 Dim wid As Integer Dim hgt As Integer If WindowState = vbMinimized Then Exit Sub wid = Drive1.Width Drive1.Move GAP, GAP, wid Combo1.Move GAP, ScaleHeight - Combo1.Height, wid hgt = (Combo1.Top - Drive1.Top - Drive1.Height - 3 * GAP) / 2 If hgt < 100 Then hgt = 100 Dir1.Move GAP, Drive1.Top + Drive1.Height + GAP, wid, hgt File1.Move GAP, Dir1.Top + Dir1.Height + GAP, wid, hgt End Sub Private Sub combo1_Click() Dim pat As String Dim p1 As Integer Dim p2 As Integer pat = Combo1.List(Combo1.ListIndex) p1 = InStr(pat, "(") p2 = InStr(pat, ")") File1.Pattern = Mid$(pat, p1 + 1, p2 - p1 - 1) End Sub Örnek / Dosya seçme 289 Declare Function YolAd Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long Private Sub Dir1_Change() File1 = Dir1.Path End Sub Private Sub Drive1_Change() Dir1 = Drive1 End Sub Private Sub File1_Click() Label1.Caption = DosyaAd(Dir1 & "\" & File1) End Sub 290 Public Function DosyaAd(ByVal FileName As String) As String Dim rc As Long Dim ShortPath As String Const PATH_LEN& = 164 ShortPath = String$(PATH_LEN + 1, 0) rc = YolAd(FileName, ShortPath, PATH_LEN) DosyaAd = Left$(ShortPath, rc) End Function 15. Picture Box Kontrolü Nasıl ki Formlara eklenen TextBox nesnesine tasarım veya çalışma anında metin veya text girişi yapılıyorsa, Picture Box’lara ise önceden hazırlanıp hard diske kaydedilmiş olan resimlerin aktarılması işlemi yapılır. Visual Basic uygulamaları dahilinde Formlara eklenen resim kutularına BMP, WMF, ICO ve DIB uzantılı resim dosyaları dahil edilmektedir. Ayrıca resim kutusu içinde Line ve Shape kontrollerine yer verilebilir. Bir forma eklenen ilk resim kutusuna Picture1 adı verilir. Diğer nesnelerde olduğu gibi Picture Box’ın adı Picture Box’a ait Name değişkeninde saklanır (Şekil 8.f-98). Şekil 8.f-98 Resim kutusunun Form üzerindeki konumu ve boyutları tasarım anında fare ile belirlenebilir. Ancak diğer nesnelerde olduğu gibi Properties penceresinden yararlanarak resim kutularının boyutlarını değiştirebilirsiniz. Resim kutusunun genişliği Width, yüksekliği Height, Formun üst kenarına uzaklığı Top ve sol kenarına uzaklığı ise Left değişkeni ile belirlenir. Resim kutusuna ait Align değişkeninden istifade ile resim kutusunun yerini belirleyebilirsiniz (Şekil 8.f-99). 291 Şekil 8.f-99 Üzerinde çalışılan projenin aktif formuna bir resim kutusu nesnesi eklendiği zaman resim kutusuna ait Align değişkenine varsayım olarak 0-None değeri aktarılır. Yani başlangıçta resim kutusu formun herhangi bir tarafına hizalanmaz. Resim kutusu nesnesine ait Align değişkenine 1-Align Top değeri aktarılacak olunursa resim kutusu formun hem üst kenarına yanaştırılır hem de resim kutusunun genişliği ile Formun genişliği birbirine eşitlenir. Align değişkenine 2-Alig Bottom değeri aktarılırsa resim kutusu formun alt kısmına alınır. Tasarım anında formdaki resim kutusu nesnelerine hard diskten resim dosyası eklemek için Properties penceresinde Picture değişkeninden yararlanılır. Başlangıçta bu değişkenin içeriği boştur ve resim kutusu nesnesi resim dosyası içermez (Şekil 8.f-100). Şekil 8.f-100 Properties penceresinde ışıklı bant Picture özelliğinin üzerinde iken üç nokta (...) bulunan düğmede tıklama yapılınca resim kutusu nesnesine eklenebilecek resim dosyalarının seçildiği Load Picture diyalog kutusu ekrana gelir. Bu diyalog kutusunda bulunan bilgisayarda bulunan WMH, BMP ve ICO uzantılı resim dosyalarından istenen seçilebilir. Resim kutularına tasarım anında Properties penceresinde resim dosyası dahil edildiği gibi, çalışma anında program kodu yazılarak istenen resim dosyasının içeriği Resim kutusu nesnesinin Picture değişkenine aktarılır. Bunun için LoadPicture deyiminden yararlanılır. LoadPicture deyimi ile hard diskten resim kutusuna aktarılmak istenen resim dosyası okunup resim kutusu nesnesine ait Picture değişkenine aktarılır. Private Sub Form_Click() Picture1.Picture =LoadPicture (“C:\VB5\Graphics\Icons\Elements\Sun.Ico 292 End Sub Şekil 8.f-101 Eğer resim kutusunun boyutlarının, kutuya dahil edilen resim dosyasının büyüklüğüne bağlı olarak otomatik belirlemesini istiyorsanız resim kutusuna ait AutoSize değişkeninin içeriğini True yapmalısınız (Şekil 8.f-101). Üzerinde çalışılan forma eklenen resim kutularının çevresi varsayım olarak tek çizgi ile çevrilir. Eğer resim kutusunun çevresine çizgi çizmek istemiyorsanız resim kutusu nesnesine ait BorderStyle değişkenine 0-None değerini aktarmalısınız (Şekil 8.f-102). Şekil 8.f-102 Kullanıcı çalışma anında dosya listesinde içeriğini görmek istediği dosyayı seçince söz konusu resim dosyasının içeriği resim kutusunda görüntülenecek. Sürücü, Diziz ve Dosya listesi nesneleri arasında nasıl bağlantı kurulduğunu daha önceden biliyorsunuz. Burada yeni şey Dosya listesinden seçilen resim dosyasının LoadPicture fonksiyonu ile diskten okunup resim kutusuna ait Picture değişkenine aktarmaktır. Dosya listesinde, resim kutusu içinde görüntülenemeyecek resim dosyalarının listelenmesini önlemek için projenin Formu yüklenir yüklenilmez dosya listesi nesnesine ait Pattern değişkenin içeriği aşağıda şekilde değiştirilir. 293 Private Sub Form_Load() File1.Pattern = “*.BMP; *.ICO; *.WMF” End Sub Dosya listesinde listelenen herhangi bir dosyanın seçilmesi veya üzerinde tıklama yapılması halinde söz konusu dosyanın diskten okunup resim kutusu nesnesine ait Picture değişkenine aktarılmasını sağlamak için File1_Click yordamı aşağıdaki şekilde düzenlenir. Private Sub File1_Click() Picture1.Picture = LoadPicture ( File1.Path + “\” + File1.filename) End Sub Bu değişiklikten sonra proje çalıştırılıp dosya listesindeki dosyalar üzerinde dolaştıkça ilgili resim dosyanın içeriği resim kutusu nesnesi içinde görüntülenir. Şekil 8.f-103 Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub Private Sub Form_Load() File1.Pattern = "*.*" End Sub Resim kutularına Print methodu ile yazı yazılabilir, Line, Pset, Cls ve Circle gibi formlara uygulanabilen methodlarla çizgi veya daire çizilebilir, kutunun içeriği silinebilir. Private Sub Form_Click() Picture1. DrawWidth =2 Picture1.Line – (3000,2000) End Sub 294 Yukarıda verilen program kodu ile çalışma anında Picture1 adlı resim kutusunun üzerinde tıklama yapılması halinde resim kutusunun bir köşesinden diğer köşesine doğru çizgi çizilir. Line veya Circle metotları ile resim kutusuna çizilen çizgi veya daireler Cls metodu ile silinebilir. Cls metodu resim kutusuna dahil edilmiş olan ikon veya meta file dosyaları üzerinde etkili olmaz. Resim kutusuna dahil edilmiş olan resim veya resim kutusuna ait Picture değişkenin içeriğini silmek için yine LoadPicture fonksiyonundan yararlanılabilir. Private Sub Form_Click() Picture1. Picture = LoadPicture(“”) End Sub Forma yerleştirmiş olduğunuz resim kutusu nesnesine Panonun içeriğini aktarmak istiyorsanız GetData methodundan yararlanabilirsiniz. 16. Image Kontrolü Resim kutusuna dahil edilen resim dosyasının orijinal boyutları resim kutusundan küçük olduğu zaman resim kutusunun üzerinde boşluklar meydana gelir. Image kontrolü ile programc ıya resim dosyalarını kullanmada daha fazla esneklik sunulmaktadır. Diğer kontrollerde olduğu gibi üzerinde çalışılan forma bir image nesnesi eklemek için ToolBox penceresinde bu nesneyi temsil eden dü ğme seçili duruma getirilir. Şekil 8.f-104 295 Bir forma eklenen ilk image nesnesine varsay ım olarak “Image1”” adı verilir (Şekil 8.f-104). Programcı tasarım anında bu adı istediği gibi değiştirebilir. Formun Image nesnesi ile sınırlanan kısmında görüntülenecek dosyanın içeriği nesneye ait Picture de ğişkeninde saklıdır. Programcı resim kutusu nesnesinin tersine, Image nesnesinin boyutlar ını kendisine eklenen resim dosyası ile birlikte değiştirebilir. Bunun için önce image nesnesine ait Stretch değişkenine True değerinin aktarılması gerekir (Şekil 8.f-105). Şekil 8.f-105 Image nesnesine ait Stretch değişkeninin içeriği True iken çalışma anında program kodu yazılarak nesnenin boyutlarında yapılan değişikliklerden, nesneye dahil olan image veya resim dosyas ı da etkilenir (Şekil 8.f-106). Şekil 8.f-106 Private Sub Form_Click() Image1.Width = Image1.Width + 100 Image1.Height = Image1.Height + 100 End Sub Bir forma aynı anda birden fazla Image nesnesi eklenebildiği gibi bu nesnelerin üst üste gelmeleri sağlanabilir (Şekil 8.f-107). Private Sub Form_Click() Image2.Left = Image2.Left -150 Image2.Top = Image2.Top - 100 296 End Sub Şekil 8.f-107 17. Line Kontrolü Line nesnesi ile formlara daha önceden eklenmiş olan resim kutusu, Image gibi nesnelerin üzerinde çizgi çizilir. Üzerinde çalışılan projenin aktif formuna veya formdaki diğer nesnelerin üzerine düz çizgi koymak için TollBox penceresinde Line kontrolünden yararlanılır Forma eklenen ilk çizgiye Line1 adı verilmektedir. Forma eklenen çizginin kalınlığı Line nesnesine ait BorderWidth değişkeni ile belirlenir. Çalışma anında Forma dahil edilen Line nesnesinin yeri değiştirilebilir. Line nesnesinin iki ucunun koordinatları nesneye ait (X1,Y1) ve (X2,Y2) değişkenlerinde saklanmaktadır. Çizgilerin renkleri BorderColor değişkeni ile belirlenir (Şekil 8.f-108). 297 Şekil 8.f-108 Line nesnesi için önceden tanımlı olan hiçbir olay veya Event yoktur. Bu nedenle kod penceresinde o anda seçili durumu olan formda Line nesnesi olsa bile Line nesnesinin adı yer almaz. 18. Shape Kontrolü Formlara dikdörtgen, kare, daire ve elips gibi geometrik şekiller eklemek için Shape denetiminden yararlanılır. Shape nesneleri sürekli olarak düğmelerin ve onay kutularının altında kalmaktadır. Bir forma Shape nesnesi eklemek için ToolBax penceresinde Shape nesnesini temsil eden düğme seçili duruma getirilir. Forma eklenen ilk Shape nesnesine varsayım olarak Shape1 adı verilir (Şekil 8.f-109). Şekil 8.f-109 Forma eklenen Shape nesnesinin türü nesneye ait Shape değişkeni ile belirlenmektedir. Shape değişkeni başlangıçta dikdörtgen anlamında “0-Rectangle” değerini içermektedir. Forma kare şekli için Shape nesnesi eklediyseniz tasarım anında Shape değişkenine “1-Square” değerini eklemeniz gerekir (Şekil 8.f-110). 298 Şekil 8.f-110 Forma eklenen Shape nesnesinin çizgi kalınlığı Properties penceresinde bulunan BorderWidth değişkenine sayısal değer girilerek sağlanır. BorderWidth ‘in başlangıçtaki sayısal değeri 1 dir BorderColor değişkeni ile de çizgiye istenilen renk verilir.(Şekil 8.f-111). Şekil 8.f-111 Aşağıdaki program forma eklenen shape nesnesine ait şekilleri sıra ile göstermektedir. Private Sub Form_Click() If Shape1.Shape < 5 Shape1.Shape = Shape1.Shape + End If End Sub 19. Timer Kontrolü 299 1 Çalışma anında bazı işlemlerin belli zaman aralıkları ile tekrarlanması istenir. Örneğin ekranda sistem saatini sürekli göstermek için Time fonksiyonu kullanılırken en azından her dakikada bir sistem saati okunmalıdır. Bu ve benzeri durumlar için Timer kontrolünden yararlanılır. Çalışma anında bazı işlemlerin belli zaman aralıkları ile tekrarlanması istenir. Örneğin ekranda sistem saatini sürekli göstermek için Time fonksiyonu kullanılırken en azından her dakikada bir sistem saati okunmalıdır. Bu ve benzeri durumlar için Timer kontrolünden yararlanılır. Timer kontrolü Visual Basic tarafından otomatik olarak projeye dahil edildiği için ToolBox penceresinde üzerinde saat olan düğme seçili durumda iken üzerinde çalışılan projenin aktif formuna Timer nesnesi eklenebilir. Tasarım anında Timer nesnesinin form üzerindeki boyutu sabittir. Timer nesnesi çalışma anında formun üzerinde yer almaz. Forma eklenen ilk Timer nesnesine Timer1 adı verilmektedir (Şekil 8.f-112). Şekil 8.f-112 Timer nesnesinin tek en önemli özelliği Interval’ dir. Başlangıçta Interval değişkeni 0 değerine sahip olduğu için Timer nesnesi işlevsiz olur. Interval değişkenine aktarılan bilgi Milisaniye cinsindendir Properties penceresinde Timer nesnesine ait Interval değişkenin içeriğini 1000 yapıp örnek projeyi çalıştırırsak çalışan saat elde ederiz. Private Sub Timer_Timer() Text1.text = Time End Sub 300 20. UpDown (Spin) Kontrolü TextBox’ların hemen bitişiğinde üzerinde birinin ucu yukarı, diğerinin ucu aşağı bakan iki küçük düğme vardır (Şekil 8.f-113).. Bu düğmelerin ikisine birden Spin adı verilmektedir. TextBox’a klavyeden yararlanarak istediğiniz gibi sayısal bilgi girebilirsiniz. Ancak isterseniz sayısal bilgi girişi yapılabilen bu TextBox’ların içeriğini TextBox’ın hemen yanındaki Spin’lerden yararlanarak değiştirebilirsiniz. Üzerinde ucu yukarı bakan ok işareti olan düğmede tıklama yapılınca TextBox’ın içerdiği sayıda artma olur. Ucu aşağıya bakan düğmede tıklama yapılınca bu kez TextBox’ın içerdiği sayıda azalma olur. Şekil 8.f-113 Visual Basic projeleri dahilinde benzer işleve sahip TextBox hazırlamak mümkündür. Bunun için COMCT232.OCX adlı özel kontrol dosyasından yararlanılır. Şekil 8.f-114 301 Bu özel kontrol dosyasını üzerinde çalıştığınız projeye dahil etmek istiyorsanız Project menüsündeki Components komutunu verip ekrana Components diyalog kutusunu getirip Microsoft Windows Common Controls-2 adlı özel kontrol dosyasını seçili duruma getirmeniz gerekir. ToolBox penceresine Animation ve UpDown kontrollerini temsil eden iki düğme eklenir. ToolBox penceresinde UpDown kontrolünü temsil eden düğme seçili durumda iken forma UpDown nesnesi yerleştirilebilir. Forma eklenen ilk UpDown nesnesine “UpDown1” adı verilmektedir. UpDown nesnesi ancak bir TextBox ile kullanıldığı zaman işlevseldir. Bu nedenle örnek olması için her Spinden önce bie TextBox nesnesini forma ekleyelim UpDown, TextBox’ın istenen yerine konulabilir. Şekil 8.f-115 Spin’in üzerinde ucu yukarı bakan ok işareti olan düğmesinde tıklama yaparsa UpClick, ucu aşağı bakan düğmede tıklama yaparsa DownClick playı meydana gelir. Bu olaylardan yararlanarak TextBox’ın içeriği değiştirilir. Private Sub UpDown1_UpClick() Text1.Text = Text1.Text + 0.2 End Sub UpDown kontrolü ile metin kutusu arasında bağlantı kurmak yerine bu işlemi program kodu yazmadan Visual Basic tarafından otomatik olarak yapılmasını sağlayabilirsiniz. Bu amaçla UpDown nesnesinin Buddy Control özelliğinden yararlanılmaktadır (Şekil 8.f-116). Şimdi örnek olması için üzerinde çalıştığımız projenin formuna eklemi ş olduğuz iki UpDown nesnesi ile formdaki metin kutuları arasında bağlantı kuralım. Bu amaçla Properties penceresinde UpDown1 nesnesinin özellikleri varken BuddyControl özelli ğine forma yerleştirmiş olduğuz ilk metin kutusunun adını yazalım. Şekil 8.f-116 Ardından UpDown nesnesinin SyncBuddy özelliğine True değerini aktaralım (Şekil 8.f-117). Bu iki işlemden sonra UpDown nesnesi ile Text1 nesnesi arasında bağlantı işlemi tamamlanmış olur. 302 Çalşma anında UpDown nesnesinin üst düğmesinde tıklama yaparsanız TextBox nesnesinin içeriği 1 artar, alttaki düğmede tıklama yaparsanız bu kez 1 azalır. TextBox’ın içeriğinin ne kadar artacağını Increment özelliğinden yararlanarak belirleyebilirsiniz (Şekil 8.f-118). Şekil 8.f-117 Şekil 8.f-118 Diğer yandan Properties penceresinde UpDown nesnesine ait Custom özelliğinden yararlanarak UpDown nesnesinin bazı özelliklerini bir diyalog kutusunda değiştirebilirsiniz. Şekil 8.f-119 Property diyalog kutusunda UpDown nesnesine ait özellikler 3 ayrı sekmeye ayrılmış durumdadır. 303 Şekil 8.f-120 UpDown nesnesi ve başka nesneler arsında bağlantı kurulurken Buddy sekmesindeki seçeneklerden yararlanılmaktadır. Şekil 38-9’da verilen ekran görüntüsünde UpDown nesnesi ile Text1 adında metin kutusu arasında bağlantı kurulmuştur. TextBox veya Label nesnesine UpDown nesnesi yardımı ile aktarılacak değerler konusunda ayarlama yaparken Scrolling sekmesindeki seçeneklerden yararlanılmaktadır (Şekil 8.f-120). TextBox’a aktarılmasına izin verilecek en küçük ve en büyük değer Min ve Max özellikleri ile belirlenir. Increment özelliği ile artırma ve azaltma miktarını belirlenmektedir. 21. Slider Kontrolü Slider kontrolünü temsil eden düğme seçili durumda iken formun üzerine istediğiniz boyutta Slider nesnesi yerleştirebilirsiniz. Forma yerleştirilen ilk Slider nesnesine “Slider1” adı verilemektedir. Şekil 8.f-121 Windows 98 ile birlikte verilen sesleri kaydetmek üzere verilen Media Player programı gibi bu ve benzeri işlemler için Slider kontrolnden yararlanabilirsiniz. Slider kontrolü Visual Basic tarafından projelere dahil edilmediği için Project menüsündeki Components komutu ile ekrana getirilen Components diyalog kutusunda Microsoft Windows Common Controls 6.0 adındaki özel kontrol dosyası projeye dahil edilir (Şekil 8.f-122). 304 Şekil 8.f-122 Forma yerleştirilen Slider nesnesi başlangıçta 10 eşit parçaya bölünmüş durumdadır. Ayrıca Slider nesnesinin Max ve Min değerleri bulunmaktadır (Şekil19-123). Slider nesnesinin Max ve Min değerlerini Properties penceresinde tasarım anında belirlemek yerine program kodu yazarak çalışma anında gelişen şartlara bağlı olarak belirliyebilirsiniz. Bunun dışında ucu aşağıya bakan büyükçe ok işaretinin yerini Slider nesnesinin Value özelliği yardımıyla izleyebilirsiniz (Şekil 8.f-124). Şekil 8.f-123 Fare ile Slider nesnesinin düğmesini hareket ettirdikçe Value değişkeninin içeriği değişir. Value değişkeninin içeriğini tasarım anında Properties penceresinde veya program kodu yazarak değiştirebilirsiniz. Fare ile Slider nesnesinin düğmesinde değişiklik yaptıkça Change olayı meydana gelir. 305 Şekil 8.f-124 Şimdi Slider kontrolünün işlevini basit bir şekilde anlatmak için üzerinde çalışılan projenin formuna bir Picture Box nesnesi yerleştirelim. Ayrıca Picture Box nesnesi için resim dosyası seçimi yapalım. Şekil 8.f-125 Properties penceresinde Slider nesnesine ait Value değişkenine 5 değerini aktararak düğmenin başlangıçta nesnenin tam ortasında yer almasını sağlayalım. Çalışma anında Slider nesnesinin düğmesi sağa doğru hareket ettirildiği zaman Picture Box nesnesinin boyutları büyüyecek sola hareket ettirildiği zaman ise küçülecektir. Private Sub Slider1_Change() Picture1.Width = Picture1.Width * Slider1.Value /5 Picture1.Height = Picture1.Height * Slider1.Value /5 If Picture1.Width > 4500 Then Picture1.Width = 4500 Picture1.Height = 2775 End If If Picture1.Width < 1000 Then Picture1.Width = 1000 Picture1.Height = 800 End If End Sub 306 22. SSTab Kontrolü Son yıllarda piyasaya verilen programlarda çok sayıda seçenek içeren diyalog kutularında, aynı anda bütün seçenekleri görüntüleme imkanı olmadığı için, diyalog kutusunun seçenekleri birden fazla sayfaya veya sekmeye ayrılmaktadır. Şekil 8.f-126 Birden fazla sekme veya sayfaya sahip diyalog kutusunu hazırlamak için Tabbed Dialog kontrolünden yararlanılmaktadır. Components diyalog kutusunda Tabbed Diyalog kontrolünü seçili duruma getirip Tamam düğmesinde tıklama yaparsanız Tabbed Diyalog kontrolü projeye dahil edilir ve Toolbox penceresinde bir düğme ile temsil edilir (Şekil 8.f-126). Şekil 8.f-127 307 Tooloox’ta SSTab düğmesi seçili durumda iken forma istediğiniz boyutta ve başlangıçta 3 sekmeye sahip SSTab nesnesi dahil edebilirsiniz. Forma bu şekilde dahil edilen SSTab nesnesinde varsayım olarak Tab 0, Tab 1 ve Tab 2 adında 3 sekme bulunmaktadır. ToolBox’ta SSTab düğmesi seçilli durumda iken formun üzerinde istediğiniz boyutta ve başlangıçta 3 sayfaya veya sekmeye sahip SSTab nesnesi dahil edebilirsiniz. SSTab nesnesinde yer alacak sayfaların sayısı nesnenin Tabs özelliğinden yararlanılarak belirlenir. Şekil 8.f-128 TabsPerRow değişkenine de aynı değer aktarılır. Bu sırada hangi sekmede tıklama yaparsanız o sekme geçerli olur. Program kodu kullanarak da sekmeleri seçebiliriz. Bu sırada hangi sekmede tıklama yaparsanız o sekme geçerli sekme olur. Şekil 8.f-129’da verilen ekran görüntüsünde çalışma anında “Tab 1” adlı sekmenin üzerinde tıklama yaptıktan sonra alınmıştır. Şekil 8.f-129 Seçili durumda olan sekmenin sıra numarası SSTab nesnesine ait Tab değişkenine aktarılmaktadır. Çalışma anında fare ile sekmelerin arasında dolaşıldıkça Tab değişkeninin içeriği otomatik olarak değişir. Private Sub Form_load() SSTab1.Tab =1 End Sub 308 Properties penceresinden yararlanarak sekmelere varsayım olarak verilen Tab 1, Tab 2 şeklindeki başlıkları değiştirebilirsiniz. SSTab nesnesinin hangi nesnesinin başlığında veya Caption özelliğinde değişiklik yapmak istiyorsanız SSTab nesnesinde o sekmenin üzerinde tıklama yapıp seçili duruma getirmeniz gerekir. Şekil 8.f-120’de verilen ekran görüntüsünü tasarım anında ikinci sekmeyi seçili duruma getirip Caption özelliğinde değişiklik yaptıktan sonra alınmıştır. Şekil 8.f-120 Forma eklemiş olduğunuz SSTab nesnesinin özelliklerini belirlerken Properties penceresindeki Custom özelliğinden yararlanabilirsiniz (Şekil 8.f-121). Işıklı bant Custom özelliğinin üzerinde iken özelliğe ait metin kutusunun sonuna üzerinde üç nokta bulunan bir düğme eklenir. Şekil 8.f-121 Custom özelliğine ait metin kutusunun sonuna eklenen düğmede tıklama yapacak olursanız SSTab nesnesinin özelliklerinde değişiklik yapılabilen Properties Pages diyalog kutusu ekrana gelir. Bu diyalog kutusunda SSTab nesnesi ile ilgili olarak yapılabilen seçim ve ayarlamalar General, Color, Font ve Picture adında 4 sekmeye ayrılmış durumdadır (Şekil 8.f-122). 309 Şekil 8.f-122 General sekmesindeki seçeneklerle SSTab nesnesinde bulunacak sekmelerin say ısını, her satırda kaç sekmenin yer alacağını veya sekme başlıklarını belirliyebilirsiniz. Style liste kutusundan yararlanarak sekmelerin biçimini de ğiştirebilirsiniz. Şekil 8.f-123’de verilen ekran görüntüsünü Style liste kutusu açtıktan sonra alınmıştır. Şekil 8.f-123 Verilen ekran görüntüsünden SSTab nesnesi ile iki ayr ı tipte sekme hazırlamak mümkündür. görüntüsünü Style liste kutusundan ssStyle Property Page sekme tipini seçildikten sonra al ınmıştır. 310 Şekil 8.f-124’de verilen ekran Şekil 8.f-124 SSTab nesnesinin Style özelliğini değiştirmek için Custom diyalog kutusundan yararlanmak yerine Properties penceresinden de yararlanabilirsiniz. Sekmeler SSTab nesnesine ayr ılan alanın üst kısmında tutulmaktadır. Ancak isterseniz sekmelerin SSTab nesnesine ayr ılan alanın alt kenarına,sağ veya sol tarafında olmasını sağlayabilirsiniz. Bu amaçla Custom diyalog kutusunda Orientation liste kutusundan yararlanabilirsiniz. SSTab nesnesinin Orientation özelli ği 4 ayrı değeri almaktadır. Sekmelerin SSTab nesnesinin alt kenar ına diklemesini sağlamak üzere Orientation özelliğine “1-Tabs on Bottom” değerini aktarınca üzerinde çalıştığımız projedeki SSTab nesnesi Şekil 8.f125’de verilen şekle dönüştü. Şekil 8.f-125 Başlangıçta Tab veya sekmelerin yükseklikleri 300 Twip seçilmekte ve bu değer SSTab nesnesinin TabHeight özelliğinde saklanmaktadır. Custom özelliğinden yararlanılarak ekrana getirilen Property Pages diyalog kutusundan veya doğrudan Properties penceresinden yararlanarak sekmelerin yüksekliklerinde değişiklik yapabilirsiniz. Style özelliğinde olduğu gibi SSTab nesnesinin Orientation özelliğinde değişiklik yapmak için Custom diyalog kutusuna başvurmadan doğrudan Properties penceresinde TabOrientation özelliğinden yararlanabilirsiniz. Başlangıçta Tab veya sekmelerin yükseklikleri 3000 Twip olarak seçilmekte ve bu değer SSTab nesnesinin TabHeight özelliğinde saklanmaktadır. Custom özelliğinden yararlanarak ekrana getirilen Propert Pages diyalog kutusundan veya doğrudan Properties penceresinden yararlanarak sekmelerin yüksekliklerinde değişiklik yapabilirsiniz (Şekil 8.f-126). 311 Şekil 8.f-126 SSTab nesnesindeki sekmelerin yüksekliklerinden başka genişliklerini istediğiniz gibi belirleyebilirsiniz. Sekmelerin genişlikleri başlangıçta SSTab nesnesinin genişliğine bağlı olarak otomatik olarak belirlenmektedir. SSTab nesnesinin genişliğini arttıracak olursanız, sekmelerin genişlikleri buna paralel olarak artar. Diğer yandan SSTab nesnesinin Style özelliği ssStylePropertyPages değerini içeriyorsa sekmelerin genişliği SSTab nesnesinin genişliğinden etkilenmez. Şekil 8.f-127 SSTab nesnesinin Style özelliğine ssStyleTabbedDialog değerini içeriyorken sekme genişliğinin bu şekilde Visual Basic tarafından SSTab nesnesinin genişliğine bağlı olarak belirlenmesini istemiyorsanız MaxTabWidth özelliğinden yararlanmanız gerekir. MaxTabWidth özelliği başlangıçta 0 değerini içerdiği için sekme genişliği Visual Basic tarafından belirlenmektedir. 312 Şekil 8.f-128 Eğer gerektiği zaman sekme başlıklarının birden fazla satır arasında paylaşılmasını istemiyorsanız SSTab nesnesine ait WordWrap özelliğinden yararlanabilirsiniz (Şekil 8.f-128). Eğer seçili durumda olan sekmenin etrafının noktalarla çevrilmesini istemiyorsanız SSTab nesnesine ait ShowFocusRect özelliğine False değerini aktarmanız gerekir (Şekil 8.f-129). Şekil 8.f-129 Şekil 8.f-130 313 Sekme başlıkları metni için font veya punto değişikliği yapmak istiyorsanız Font sekmesinden yararlanabilirsiniz (Şekil 8.f-130). Sekme başlıklarında bir simgeye yer vermek istiyorsanız Picture özelliğinden yararlanabilirsiniz. Tasarım anında hangi sekmeye başka nesneler eklemek istiyorsanız önce o sekmeyi seçili duruma getirmeniz gerekir. Sekmede yalnızca resim kullanacaksanız sekmeye ait Caption özelliğine boşluk değerini aktarmanız gerekir. Şekil 8.f-131 Tasarım anında hangi sekmeye başka nesneler eklemek istiyorsanız önce o sekmeyi seçili duruma getirmeniz gerekir (Şekil 8.f-132). Şekil 8.f-132 23. DBGrid Kontrolü Visual Basic’in DBGrid kontrolü yardımıyla istenen tablonun içeriği çok kolay bir şekilde Excel veya dBASE tabloları gibi satır ve sütunlar halinde ekrana getirilir ve istenirse tablonun içerdiği bilgilerde değişiklik yapılabilir. DBGrid kontrolü ile veri tabanı dosyaları üzerinde işlem yapabilmek 314 için daha önce söz konusu forma Data nesnesini dahil etmek gerekiyor. DBGrid kontrolünün nasıl kullanıldığını anlamak için önce bir proje hazırlayalım ve projenin formuna bir Data nesnesi dahil edelim. Şekil 8.f-133 Konunun kolay anlaşılmasını sağlamak için Data nesnesinin RecordSource özelliğine daha önce hazırlamış olduğumuz MDB uzantılı “Müşteri” adındaki veri tabanı dosyasındaki “Adresler” tablosunun adını aktaralım (Şekil 8.f-133). 315 Şekil 8.f-134 DBGrid kontrolü ToolBox penceresinde bir düğme ile temsil edilmediği için Project menüsünden Components komutunu verip ekrana Components diyalog kutusunda “Microsoft Data Bound Grid Control 5.0 ” kontrolüne ait onay kutusunu seçili duruma getirip “Tamam” düğmesinde tıklama yaparsanız üzerinde çalıştığınız projeye DbGrid kontrolü dahil edilir (Şekil 8.f-134). Bu şekilde forma Dbgrid nesnesi dahil edildikten sonra ilk olarak, hangi Data nesnesinden yararlanarak hangi tablo üzerinde işlem yapılacağı belirlenir. Bu amaçla üzerinde çalıştığınız forma DBGrid nesnesini eklemeden önce, Data nesnesini forma dahil etmeniz gerekir (Şekil 8.f-135) Şekil 8.f-135 DBGrid nesnesine bilgileri hangi Data nesnesinden almak istiyorsanız o Data nesnesinin adını, DBGrid nesnesine ait DataSource özelliğine aktarmanız gerekir (Şekil 8.f-136). 316 Şekil 8.f-136 Properties penceresinde DBGrid nesnesi için Data nesnesi seçimini yaptıktan sonra DBGrid nesnesinden yararlanabilirsiniz. Data nesnesi seçiminden sonra projeyi çalıştıracak olursanız seçilen tablonun içeriği DBGrid nesnesi içinde görüntülenmeye başlanır (Şekil 8.f-137). Şekil 8.f-137 DBGrid nesnesinin genişliği forma eklenen data nesnesi aracılığı seçilen tablodaki tüm alanlar ı aynı anda görüntülemek için yeterli değildir. Eğer DBGrid nesnesinin Formun üst kısmına yaslandırılmasını istiyorsanız DBGrid nesnesinin Align özelli ğine 1-AlingTop, formun alt kısmına yanaştırılmasını istiyorsanız 2-Aling Bottom değerini aktarmalısınız (Şekil 8.f-138). Şekil 8.f-138 Şekil 8.f-137’de verilen ekran görüntüsünü almak için Align özelliğine “1-AlingTop” değeri aktarıldı. Ardından formun genişliğini biraz arttırıldı. Daha önce DBGrid nesnesinin Align özelliğine 317 “1-AlingTop” değerini aktardığımız için formun genişliğine paralel olarak Grid nesnesinin genişliği kendiliğinden arttı. Bu ayarlamalardan sonra yalnızca Data ve DBGrid nesnesini içeren bir forma sahip olan bu proje çalıştırılacak olursa, seçilen tablodaki her bir kayıt bir satıra gelmek üzere ekrana getirilir. Şekil 8.f-139 Bu sırada ok tuşları ile kayıtlar (satır) ve alanlar (sütun) arasında dolaşılabilir, istediğiniz kayıtta değişiklik yapabilir veya yeni bir kayd ın girişini yapabilirsiniz. Ayr ıca çalışma anında fare ile sütunların genişliklerini istediğiniz gibi değiştirebilirsiniz. Ok tuşları ile kayıtlar ve hücreler arasında dolaşırken üzerine gidilen hücrenin bütün içeri ği varsayım olarak seçili durumda olmaktadır. Başlangıçta DBGrid nesnesi ile içeriği ekrana getirilen tabloya yeni kay ıtlar giremezsiniz. Grid nesnesi yardımıyla tabloya kayıt girmek istiyorsanız DBGrid nesnesinin AllowAddNew özelliğine True değerini aktarmanız gerekir (Şekil 8.f-140). Şekil 8.f-140 DBgrid nesnesinin AllowAddNew özelliği True değerini içeriyorken tablonun sonuna yeni bir kayd ın girişini yapmak için ok tuşları veya fare ile dosyadaki en son kaydın herhangi bir alanına girilir. Ardından bir kez daha aşağı ok tuşuna basılırsa tablonun sonuna içeriği boş bir kayıt eklenir (Şekil 8.f-141). 318 Şekil 8.f-141 Çalışma anında DBGrid nesnesi ile ilgili olarak yapılabilecek işlemler konusunda ayarlama yaparken Properties penceresinde DBGrid nesnesine ait Custom özelliğinden yararlanabilirsiniz (Şekil 8.f-142). Şekil 8.f-142 Şekil 8.f-143 319 Şekil 8.f-143’de ekran görüntüsü verilen Property Pages diyalog kutusunda yapılabilen seçim ve ayarlamalar General, KeyBpoard, Columns, Layout, Color, Font ve Split adında 7 sekmeye ayrılmış durumdadır Eğer veri tabanı dosyası üzerinde değişikliğe izin vermek istemiyorsanız AllowUpdate onay kutusunu pasif duruma getirmeniz yeterlidir. Benzer şekilde kayıt silme işlemine izin vermek istemiyorsanız AllowDelete özelliğine False değerini aktarabilirsiniz. Eğer DBGrid nesnesi ile söz konusu tablonun bütün alanları yerine istediğiniz alanları üzerinde işlem yapmak istiyorsanız Property Pages diyalog kutusunda Columns sekmesindeki seçeneklerden yararlanabilirsiniz (Şekil 8.f-144). Şekil 8.f-144 Şimdiye kadar verilen ekran görüntülerinden tespit etmiş olabileceğiniz gibi DBGrid nesnesi yardımıyla seçilen tablodaki bütün alanları görüntülemektedir. Eğer DBGrid nesnesi ile söz konusu tablonun bütün alanları yerine istediğiniz alanları üzerinde işlem yapmak istiyorsanız Property Pages diyalog kutusunda Columns sekmesindeki seçeneklerden yararlanabilirsiniz. Başlangıçta Columns sekmesindeki seçenekler veya liste kutuları herhangi bir bilgi içermedikleri için çalışma anında DBGrid nesnesi sınırları içinde tablonun bütün alanları birer sütun ile temsil edilir. Şimdi örnek olması için “Adresler” tablosunun yanlızca “Adı”, “Soyadı” ve “Telefon” alanlarının DBGrid nesnesi içinde yer almasını sağlayalım. Şekil 8.f-145’deki ekran görüntüsünde tespit edebileceğiniz gibi tasarım anında DBGrid nesnesinde yalnızca iki sütun bulunmaktadır. Şekil 8.f-145 Bu nedenle Property Pages diyalog kutusundaki Columns liste kutusunda yalnızca iki seçenek bulunmaktadır. Eğer DBGrid nesnesi ile tablonun yalnızca iki alanı üzerinde işlem yapmak isterseniz fazladan herhangi bir işlem yapmadan Property Pages diyalog kutusundaki “Columns” liste kutusunda alan seçimini yapmanız gerekirdi.. 320 Şekil 8.f-146 Şekil 8.f-146’daki ekran görüntüsünde tasarım anında DBGrid nesnesinde yalnızca iki sütun olduğu için Columns liste “Column0” ve “Column1” adında iki seçenek bulunmaktadır. Bu liste kutusunda sütun seçimi yapıldıktan sonra Data Field liste kutusunda alan seçimi yapılır. Data Field liste kutusunda Data nesnesi ile seçilen tablodaki alanlar listelenir. Caption özelliğinden yararlanarak sütunun başlığını belirleyebilirsiniz. Sütunun Caption özelliğine bilgi giremezseniz alanın adı aynı zamanda sütun başlığı olarak kullanılır. Şekil 8.f-147 Default Value özelliği ile tabloya yeni kayıt girişi sırasında alana otomatik olarak aktarılacak bilgi belirlenir. Örneğin adres kayıtlarını girdiğiniz kişilerin çoğunluğu İstanbul’da oturuyorsa Şehir alanına Default Value özelliğine “İstanbul” bilgisini aktarabilirsiniz. Şekil 8.f-148’de verilen ekran görüntüsünü DBGrid nesnesine ait iki sütun için alan seçimini yaptıktan sonra alınmıştır. 321 Şekil 8.f-148 Bu seçim ve işlemlerden sonra Property Pages diyalog kutusunu kapatıp projeyi çalıştıracak olursanız DBGrid nesnesi, her kaydın yalnızca Adı ve Soyadı bilgilerini ekrana getirir. Şekil 8.f-149 Yukarıdaki sayfada belirtildiği gibi DBGrid nesnesi ile “Adresler” tablosundaki kayıtların Adı ve Soyadı ve Telefon alanlarının içerikleri ekranda görmek istediğimiz veya Grid nesnesinde yalnızca bu 3 alanın olmasını istediğimiz için tasarım anında DBGrid nesnesine yeni bir sütun ekleyelim. Bu amaçla ilk olarak tasarım anında DBGrid nesnesinin üzerinde farenin sağ tuşu ile tıklama yaparak DBGrid nesnesi ile kısayol menüsünü ekrana getirilir (Şekil 8.f-150). 322 Şekil 8.f-150 Eğer tasarım anında Grid nesnesine bilgi girmek veya DBGrid nesnesine yeni bir alan eklemek istiyorsanız kontrol menüsünden Edit komutunu verebilirsiniz. Edit komutunu verirseniz imleç DBGrid nesnesindeki hücrelerden birinin içinde yanıp sönmeye başlar. Bu sırada DBGrid nesnesine istediğiniz gibi bilgi girebilirsiniz. Şekil 8.f-151 Edit modunda iken farenin sağ tuşu ile DBGrid nesnesinin üzerinde tıklama yapılarak ekrana getirilen kısayol menüsünde farklı komutlar bulunmaktadır. Şekil 46-18’de verilen ekran görüntüsünde görebilirsiniz. Bu sırada DBGrid nesnesine ait kısayol menüsünden Append komutunu verirseniz DBGrid nesnesine yeni bir sütun eklenir. Şekil 8.f-152’de verilen ekran görüntüsünü Append komutu ile sütun sayısını üçe çıkardıktan sonra alınmıştır. Şekil 8.f-152 Bu işlemden sonra DBGrid nesnesine ait kısayol menüsünden Properties komutunu verirp ekrana Propery Pages diyalog kutusunu getirdim. Ardından Columns sekmesinde DBGrid nesnesine eklemiş olduğum 3. sütun (Columns2) için alan seçimi yapıldı. Sonra Property Pages diyalog kutusunu kapatıp projeyi çalıştıracak olursanız DBGrid nesnesi içinde seçilen tablonun yukarıda kendileri için ayarlama yapılan 3 alan görüntülenir (Şekil 8.f-153). 323 Şekil 8.f-153 Örnek Program 1 Şekil 8.f-154 Option Explicit Private Sub Form_Load() Dim dbname As String Dim db As Database Dim qdef As QueryDef Dim td As TableDef ' Open the database. dbname = App.Path If Right$(dbname, 1) <> "\" Then dbname = dbname & "\" dbname = dbname & "PERSONEL.mdb" Set db = OpenDatabase(dbname) ' List the table names. For Each td In db.TableDefs If Left$(td.Name, 4) <> "MSys" Then List1.AddItem td.Name Next td db.Close Data1.DatabaseName = dbname 324 End Sub Private Sub List1_Click() Dim TABLE_ADI As String Dim sql As String TABLE_ADI = List1.List(List1.ListIndex) sql = "SELECT * FROM " & TABLE_ADI Data1.Caption = TABLE_ADI Data1.RecordSource = sql Data1.Refresh Data1.Visible = True DBGrid1.Visible = True End Sub Örnek Program 2 Private Sub Form_Load() Dim Dim Dim Dim dbname As String db As Database qdef As QueryDef td As TableDef dbname = App.Path If Right$(dbname, 1) <> "\" Then dbname = dbname & "\" dbname = dbname & "data.mdb" Set db = OpenDatabase(dbname) For Each td In db.TableDefs If Left$(td.Name, 4) <> "MSys" Then List1.AddItem td.Name Next td db.Close Data1.DatabaseName = dbname 325 End Sub Private Sub List1_Click() Dim table_name As String Dim sql As String table_name = List1.List(List1.ListIndex) sql = "SELECT * FROM " & table_name Data1.Caption = table_name Data1.RecordSource = sql Data1.Refresh Data1.Visible = True DBGrid1.Visible = True End Sub 24. DBList Kontrolü Kayıt girişi sırasında kullanıcıların doğrudan bilgi girmesi yerine liste kutusu nesnesi yardımıyla listelenen seçeneklerden seçim yapmak çok daha işlevseldir. Visual Basic dahilinde liste kutusuna gerek duyulacak olursanız ListBox kontrolünden yararlanabilirsiniz. Ancak liste kutusunda listelenecek seçenekler bir tablo veya veri tabanı dosyasından alınacaksa DBList kontrolünden yararlanmanız gerekir. DBList kontrolü projelere otomatik olarak dahil edilmediği için projeye dahil edilmesi gerekir. Bu amaçla önce Project menüsünden Components komutunu vermeniz gerekir. Projelere otomatik olarak dahil edilmeyen DBList kontrolünü projeye dahil etmek üzere Project menüsünden Components komutunu verirseniz ekrana Components diyalog kutusu gelir (Şekil 8.f155). Şekil 8.f-155 Bu diyalog kutusunda Controls sekmesindeki Microsoft Data Bound List Controls onay kutusunu seçip Tamam düğmesinde tıklama yaparsanız ToolBox’a iki düğme dahil edilir. Bu düğmelerden ilki DBList, ikincisi ise DBCombo kontrolünü temsil eder (Şekil 8.f-156,157). 326 Şekil 8.f-156 Şekil 8.f-157 DBList nesnesinden yararlanmak için Data kontrolünden başvurmak gerektiği için ayrıca forma bir Data nesnesi dahil edilir ve Data nesnesi için veri tabanı dosyası ve tablo seçimi yapılır. Forma Data nesnesi dahil ettikten sonra DBList nenesinin DataSource özelliğinden yararlanarak Data nesnesi seçimi yapılır (Şekil 8.f-158). Şekil 8.f-159 DBList kontrolü için Data nesnesi seçimini yaptıktan sonra DBList nenesi ile hazırlanacak liste kutusunda listelenecek bilgilerin hangi alandan seçileceği belirlenir. Bu amaçla ListFields özelliğinden yararlanarak alan seçimi yapılmaktadır. Örnek olması için hazırlamak istediğimiz DBList nenesinde Adresler tablosundaki “Adı” alanının içerdiği bilgileri listelemek için Adı alanını seçelim. Şekil 8.f-160 ListFields özelliğinden yararlanarak alan seçimini yaptıktan sonra projeyi çalıştıracak olursanız liste kutusu seçilen tablonun ilgili alanlarındaki bilgiler listelenir (Şekil 8.f-161). 327 Şekil 8.f-161 Bu sırada fareden veya ok tuşlarından yararlanarak liste kutusunda listelenen seçeneklerden istediğinizi seçebilirsiniz. Liste kutusunda seçilen seçenek DBList nenesinin Text özelliğine aktarılmaktadır. Liste kutusunda seçilen seçeneğin Text özelliğine aktarıldığını göstermek için forma bir metin kutusu ve bir düğme yerleştirelim. Aktar başlıklı düğmede tıklama yapıldığı zaman seçilen seçenek metin kutusuna yazılacaktır (Şekil 8.f-162). Private Sub Aktar_Click() Text1.Text = Dblist1.Text End Sub Şekil 8.f-162 Diğer yandan DBList kontrolü ile bir tablodan alınan bilgiler başka bir tabloda kullanılmak istenebilir. Bu gibi durumlarda DBList nesnesinin DataSource ve DataFields özelliklerinden yararlanılır. 25. DBCombo Kontrolü Bu kontrol hakkında bilgi vermek için önce yeni bir proje hazırlayalım ve projenin forma bir DBCombo nesnesi dahil edelim. DBCombo nesnesi Data nesnesine ihtiyaç duyduğu için forma ayrıca bir Data nesnesi dahil edilir ve Data nesnesi ile Müşteri.mdb dosyasındaki Adresler tablosuna erişim sağlamak için Data Source seçimini yapalım (Şekil 8.f-163). 328 Şekil 8.f-163 Bu hazırlıklardan sonra ilk olarak DBCombo nesnesi ile Data nesnesi arsında bağlantı kurmak için ilk olarak DBCombo’nun RowSource özelliği ile Data nesnesi seçimi yapılır. Ardından DBCombo nesnesinin FieldsList özelliği yardımıyla liste kutusunda bilgilerin seçilen tablonun hangi alanından alınacağı belirlenir. DBCombo nesnesinde “Adresler” tablosundaki Soyadları aktarmak istediğimiz için DataField özelliğine “Soyadı” alanını aktardık (Şekil 8.f-164). Şekil 8.f-164 Bu işlemlerden sonra DBCombo ve Data nesnesi dahil edilen proje çalıştırılacak olunursa Şekil 8.f-165’deki gibi bir görüntü elde edilir. Başlangıçta DBCombo nesnesinin Text özelliği “DBCombo1” olan adını içeriği için liste kutusunda bu bilgi bulunur. 329 Şekil 8.f-165 Listelenecek seçeneklerden hangisini seçerseniz o seçenek DBCombo nesnesinin Text özelliğine aktarılır. Data nesnesine ait düğmelerde tıklama yaparak erişim sağlanan tablonun kayıtları arsında dolaşmanız halinde bundan DBCombo nesnesi etkilenmez. Çünkü şimdiye kadar yapılan seçim ve ayarlamalara göre DBCombo nesnesi ancak Data nesnesi ile erişim sağlanan Adresler tablosunda Soyadı alanın içeriğini listelemeye yarar. Eğer DBCombo nesnesinden erişim sağlanan tablonun aktif kaydının ilgili alanın içeriğini görüntülemek için kullanmak istiyorsanız RowSource ve ListField özellikleri yerine DataSource ve DataField özelliklerinden yararlanmalısınız. Örnek Program-1 Private Sub Form_Load() Dim db As Database Dim rs As Recordset Set db = DBEngine.Workspaces(0).OpenDatabase("C:\PERSONEL.mdb") Set rs = db.OpenRecordset("PERBILGI") While Not rs.EOF ‘PERBILGI table’sinde istediğiniz alan sıra numarasını girin Combo1.AddItem rs.Fields(2) rs.MoveNext Wend End Sub Private Sub Text1_Change() Combo1.ListIndex = SendMessage(Combo1.hwnd, CB_FINDSTRING, 1, ByVal CStr(Text1.Text)) End Sub Module Declare Function SendMessage Lib "user32"_ Alias "SendMessageA" (ByVal hwnd As Long,_ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const CB_FINDSTRING = &H14C 330 Örnek Program-2 Private Sub Combo1_Change() Dim Basla As Integer Dim Katar As String Static son As Integer Basla = 1 Basla = Combo1.SelStart If son <> 0 Then Combo1.SelStart = son Basla = son End If Katar = CStr(Left(Combo1.Text, Basla)) Combo1.ListIndex = SendMessage(Combo1.hwnd, CB_FINDSTRING, 1, ByVal CStr(Left(Combo1.Text, Basla))) If Combo1.ListIndex = -1 Then son = Len(Katar) Combo1.Text = Katar End If Combo1.SelStart = Basla son = 0 End Sub Private Sub Form_Load() Dim db As Database Dim rs As Recordset Set db = DBEngine.Workspaces(0).OpenDatabase("C:\PERSONEL.mdb") Set rs = db.OpenRecordset("PERBILGI") While Not rs.EOF Combo1.AddItem rs.Fields(2) rs.MoveNext Wend End Sub Module 331 Declare Function SendMessage Lib "user32"_ Alias "SendMessageA" (ByVal hwnd As Long,_ ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const CB_FINDSTRING = &H14C 8.g. Menü Hazırlamak (Menu Editor) Menü üreticisini başlatmadan önce menü eklemek istediğiniz formu seçili duruma getirmelisiniz. Menü üreticisini başlatmak için Tool menüsündeki Menu Editor komutundan yararlanılır (Şekil 8.g1). Şekil 8.g-1 Visual Basic ile çalışırken Menu Editor’ü başlatmak için Tools menüsünden komut vermek yerine direk CTRL+E tuşlarına birlikte basılabilir. ToolBar’daki bu düğmede tıklama yapar veya Tools menüsünden Menu Editor komutunu verecek olursanız ekrana Menu Editor diyalog kutusu gelir (Şekil 8.g-2). 332 Şekil 8.g-2 Hazırlayacağımız menünün adını ve başlığını Dosya olarak seçelim. Bu nedenle işe Menü Editör penceresinde Caption ve Name metin kutularına “Dosya” adını yazmamız gerekir (Şekil 8.g-2). Menünün kullanıcıya yansıyan şeklinde, menü başlığının ilk harfinin altı çizili olduğu için Caption metin kutusunda "D” harfinin önüne “&” karakteri konulur (Şekil 8.g-3). Böylece “Dosya” menüsünün tanımlanması işlemi bitmiş olur. Şekil 8.g-3 Ancak bu menüde birkaç komuta yer vermek gerekirse ikinci bir menünün veya menüye ait komutun girişini yapmak için Next düğmesinde tıklama yapılır veya pencerenin alt kısmında fare ile menü adının hemen altında tıklama yapılır Şekil 8.g-4). Şekil 8.g-4 333 Işıklı bant bu sırada herhangi bir menünün veya komutun üzerinde olmadığı için Caption ve Name metin kutularının içerikleri boş olur. Bizim örnekte “Dosya” açılan menüsünde ilk sırada bulunan komutun adı “Yeni” olsun. Bu nedenle Caption ve Name metin kutularına “Yeni” bilgisini yazalım. Yeni başlıklı komutta “e” harfinin altı çizi olmasını istiyorsak bilgiyi girerken “&” karakterini “e” harfinin önüne eklememiz gerekir. Şekil 8.g-5 Şekil 8.g-5’ de görüldüğü gibi “Dosya” açılan menüsünde “Yeni” bir menü olmayıp bir komuttur. Başka bir deyişle “Yeni” komutu olması gereken yerde değildir. Yeni komutunun hiyerarşik yer bakımından bir basamak aşağıya alınması gerekir. Bu sağlamak için Menü editör penceresinde üzerinde ucu sağ tarafa bakan ok işareti bulunan düğmede tıklama yapılmalıdır (Şekil 8.g-6). Şekil 8.g-6 Word’de “Yeni” komutunu vermek için CTRL+N tuşları kullanılabilmektedir. Bu nedenle Yeni komutu için Shortcut yani kısayol tuş vuruşu tanımlayalım. Işıklı bandın üzerinde bulunduğu komut için kısayol tuş tanımlamak için Menü Editör penceresindeki Shorcut liste kutusundan yararlanılır (Şekil 8.g-7). 334 Şekil 8.g-7 Komutların arasına çizgi koymak için Insert düğmesinde tıklama yapılır. Insert düğmesinde tıklama yapılınca araya henüz adı ve başlığı olmayan bir komut eklenir. Komut başlığı olarak mutlaka tek tire (-) kullanılmalıdır (Şekil 8.g-8). Şekil 8.g-8 Visual Basic projeleri dahilinde hazırlanan bazı menü ve komutların menüde yer alması engellenebilir veya gizlenebilir. Açılan bir menüyü veya menüdeki komutu ekrandan kaldırmak için Visible özelliğinden, soluk göstermek için Enabled özelliğinden yararlanılır (Şekil 8.g-9). 335 Şekil 8.g-9 1. Menü ve Komutların Özellikleri Seçme işareti yapmak için tasarım anında Checked onay kutusu seçili duruma getirilmelidir. Çok sayıda özelliğe sahip olan menü ve komut nesnelerinin özelliklerini Properties penceresinde göstermek ve değiştirmek imkanı yoktur. Şekil 8.g-10 Menü komutlarının başlangıç özellikleri Menu Editor penceresinde seçilir. Çalışma anında istenen komut nesnesinin Caption, Checked, Enabled ve Visible özellikleri program kodu yazılarak değiştirilebilir. Aşağıda verilen ekran görüntüsünde Form_Load yordamına eklenen program satırı ile proje çalıştırılır çalıştırılmaz menüdeki “Yeni” komutunun önüne seçme işaretinin kullanılması sağlanmaktadır. Private Sub Form_Load() Yeni. Checked = True End Sub Açılan bir menüyü veya menüdeki komutu ekrandan kaldırmak için Visible özelliğinden yararlanılır. Bu özellik Menü Editör penceresinde bir onay kutusu ile temsil edilmektedir. Private Sub Form_Load() Hücreler.Visible =False Yeni. Visible = False Kaydet.Visible = False End Sub Bazen içinde bulunulan şartlarda kullanılma olanağı olmayan komutu menüden tümden silmek yerine soluk renkte görünmesi sağlanır. Private Sub Form_Load() Kaydet. Enabled = False Kapat.Enabled = False 336 End Sub 2. Örnek Program 1 Private Sub Form_Load() mnuWhite.Enabled = False mnuSmall.Enabled = False End Sub Private Sub mnuBlue_Click() FORM1.BackColor = QBColor(1) mnuBlue.Enabled = False mnuRed.Enabled = True mnuWhite.Enabled = True Private Sub mnuRed_Click() FORM1.BackColor = QBColor(4) mnuRed.Enabled = False mnuBlue.Enabled = True mnuWhite.Enabled = True End Sub Private Sub mnuSmall_Click() FORM1.WindowState = 0 mnuSmall.Enabled = False 337 End Sub Private Sub mnuExit_Click() End End Sub Private Sub mnuLarge_Click() FORM1.WindowState = 2 mnuLarge.Enabled = False mnuSmall.Enabled = True End Sub mnuLarge.Enabled = True End Sub Private Sub mnuWhite_Click() FORM1.BackColor = QBColor(15) mnuWhite.Enabled = False mnuRed.Enabled = True mnuBlue.Enabled = True End Sub 3. Örnek Program 2 Option Explicit Dim Element As Integer Private Sub Form_Load() ' mnuItems[] array is 0. Element = 0 mnuRemove.Enabled = False End Sub Private Sub mnuAdd_Click() Element = Element + 1 338 ' Add a new element to the mnuItems[] array. Load mnuItems ( Element ) MnuItems ( Element ).Caption = "Item " + Str( Element ) MnuRemove.Enabled = True End Sub Private Sub mnuExit_Click() End End Sub Private Sub mnuItems_Click(Index As Integer) MsgBox "You selected Item " + Str( Index ) End Sub Private Sub mnuRemove_Click() Unload mnuItems ( Element ) Element = Element – 1 If Element = 0 Then MnuRemove.Enabled = False End If End Sub 4. Pop-Up menüler... Bildiğiniz gibi Pop-up menüler, WINDOWS 3.1 ile gelen ve bazı programlarda sağ fare tuşuna basıldığında programla ilgili birtakım olayları gerçekleştirebilmenize yarayan menülerdir. Bu menüler WINDOWS 95 kullananların ise artık eli ayağı durumundalar. Visual Basic ile bu menüleri yaratmak çok kolay. Menü editörünü açın ve şekildeki gibi özellikler taşıyan ve ismi "Pano" olan bir menü yaratın. Menünüzü yarattıktan sonra editörden çıkmadan sadece "pano" isimli kısmı "görünmez" yapın. Editörden çıktığınızda yarattığınız menünün görülmediğini fark edeceksiniz. 339 Form üzerindeki diğer kontrolleri de yarattıktan sonra programınızı çalıştırın ve text kutusunun üstüne gidip "Sağ" fare tuşuna tıklayın. Karşınıza menü editörüyle yarattığınız menü bir pop-up menü olarak çıkacaktır. Programınız çalışırken menülerin ayarlarıyla oynayabildiğinizden pop-up menüyü, normal bir menü haline ikinci seçeneği seçerek dönüştürebilirsiniz. Private Sub Form_Load() pano.Visible = False Option1.Value = True End Sub Private Sub Option1_Click() pano.Visible = False End Sub Private Option2_Click() pano.Visible = True Sub End Sub Private Sub tarih_Click() Text1.Text = Text1.Text & Now End Sub Private Sub sil_Click() Text1.Text = "" End Sub Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If pano.Visible = True Then GoTo atla If Button = 2 Then PopupMenu pano End If Atla: 340 End Sub Örnek / Popup Menü Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then PopupMenu mnuFile End Sub Private Sub Label1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then PopupMenu mnuFile End Sub 341 8.h. Araç Çubuğu Hazırlamak Ekranın bir satırı boyunca bir araya getirilmiş düğmelerin hepsine birden Araç Çubuğu adı verilmektedir. Visual Basic’te araç çubuğu hazırlamaya yönelik olarak Toolbar adında bir kontrol bulunmaktadır. Ancak Toolbar kontrolü başlangıçta projeye dahil edilmediği için Toolbox penceresinde bir düğme ile temsil edilmemektedir. Bu nedenle Project menüsündeki Components komutundan yararlanıp Components diyalog kutusunu ekrana getirmeniz gerekir (Şekil 8.h-1). Şekil 8.h-1 Components diyalog kutusunda “Microsoft Windows Common Controls” onay kutusunu seçili duruma getirip diyalog kutusunu Tamam düğmesi ile kapatırsanız Toolbar kontrolü de dahil olmak üzere üzerinde çalıştığınız projeye TabStrip, Progrees Bar, Status Bar, List View, Image List, Slider ve ImageCombo adında 9 kontrol eder. Şekil 40-2’de verilen ekran görüntüsünü üzerine çalışılan projenin formuna bir Toolbar nesnesi dahil ettikten sonra alalım. Toolbar nesnesi dahil edildiği formun bütün genişliğini kapsamaktadır. Başka bir deyişle Toolbar nesnesinin genişliği dahil edildiği formun genişliğine bağlı olarak otomatik olarak belirlenmektedir. Properties penceresinde Toolbar nesnesinin genişliğinin değiştirilmesine izin verilmez. Şekil 8.h-2 342 Eğer forma yerleştirmiş olduğunuz Toolbar nesnesini formun başka bir kenarına almak istiyorsanız Toolbar nesnesinin Align özelliğinden yararlanabilirsiniz. Eğer araç çubuğunu formun alt kenarına almak istiyorsanız Align özelliğine “2-vbAlignBottom” değerini aktarmanız gerekir (Şekil 8.h-3). Şekil 8.h-3 Şekil 8.h-4 Şekil 8.h-2’de verilen ekran görüntüsünde tespit etmiş olabileceğiniz gibi forma yerleştirdiğiniz Toolbar nesnesinin sınırları pek belli değildir. Eğer Toolbar nesnesinin sınırlarının belli olmasını istiyorsanız Toolbar nesnesinin BorderStyle özelliğinden yararlanmanız gerekir (Şekil 8.h-4). Başlangıçta “0-ccNone” değerini içeren BorderStyle özelliğine Properties penceresinden yararlanarak “1-ccFixelSingle” değerini aktaracak olursanız Toolbar nesnesi aşağıdaki şekle dönüşür. Şekil 8.h-5 Toolbar nesnesi bu şekilde hazırlandıktan sonra sıra Toolbar nesnesinin üzerine menülerdeki komutları temsil edecek düğmeleri yerleştirmeye gelir. Toolbar nesnesinin üzerine yerleştirilecek düğmeler için Toobar nesnesinin Custom özelliğinden yararlanmanız gerekir. 343 Properties penceresinde ışıklı bantı Custom özelliğinin üzerine götürdüğünüzde Custom özelliğine ait satırın sonuna bir düğme eklenmektedir. Bu düğmede tıklama yaptığınızda Toolbar nesnesinin bir çok özelliğini değiştirebileceğiniz Property Pages deiyalog kutusu ekrana gelir. Ekrana gelen Property Pages diyalog kutusunda seçim ve ayarlamalar için 3 sekme bulunmaktadır (Şekil 8.h-6). Şekil 8.h-6 General sekmesindeki seçeneklerle Toolbar nesnesine yerleştirilecek düğmelerinin boyutlarını belirliyebilir veya balon yardım tekniğinin kullanılıp kullanılmayacağı konusunda seçim yapabilirsiniz. Toolbar nesnesine düğme yerleştirmek için Buttons sekmesine geçmek gerekir (Şekil 8.h-7). 344 Şekil 8.h-7 Şekil 8.h-7’de ki görüntüsü alondığı zaman üzerinde çalışılan projenin formuna yerleştirmiş Toolbar nesnesinin üzerine konulmuş bir düğme yoktu. Bu nedenle Buttons sekmesindeki Insert Button düğmesinin dışında bütün seçenekler kullanılamaz durumdadır.. Araç çubuğuna bir düğme dahil etmek üzere Insert Button düğmesinde tıklama yapılınca araç çubuğuna bir düğme dahil edilir ve Property Pages diyalog kutusu Şekil 8.h-8’deki şekle dönüşür. 345 Şekil 8.h-8 Bu şekilde araç çubuğuna bir düğme dahil ettikten sonra bu düğmenin özelliklerini belirlemeniz gerekir. Örneğin çalışma anında fare işareti bu düğmenin üzerinde kısa bir süre bekletildiği zaman ekrana küçük bir kutu içinde getirilecek yardım bilgisini ToolTip Text metin kutusuna yazmanız gerekir. Benzer şekilde Insert Button düğmesinde tekrar tıklama yaparak istediğiniz sayıda düğmeyi araç çubuğuna dahil edebilirsiniz. Bu sırada başka herhangi bir işlem yapmadan Toolbar Properties diyalog kutusunu Tamam düğmesi ile kapatacak olursanız Forma yerleştirmiş olduğunuz araç çubuğu Şekil 8.h-9’ da verilen şekle dönüşür. Şekil 8.h-9 346 Toolbar nesnesine düğme ekleme işleminden sonra sıra düğmenin üzerine yerleştirilecek küçük resim veya kona gelir. Toolbar nesnesinin üzerine yerleştirdiğiniz düğmeler için resim seçimi için İmageList kontrolünden yararlanmanız gerekir. Şekil 8.h-10 Toolbox penceresinde ImageList kontrolünü temsil eden düğmeyi seçili duruma getirdikten sonra formun üzerine ImageList nesnesini yerleştirmeniz gerekir (Şekil 8.h-10). Forma yerleştirilen ilk İmageList nesnesine “ImageList1” adı verilmektedir. Ayrıca ImageList nesnesi çalışma anında formun üzerinde görüntülenemediği için standart büyüklüğe sahip olmaktadır. Şekil 8.h-11 ImageList nesnesinden Toolbar nesnesinin üzerine konulacak düğmeler için resim seçerken ImageList nesnesinin Custom özelliğinden yararlanılır (Şekil 8.h-11). Properties penceresinde forma yerleştirmiş olduğumuz İmageList nesnesinin özellikleri varken ışıklı bantı Custom özelliğinin üzerine götürüp bu özelliğe ait düğmade tıklama yaparsanzı ekrana Property Pages diyalog kutusu gelir. Bu diyalog kutusunda ImageList nesnesi ile ilgili olarak yapılabilen işlemler 3 ayrı sekmeye ayrılmış durumdadır. 347 Şekil 8.h-12 General sekmesindeki seçeneklerle İmageList nesnesine dahil edilecek resim veya ikonların boyutları belirlenmektedir (Şekil 40-12). ImageList nesnesi için resim dosyası seçme işlemi Images sekmesindeki seçeneklerle yapılmaktadır (Şekil 40-13). 348 Şekil 8.h-13 Bu ekran görüntüsünü aldığım sırada ImageList nesnesine dahil edilmiş olan herhangi bir nesne yoktu. Bu nedenle yalnızca Insert Picture düğmesi kullanılabilir durumdadır. ImageList nesnesine resim dosyası dahil etmek üzere Insert Picture düğmesinde tıklama yapmanız gerekir. Ekrana resim dosyası seçimi yapılan Select Picture diyalog kutusu gelir (Şekil 8.h-14). Bu diyalog kutusunda istediğiniz gibi resim dosyası seçimi yapabilirsiniz. Şekil 8.h-14 Dosya seçiminden sonra Aç düğmesi ile Select Picture diyalog kutusu kapatılırsa tekrar Property Pages diyalog kutusuna dönülür. Bu sırada diyalog kutusunda seçilen resim küçük bir kutunun içinde görüntülenir. Bu sırada Remove Picture düğmesinde tıklama yaparak ImageList nesnesine dahil edilen resim silinebilir. 349 Şekil 8.h-15 Tekrar Insert Picture düğmesinde tıklama yaparak ImageList nesnesinde istediğiniz resim dosyasını dahil edebilirsiniz. Şekil 8.h-15’de verilen ekran görüntüsüne İmageList nesnesine 4 ayrı resim dosyasını dahil edildikten sonra alınmıştır. Bu şekilde resim seçme işleminden sonra Property Pages diyalog kutusunu Tamam düğmesinde tıklama yaparak ImageList nesnesi ile ilgili olarak yapmak istediğimiz işlemleri tamamladık. Bu işlemlerden sonra tekrar Toolbar nesnesine ait Property Pages diyalog kutusunu getirelim. Toolboar nesnesinin üzerine yerleştirdiğiniz düğmelerde kullanılacak resimleri hangi ImageList nesnesinden almak istiyorsanız ImageList liste kutusunda seçim yapmanız gerekir (Şekil 8.h-16). Formun üzerinde değişik amaçlar için kullanmak üzere birden fazla ImageList nesnesi yerleştirmiş olabilirsiniz. Aşağıda verilen ekran görüntüsünü aldığımız sırada üzerinde çalıştığımız formda “”ImageList1” adında yalnızca bir ImageList nesnesi vardı. 350 Şekil 8.h-16 General sekmesinde ImageList nesnesi seçimini yaptıktan sonra düğmeler için resim seçimi yapabilmek için Buttons sekmesine geçelim. ImageList nesnesine yerleştirmiş olduğumuz ilk resmi Tolbar nesnesindeki ilk düğmede kullanmak istediğimiz için Image başlıklı sayı kutusuna “1” yazarız (Şekil 8.h-17). 351 Şekil 8.h-17 Hazırladığımız araç çubuğuna Inser Button düğmesinden yararlanarak birden fazla düğme yerleştirirseniz, hangi düğme için resim seçimi yapmak istediğiniz Index başlıklı sayı kutusunda önce o düğmeyi seçmelisiniz. Ardından Image başlıklı sayı kutusna 2 değerini ve ToolTipsText başlıklı metin kutusuna ise hazırlamak istediğiniz araç çubuğundaki 2. düğme için balon yardım metnini girmelisiniz. 352 Şekil 8.h-18 Bu şekilde hazırlanan araç çubuğundaki düğmelerde çalışma anında tıklama yapsanız bile Visual Basic size bir tepkide bulunmaz. Araç çubuğuna yerleştirdiğiniz düğmelere görev atayabilmeniz için düğmelere Key özelliğinden yararlanarak ad vermeniz gerekir (Şekil 8.h-19). Araç çubuğundaki düğmelerden birinin üzerinde tıklama yapmanız halinde ButtonClick yordamı işetilecektir. Ancak araç çubuğunda birden fazla düğme bulunacağından özellikle çalışma anında tıklama yapılan düğmenin belirlenmesi gerekir. Çalışma anında hangi düğmede tıklama yapılmışsa o düğmenin adı Button nesnesinin Key özelliğine aktarılır. Button parametresinin Key özelliğinin içeriğine bakılarak çalışama anında hangi düğmede tıklama yapıldığı öğrenilebilir. Şekil 8.h-19 Forma yerleştirmiş olduğunuz araç çubuğundaki düğmelere çalışma anında tıklama yapıldığı zaman yapılacak işlemleri belirlemek üzere önce program kodu yazılan pencereyi açmanız gerekir. Aşağıda verilen ekran görüntüsünü tasarım anında Toolbar nesnesinin üzerinde çift tıklama yaptıktan sonra aldım. Aşağıda verilen ekran görüntüsünden tespit edebileceğiniz gibi çalışma anında araç çubuğundaki düğmelerden birine tıklama yapmanız halinde ButtonClick yordamı işetilecektir (Şekil 8.h-20). Şekil 8.h-20 Ancak araç çubuğunda birden fazla düğme bulunacağından öncelikle çalışma anında hangi düğmede tıklama yapılmışsa o düğmenin Button nesnesinin Key özelliğine aktarılır. Button 353 parametresinin Key özelliğinin içerisine bakılarak çalışma anında hangi düğmede tıklama yapıldığı öğrenilebilir. Private Sub Toolbar1_ButtonClick(ByVal Button As ComctlLib.Button) Select Case Button.Key Case “Save” MsgBox “Kaydet düğmesinde tıklama yaptınız” End Select End Sub Anlatılan şekilde araç çubuğuna dahil ettiğiniz düğmelerde yapıldığı zaman yapılacak işlemleri veya işletilecek yordamları belirleyebilirsiniz. Eğer araç çubuğundaki düğmelere resimden başka bir düğmenin üzerine bilgi yazacaksanız Toolbar Control Özellikleri diyalog kutusunda Caption özelliğinden yararlanabilirsiniz. Şekil 8.h-21 Aşağıda verilen ekran görüntüsünü hazırlamış olduğum araç çubuğundaki birinci düğme başlık bilgisini girdikten sonra çalışma anında aldım. Düğmeye başlık bilgisi verilence Visual Basic düğmelerinin boyutları yeniden ayarlandı. Anlatılan şekilde projenin formuna araç çubuğu olarak kullanmak üzere istediğiniz sayıda Toolbar nesnesi ve istediğiniz sayıda düğme dahil edebilirsiniz. Hazırlamış olduğunuz bütün araç çubukları aynı anda ekranda göstermek zorunda değilsiniz. Şekil 8.h-22 Bu amaçla yukarıdaki sayfalarda hazırladığım ilk araç çubuğuna veya Toolbar nesnesine “Standart” adını verelim. Ardından projenin formuna “Biçim” adında ikinci bir Toolbar nesnesi dahil edelim. Forma yerleştirdiğim ikinci araç çubuğunda kullanılacak resimler için forma ikinci bir ImageList nesnesi yerleştirelim. Bu işlemlerden sonra diyalog kutusu olarak kullanmak üzere üzerinde çalıştığımız projeye ikinci bir form dahil edelim. Bu forma iki onay kutusu ve iki düğme yerleştirelim (Şekil 8.h-23). 354 Şekil 8.h-23 Başlangıçta her iki araç çubuğu da ekranda görüntülenecek. Ancak bu araç çubuklardan birisi ekrandan kaldırılmak istendiği zaman Görünüm menüsündeki Araç Çubukları komutu verilecek. Araç Çubukları komutu ile Form2 ekrana gelecek. Bu nedenle Görünüm menüsündeki Araç çubuklar komutu için aşağıda ekran görüntüsünü verdiğimiz yordamı hazırlayalım. Private Sub Command1_Click() If Check2.Value = Unchecked Then Toolbar1.Visible = False End If If Check1.Value = Unchecked Then Toolbar2.Visible = False End If End Sub Şekil 8.h-24 Örnek / Kabartma ToolBar Hazırlamak Şekil 8.h-25 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long 355 Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Const Const Const Const WM_USER = &H400 TB_SETSTYLE = WM_USER + 56 TB_GETSTYLE = WM_USER + 57 TBSTYLE_FLAT = &H800 Private Sub SetToolBarFlat(tlbTemp As Toolbar) Dim lngStyle As Long Dim lngResult As Long Dim lngHWND As Long lngHWND = FindWindowEx(tlbTemp.HWnd, 0&, "ToolbarWindow32", vbNullString) lngStyle = SendMessage(lngHWND, TB_GETSTYLE, &O0, &O0) lngStyle = lngStyle Or TBSTYLE_FLAT lngResult = SendMessage(lngHWND, TB_SETSTYLE, 0, lngStyle) tlbTemp.Refresh End Sub Private Sub Form_Load() Call SetToolBarFlat(Toolbar1) End Sub 356 8.i. Ortak- Common Diyalog Kutuları Common Dialog kontrolü projelere otomatik olarak dahil edilmediği için Project menüsündeki Components komutu ile ekrana getirilen Components diyalog kutusundan yararlanmanız gerekir. Şekil 8.i-1 Components diyalog kutusunda Common Dialog kontrolünü temsil eden onay kutusunu seçili duruma getirip tamam düğmesinde tıklama yapacak olursanız üzerinde çalıştığınız projeye Common Dialog kutusu dahil edilir ve Toolbox penceresine Coomon Dialog kontrolünü temsil eden bir düğme yerleştirilir. Şekil 8.i-2 357 Aktif forma eklenen ilk Common Dialog nesnesine CommonDialog1 adı verilmektedir. Çalışma anında CommonDialog nesnesi formun üzerinde görünmez. Projeye eklenen CommonDialog nesnesinden yararlanmak veya Windows’un Yazıcı, Aç ve Font gibi diyalog kutularından birini ekrana getirmek için çalışma anında tanımlı olan Action değişkeninden yararlanılır. Başlangıçta bu değişkenin içeriği 0 ‘dır. Common Dialog nesnesine ait Action değişkeninin içeriği 0 iken projedeki Common nesnesi pasif duruma geçer. Eğer ekrana Yazıcı diyalog kutusunu getirmek istiyorsanız Action değişkenine 5, Aç diyalog Kutusunu getirmek istiyorsanız bu kez Action değişkenine çalışma anında 1 değerini aktarmalısınız. Action değişkeninin alabileceği değerler ve anlamları aşağıdaki tabloda verildiği gibidir. Aç, Farklı kaydet ve Yazıtipi diyalog kutularını ekrana getirmek için CommanDialog nesnesine ait Action özelliğine değer aktarmak yerine ShowOpen, ShowSave, ShowColor, ShowPrint ve ShowFont metolarından yararlanabilirsiniz. Action İçeriği 0 1 2 3 4 5 6 Dialog Kutusu Türü İşlevsiz Dosya Açma Yeni Adla Kaydet Renk Paleti Fontlar Yazdırma Help Setting Description No Action. Displays Open dialog box. Displays Save As dialog box Displays Color dialog box. Displays Font dialog box. Displays Printer dialog box. Runs WINHLP32.EXE ShowOpen ShowSave ShowColor ShowFont ShowPrint 1. Aç Diyalog Kutusu Private Sub DosyaAç_Click() CommonDialog1.Action 1 End Sub Private Sub DosyaAç_Click() = CommonDialog1.ShowOpen End Sub Çalışma anında Dosya Aç başlıklı düğmede tıklama yapılırsa, bu program satırı sayesinde Common Dialog nesnesine ait Action özelliğine 1 değeri aktarılır ve ekrana Aç diyalog kutusu gelir. Common Dialog nesnesi yardımıyla ekrana getirilen diyalog kutularının başlıkları o sırada kullanılan Windows sürümünden etkilenmektedir. 358 Şekil 8.i-3 Aç diyalog kutusunda seçilen dosyanın adı diyalog kutusu nesnesine ait FileName değişkenine aktarılır. Başlangıçta bu değişkenin içeriği boştur. Çalışma anında diyalog kutusunda istenen dosya seçilip Aç düğmesinde tıklama yapılırsa seçilen dosyanın adı bulunduğu sürücü ve klasör adıyla birlikte FileName değişkenine aktarılır. Private Sub Form_Click() MsgBox CommonDialog1.FileName End Sub 2. Flags Özelliği Aç diyalog kutusunda kullanıcının dosya seçip seçmediğini veya diyalog kutusunu iptal düğmesi ile kapatıp kapatmadığını Common Dialog nesnesine ait Flags değişkeninden yararlanarak öğrenebilirsiniz. Başlangıçta 0 değerini içeren Flags değişkenin içeriği çalışma anında Aç diyalog kutusu ile ilgili olarak yapılan işlemlere bağlı olarak güncelleşmektedir. 359 Şekil 8.i-4 Eğer kullanıcı Aç diyalog kutusunu iptal düğmesinde tıklama yapacak olursa Flags değişkeni 0 değerini içermeye devam eder. Eğer Aç diyalog kutusunda bir dosyayı seçip diyalog kutusunu Aç düğmesi ile kapatacak olsaydınız Flags değişkenine bu kez 1024 değeri aktarılırdı. Aç diyalog kutusundaki Salt okunur aç onay kutusunu seçili durumda iken dosya seçimi yapıp diyalog kutusunu Aç düğmesi ile kapatacak olursanız Flags değişkenine bu kez 1025 değeri aktarılır. Private Sub Form_Click() CommonDialog1.ShowOpen MsgBox CommonDialog1.Flags End Sub Common Dialog nesnesi yardımıyla Visual Basic projeleri dahilinde ekranda getirdiğiniz Aç diyalog kutusunda aynı anda birden fazla dosyanın seçilebilmesine imkan sağlamak istiyorsanız tasarım anında Properties penceresinde veya program kodu yazarak çalışma anında Flags özelliğine 512 sayısal değerini aktarmanız gerekir. Aç diyalog kutusu ekrana gelir gelmez hangi tür dosyaların listelenmesini istiyorsanız Properties penceresinde FileName özelliğinden yararlanarak dosya seçimi yapmanız gerekir. 360 Eğer CommonDialog nesnesinin Flags özelliğine 4096 değerini aktarırsanız geçerli sürücü ve klasörde olmayan bir dosyanın adını Dosya adı yazılan metin kutusuna yazıp Aç düğmesine tıklama yaparsanız aşağıdaki gibi bir diyalog kutusu ekrana getirilerek size uyarıda bulunulur. C:\VB5\Adres.txt Bu dosya bulunamadı Doğru yol ve dosya adının verildiğinden emin olun Eğer Flags özelliğinin 8192 değerini içerdiği bir sırada geçerli klasörde olmayan bir dosyanın adını Dosya Adı metin kutusuna doğrudan yazıp Aç düğmesine tıklama yaparsanız aşağıda ekran görüntüsü verilen diyalog kutusu ile Visual Basic size uyarıda bulunur. Aç C:\VB5\Adres.txt Bu dosya yok Yaratmak istiyor musunuz? Evet Şekil 8.i-5 Hayır 3. DialogTitle Özelliği Common Dialog nesnesi aracılığı ile ekrana getirilen diyalog kutusunun başlığı nesneye ait DialogTitle değişkeninde saklanmaktadır. DialogTitle değişkeninin içeriği başlangıçta boştur. Çalışma anında Action değişkenine aktarılan değere bağlı olarak Dialog Title değişkenin içeriği otomatik olarak belirlenir. Şekil 8.i-6 Common nesnesinin Dialog Title özelliğinde program kodu yazarak ta çalışma anında diyalog kutusunun başlığını değiştirebilirsiniz. 361 Private Sub Form_Load() CommonDialog1.DialogTitle = “Dosya Açma” CommonDialog1.Action = 1 End Sub Eğer Aç diyalog kutusunda geçerli sürücü ve klasördeki bütün dosyaların listelenmesini istemiyorsanız Common Dialog nesnesine ait FileName değişkeninden yararlanabilirsiniz. Bunun için tasarım anında Properties penceresinden yararlanarak FileName değişkenin içeriğinde değişiklik yapabilirsiniz. Program kodu yazarakta dosyaları listeleyebilirsiniz. Şekil 8.i-7 Private Sub Form_Load() CommonDialog1.DialogTitle = “Dosya Açma” CommonDialog1.Filename = “*.VBP “ CommonDialog1.Action = 1 End Sub Dosya türü liste kutusu aracılığı istenen dosyaların diyalog kutusu içinde listelenmesi sağlanabilir. Aynı liste kutusunu CommonDialog kontrolü ile ekrana getirilen Aç diyalog kutusunda oluşturmak 362 mümkündür. Bunun için Common kontrolüne ait Filter değişkeninden yararlanılır. Common nesnesine ait Filter değişkeni aşağıdaki şekilde değiştirilip proje çalıştırılacak olursa Aç diyalog kutusunun sol alt köşesindeki liste kutusuna “Text dosyalar” ve “Resimler” adında iki seçenek eklenir. Private Sub Form_Load() Dialog1.Filter =”Text dosyalar _ (*.txt)| .txt|Resimler (.bmp;*.ıco)|*.bmp;*.ıco” Dialog1.Action = 1 End Sub Normal şartlarda Aç diyalog kutusu Common Dialog nesnesi aracılığı ile ekrana getirilirken o sırada geçerli olan sürücü ve klasördeki dosyalar listelenir. Diyalog kutusu ekranda iken kullanıcı sürücü ve klasör seçimi yapılabilir. O anda geçerli olan sürücü ve klasörün adı Common Dialog nesnesine ait InitDir değişkeninde saklanır. Eğer Aç diyalog kutusu ekrana gelir gelmez belirli bir sürücü ve klasördeki dosyaların listelenmesini istiyorsanız söz konusu sürücü ve klasörün adını InitDir değişkenine aktarmalısınız. Private Sub Form_Load() Dialog1.InitDir = “C.\VB5” Dialog1.Action = 1 End Sub Şekil 8.i-8 4. Farklı Kaydet (Save As) Diyalog Kutusu Aç diyalog kutusunda olduğu gibi Word ve Excel gibi programlarda kullanılan Farklı Kaydet diyalog kutusunu ekrana getirmek için yine Common Dialog kontrolünden yararlanılır. Private Sub Form_Load() CommonDialog1.Action = 2 363 End Sub Üzerinde çalıştığınız projenin formunun Form_Load yordamına yazdığınız bu program satırı sayesinde proje çalıştırılır çalıştırılmaz ekrana Farklı Kaydet diyalog kutusu gelir. Kullanıcı kendisinden istediğiniz dosyanın adını doğrudan “Dosya adı” metin kutusuna yazabileceği gibi mevcut dosyalardan birini seçebilir. Dosya adı metin kutusuna doğrudan yazılan veya listelenen dosyaların içinden seçilen dosyanın adı Common Dialog nesnesine ait FileName değişkenine aktarılır. Eğer dosya seçimi yapılıp Farklı Kaydet diyalog kutusunu Kaydet düğmesi ile kapatacak olursanız Flags değişkenine 1024 değeri aktarılır. Eğer diyalog kutusunu İptal düğmesi ile kapatacak olursanız Flags değişkenine bu kez 0 değeri aktarılır. Şekil 8.i-9 Farklı kaydet diyalog kutusunda adı doğrudan girilen dosyalar için varsayılan uzantıyı belirlemek için Common nesnesine ait DefaultExt değişkeninden yararlanılır. Bu değişkenin içeriği başlangıçta boştur (Şekil 8.i-10). 364 Şekil 8.i-10 Farklı Kaydet diyalog kutusunu Kaydet düğmesi ile kapatacak olursanız adını girdiğiniz dosyanın adına DefaultExt değişkenin içeriği eklenir ve FileName değişkenine aktarılır. Benzer diyalog kutusunu Visual Basic projeleri dahilinde ekrana getirmek istiyorsanız Farklı Kaydet diyalog kutusunu ekrana getirmek üzere forma eklemiş olduğunuz CommanDialog nesnesinin Flags özelliğine 2 değerini aktarmanız gerekir. Şekil 8.i-11 365 Farklı Kaydet diyalog kutusunun bu özelliğini anlatmak için Flags değişkenine Properties penceresinden yararlanarak 2 değerini aktardıktan sonra Farklı Kaydet diyalog kutusunu ekrana getirelim. Ardından geçerli klasörde bulunan bir dosyanın adını Dosya adı metin kutusuna yazıp Kaydet düğmesinde tıklama yapınca Visual Basic Şekik 22-12’de verilen diyalog kutusunu ekrana getirir. Şekil 42-12 5. Font- Yazıtipi Diyalog Kutusu Font diyalog kutusunu ekrana getirebilmek için çalışma anında Common nesnesine ait Action özelliğine 4 değerini aktarmak gerekir. Private Sub Fontlar_Click() CommonDialog1.Action = 4 End Sub 366 Bu yordam sayesinde çalışma anında Forma eklenen düğmede tıklama yapılınca ekrana Font ve punto seçimi yapılan diyalog kutusu gelir (Şekil 8.i-13). Şekil 8.i-13 Private Sub Fontlar_Click() CommonDialog1.Action Text1.FontName = = 4 CommonDialog1. FontName Text1.Text = CommonDialog1.FontName End Sub Çalışma anında seçilen fontun adını formdaki metin kutusuna yazarak font düğmesine basarsak Yazıtipi diyalog kutusu fontlar seçilmiş olarak gelir. Bu şekilde font seçimi yapıp Yazıtipi diyalog kutusunu kapatacak olursanız seçtiğiniz font Common nesnesine ait FontName değişkenine aktarılır. Yazıtipi diyalog kutusunda font seçiminden başka punto yani büyüklüğünü belirliyebilir veya font değişikliğinden etkilenecek bilgilerin koyu veya italik olmasını sağlayabilirsiniz. 367 Şekil 8.i-14 Private Sub Fontlar_Click() CommonDialog1.Action = 4 Text1.FontName = Text1.FontSize CommonDialog1. FontName = CommonDialog1. FontSize End Sub Yazıtipi diyalog kutusunda font ve punto değerinden başka Yazıtipi Biçemi (Style) seçilebilmektedir. Eğer tazıtipi biçemi olarak Bold veya Kalını seçip Yazıtipi diyalog kutusunu Tamam düğmesi ile kapatacak olursanız Common nesnesine ait FontBold özelliğine True değeri aktarılır. Benzer şekilde fonta İtalik özelliği verirseniz Common nesnesine ait FontItalic özelliğine mantıksal True değeri aktarılır. Şekil 8.i-15 368 Yazıtipi diyalog kutusunun bir çok özelliğini Properties penceresinde Custom özelliğinden yararlanarak belirliyebilirsiniz. Bu diyalog kutusundaki Min ve Max sayı kutuları ile fontlar için en küçük ve en büyük punto değerleri için sınır değerleri belirlenmektedir. Üstü çizili, Altı çizili ile renk seçimi yapabilmek için Common nesnesine ait Flags özelliğine tasarım anında Properties penceresinden yararlanarak veya program kodu yazarak çalışma anında 258 değerini aktarmanız gerekir. Eğer Yazıtipi diyalog kutusunda yalnızca TrueType teknolojisi ile hazırlanmış fontların listelenmesini istiyorsanız Flags değişkenine 131074 değerini aktarmanız gerekir. Bu değeri Flags değişkenine aktarıp Yazıtipi diyalog kutusunu ekrana getirecek olursanız Etkiler (Effects) adı altında bir araya getirilen seçenekler diyalog kutusundan kaldırılır. Eğer Yazıtipi diyalog kutusunda hem yalnızca TrueType fontların listelenmesini hem de Etkiler adı altında bir araya getirilen seçeneklerin olmasını istiyorsanız 131330 (131074 + 256) değerini aktarmanız gerekir. 6. Print – Yazdır Diyalog Kutusu Yazdır diyalog kutusunu ekrana getirmek için önce o sırada ekranda olacak formun üzerine bir Common Dialog nesnesi yerleştirmeniz gerekir. Ardından çalışma anında Common Dialog nesnesine ait Action değişkenine 5 değerini aktarmanız gerekir. 369 Private Sub Fontlar_Click() CommonDialog1.Action = 5 End Sub Şekil 8.i-16 7. Renk – Color Diyalog Kutusu Yazdırma öncesi kullanıcıya renk seçme şansını vermek istiyorsanız Common Dialog nesnesi yardımıyla ekrana getirilen Renk diyalog kutusundan yararlanabilirsiniz. Özel renk tanımı yapılan kısmın açılıp ekrana gelmesini istiyorsanız Common Dialog nesnesine ait Flags özelliğine Properties penceresinden yararlanarak veya program kodu yazarak 3 değerini aktarmanız gerekir. Private Sub Fontlar_Click() CommonDialog1.Action = 3 End Sub Renk diyalog kutusunun ekrana getirmek için CommonDialog nesnesinin Action özelliğine 3 değerini aktarmak yerine ShowColor methodunu kullanabilirsiniz. Private Sub Fontlar_Click() CommonDialog1.ShowColor End Sub 370 Şekil 8.i-17 Private Sub Form_Click() CommonDialog1.Action= 3 Form1.Backcolor = CommonDialog.Color End Sub Bu yordam sayesinde Renk diyalog kutusunda seçilen renk formun Backcolor özelliğine aktarılacağı için Formun renginde değişiklik meydana getirir. 8.j. Hata Ayıklama · · · · Tanımlanmayan Değişkenleri Belirlemek Breakpointsler İle Kod Bloklarını Kontrol Etmek o Watches İle Değişken Değerlerini Görüntülemek o Program Kodunu İncelemek İçin Kod İçinde Gezmek İleri Hata Ayıklama Araçları Hata Yakalama 371 Tanımlanmayan Değişkenleri Belirlemek Kodlama yaparken şekil 8j.1 de görülen syntax hatalarına benzer hatalar yaptığınızda, geliştirme ortamı hatayı hemen belirler ve size düzeltme imkanı verir. Syntax hataları imal hataları ve Visual Basic sözcüklerinin yanlış yerleştirilmesinden kaynaklanır. Bu tür hataların bulunması ve düzeltilmesi kolaydır. FIGURE 8.j.1 Syntax Hataları Syntax hatalarını otomatik olarak yakalamak için, Tools menüsünün options elemanının seçiminde ekrana gelen diyalog kutusunda Auto Syntax Check onay kutusunun seçili olması gerekir. Option Explicit seçilmemişse Visual Basic size değişkeni tanımlamadan kullanmanıza imkan verir. Form veya Modül’ün general section bölümüne Option Explicit yazarsanız kodunuz içinde kullanacağınız değişkenleri mutlaka Public, Private, Dim, veya Static ile tanımlamanız gerekir. Aşağıdaki örnekte intMyNum değişkeni üzerinde işlemler yapılmış ve sonucu ekranda gösterilmek istenmiş ancak ismi intMyNim şeklinde yanlış yazılmıştır. Eğer Option Explicit seçilmemişse derleme sırasında hata mesajı almazsınız ve programı 372 çalıştırdığınızda size hep 0 değerini verir. Programınız hatasız olmasına rağmen doğru sonucu vermemektedir. Eğer Option Explicit seçilmiş olsaydı değişkenin yanlış yazıldığını “bu değişken tanımlanmamış mesajından” anlayacaktınız. 01 02 03 04 05 06 07 Private Sub cmdUnWit_Click() Dim intMyNum As Integer intMyNum = 2 + 2 MsgBox CStr(intMyNim) End Sub Breakpointsler İle Kod Bloklarını Kontrol Etmek BreakPointler ile Visual Basic kodunuzun çalışmasını istediğiniz noktada durdurabilir ve kodunuzu inceleyebilirsiniz. BreakPointi dört şekilde tanımlayabilirsiniz. · · Programı dudurmak istediğiniz kod satırını işaretleyin ve F9 tuşuna basın. Satır üzerindeyken standart araç çubuğu üzerinde BreakPoint düğmesini tıklayın. · Satır üzerindeyken Debug menüsünden Toggle Breakpoints üzerine tıklayın. · Kod penceresinden ilgili sstırın sağındaki margin üzerine tıklayın. BreakPoint tanımladığınız satırın rengi kırmızı olur. Programı çalıştırdığınızda, breakpoint tanımladığınız satırda program durur ve bu satırın regi sarıya dönüşür. Bu satırın sağında bir ok belirir. Hataların hepsi syntax hataları değildir. Çoğu hata mantık hataları ve yanlış tasarım nedeniyle oluşur. Bu hataları bulmak zordur. Breakpointler kullanarak hatanın oluşabileceğini düşündüğünüz kod alanını daraltabilirsiniz. Programı hatanın olabileceği satırda durdurduktan sonra watchlar kullanılarak hatalı bölge incelenebilir. Watches İle Değişken Değerlerini Görüntülemek Programı durdurduktan sonra herhangi bir değişken üzerinde fare ile bir süre bekledikten sonra küçük bir pencere içerisinde değişkenin değeri görüntülenir. Bazen 373 birden fazla değişkenin değeri incelenmek istenebilir. Bunun için Watch penceresini kullanmak gerekir. 1. Değerlerini görmek istediğiniz değişkenlerin bulunduğu satırlarda breakpoint tanımlayın. 2. Her breakpointte, değerini görüntülemek istediğiniz değişkeni seçin ve farenin sağ tuşuna tıklayın. Gelen menüden Add Watch elemanını seçin. 3. Seçtiğiniz değişkenlerin değerini görebilmek için Wiew menüsünden Watch Window elemanını seçin. Program Kodunu İncelemek İçin Kod İçinde Gezmek BreakPointler konulup program çalıştırıldıktan sonra program ilk breakpointte durur. Debug menüsünde Step Into elemanı veya F8 tuşu ile programın durduğu yerden itibaren satır satır ilerlenir. Eğer satır bir fonksiyon çağrısı ise bundan sonraki adımda çağrılan fonksiyonun içine girilir ve burada satır satır ilerlenir, fonksiyon bitiminde çağıran yordamın ilgili satırın bir alt satırına inilir. Eğer çağrılan fonksiyondan çıkmak isteniyorsa, Ctrl+Shift+F8 tuşuna basılır veya Debug menüsünden Step Out seçilir. Debug menüsünde Step Over elemanı veya Shift+F8 tuşu ile programın durduğu yerden itibaren satır satır ilerlenir. Eğer satır bir fonksiyon çağrısı ise fonksiyonun içine girilmeden fonksiyon çalıştırılarak alt satıra inilir. Satırlar arasında ilerlenirken bazı satırların atlanarak istenen satıra gitmek istenirse, gidilmek istenen satır işaretlenir ve debug menüsünden Run To Cursor seçilir. Tüm breakpointleri kaldırmak istiyorsak Debug menüsünden Clear All Breakpoints elemanını seçeriz. Eğer belirli bir breakpointi kaldırmak istiyorsak, ilgili satırın sağ margini üzerindeki renkli nokta üzerine tıklar veya ilgili satırı işaretleyip Debug menüsünden Toggle Breakpoints elemanını seçeriz. İleri Hata Ayıklama Araçları Bunlardan birincisi Locals window’dur. Scope içerisindeki tüm değişkenler bu pencere içerisinde görünürler. Bu pencereyi aktif hale getirmek için Wiew menüsünden Local Windows seçilir. Basit değişkenler değerleriyle birlikte listelenirler. 374 Nesnelerin yanında bir (+) işareti belirir. Bu işarete tıklarsanız nesnenin özelliklerini görebilirsiniz. ŞEKİL 8.j.2 Locals Window İkincisi Immediate window’dur. Test etmek istediğiniz satırları bu pencerede çalıştırabilirsiniz. Aşağıdaki satırı immediate window içinde yazar enter tuşuna basarsanız: Print 2 * 3 Alt satırda 6 sayısını görürsünüz. Immediate window içerisinde değişken tanımlayamazsınız, scope içerisindeki değişkenleri kullanabilirsiniz. Örneğin programınızı intCounter değişkeninin tanımlandığı bir yordam içerisinde durdurursanız, Immediate window içinde aşağıdaki satırı yazabilir ve sonucunu görebilirsiniz. Print intCounter Immediate window içinde değişkenlere değer atayabilir nesnelerin çeşitli metotlarını çalıştırabilirsiniz. Bu pencerede scope içindeki her satırı çalıştırıp, inceleyebilirsiniz. 375 ŞEKİL 8.j.3 Immediate window e Wiew menüsünden ulaşılabilen Call Stack diyalog kutusunda tüm aktif yordamlar listelenir. Listenin en üstünde programın şu anda işlettiği yordam alttaki satırlarda ise bir üsttekini çağıran yordamlar bulunur. ŞEKİL 8.j.4 Call Stack diyalog kutusu Hata Yakalama Programlar önceden tahmin edilemeyen hatalarla karşılaştığı zaman hatayı yakalayamazlarsa çalışmalarını sonlandırırlar. Bunun için program çalışırken oluşabilecek hataları yakalayan, ilgili hata mesajlarını veren ve programın çalışmasını devam ettirecek kodlara ihtiyaç vardır. Bunlara hata yakalama (error handling-trapping) kodları denir. 376 Visual Basic yardım dosyalarından yakalanacak hataların listesini bulabilirsiniz. Daha sonra bir hata yakalama rutini yazmalısınız. Hata yakalama rutini aşağıdaki şekillerde yazılabilir. On Error GoTo line : Hata oluştuğunda program line etiketli satıra yönelir On Error Resume Next : Hata oluştuğunda program kontrolü bir alt satıra yönelir. Örnek: 01 Private Sub Form_Load() 02 Dim intTest As Integer 03 Dim intRet As Integer 04 On Error GoTo EH 05 intTest = 5 / 0 06 Exit Sub 07 08 EH: 09 If Err.Number = 11 Then 10 MsgBox "Division by zero error occurred.", _ vbCritical 11 End 12 ElseIf Err.Number = 71 Then 13 intRet = MsgBox("That drive is not ready.", _ vbExclamation + vbAbortRetryIgnore) 14 Select Case intRet 15 Case vbRetry 16 Resume 17 Case vbAbort 18 End 19 Case vbIgnore 20 Resume Next 21 End Select 22 ` 23 ` 24 ` 25 End If 26 End Sub Yukarıdaki örnekte on error goto eh şeklinde bir hata yakalama rutini kullanılmıştır. Hata oluştuğu zaman program akışı EH: etiketine yönelecektir. Programda iki türlü hata oluşabileceği değerlendirilmektedir. Eğer 0a bölme hatası varsa 11 nolu hata mesajı verip program sonlandırılacaktır. Eğer sürücünün hazır olmaması hatası ile karşılaşılırsa 71 nolu hata mesajı ile ilgili kod icra edilecektir. 377 9.a. Veri Tabanı Dosyası Hazırlamak Visual Basic programları dahilinde bütün popüler veri tabanı programları tarafından hazırlanan veri tabanı dosyaları incelenebilir. Visual Basic uygulamaları dahilinde mevcut veri tabanı dosyalarını incelemenin dışında veri tabanı dosyaları oluşturulabilir. Visual Basic’in veri tabanı özellikleri ile, Microsoft Access veri tabanı programının ile hemen hemen aynıdır. Visual Basic’in Profesyonel sürümü ile çalışma anında program kodu yazılarak MDB uzantılı veri tabanı dosyası oluşturulabilir. Program kodu yazmadan veri tabanı oluşturmak için Add-Ins menüsündeki Visual Data Manager komutundan yararlanılmaktadır (Şekil 9.a-1). Şekil 9.a-1 Add-Ins menüsünden “Visual Data Manager” komutunu verirseniz Visual Basic ile birlikte verilen Visual Data Manager uygulaması çalışmaya başlar ve ekrana VisData penceresi gelir (Şekil 9.a-2). Şekil 9.a-2 Visual Basic ile birlikte verilen Visual Data Manager ile Access formatında veri tabanı dosyası hazırlanabilir. MDB uzantılı veri tabanı dosyası hazırlamak isteyenler Visual Data Manager yerine Microsoft Access’ten yararlanabilir. Yeni bir MDB dosyası hazırlamak için File menüsündeki New komutundan yararlanılmaktadır. File menüsünden New komutu vermeniz halinde alt menü açılır. Visual Basic ile Access, dBASE, FoxPro ve ParDox formatında dosyalar hazırlayabilirsiniz. 378 Şekil 9.a-2 Access 7.0 versiyonu ile uyumlu bir veri tabanı dosyası hazırlamak istediğiniz takdirde alt menüden Version 7.0 MDB seçilir. MDB dosyası adının ve yazılacağı yerin belirlendiği Select Microsoft Access Database to Create diyalog kutusu ekrana gelir (Şekil 43-3). Buraya dosya adı yazıp Kaydet düğmesine bastıktan sonra ekrana Visual Data Manager penceresi içinde Database Window ve SQL Statement adında iki pencere açılmaktadır. Database Window penceresi içinde, hazırlanan veri tabanı dosyasının özellikleri listelenmektedir. Şekil 9.a-3 Bu diyalog kutusunda oluşturulacak dosyanın adı ve kaydedilecek yer belirlenip Kaydet düğmesinde tıklama yapılırsa, oluşturulacak dosyadan yapısının belirlendiği bir diyalog kutusu ekrana gelir. Veri tabanı dosyasının adını ve kaydedileceği yeri seçip kaydet düğmesinde tıklama yaptığınızda Visual Data Manager penceresi içinde Database Window ve SQL Statement adında iki pencere açılmaktadır. Database Window penceresi içinde, hazırlanan veri tabanı dosyasının özellikleri listelenmektedir. Daha önce dBASE, Clipper veya FoxPro gibi veri tabanı program geliştirme aracı ile DBF veri dosyası kullanmış olanlar için Access uyumlu MDB dosyaları hakkında kısa bir bilgi verelim. 379 dBASE’deki veri tabanı dosyası kavramı ile Access’taki veri tabanı dosyası kavramı birbirinden farklıdır. dBASE’deki veri tabanı dosyası kavramının Access’deki karşılığı Table’dır MDB uzantılı veri tabanı dosyalarında birden fazla DBF gibi dosya veya Table bulabiliriz. Bu bilginin ışığın da Şekil 9.a-4 deki diyalog kutusu incelenirse MDB dosyasına henüz tablo dahil edilmemiş olduğunu tespit edebilirsiniz. Henüz hazırladığımız MDB veri tabanı dosyasına yeni bir Tablo dahil etmek için ilk yapmanız gereken işlem Database Window penceresi içinde farenin sağ tuşu ile tıklama yapmaktır (Şekil 9.a-5). Şekil 9.a-5 Şekil 9.a-6 Henüz tablo içermeyen “BilgiBank” adlı MDB dosyasına yeni bir tablo eklemek için farenin sağ tuşu ile ekrana getirilen kısayol menüsünden New Table komutunu verirseniz, veri tabanı dosyasına dahil edilecek tablonun adının ve kayıt yapısının belirlendiği Table Structure diyalog kutusu ekrana gelir (Şekil 9.a-6). BilgiBank.MDB dosyasına dahil edilecek ilk tablonun adı “Adresler” olsun. Veri tabanı dosyasına dahil etmek istediğiniz tablonun adını Table Name metin kutusuna yazmanız gerekir. Tabloya vermek istediğiniz adı girdikten sonra sıra tablonun kayıt yapısını belirlemeye gelir. DBF dosyasında veya MDB dosyası tablolarında bilgiler kayıtlar şeklinde yer almaktadır. Her kayıt aynı uzunluğa sahiptir. Bir kayıt çok sayıda bilgiden meydana gelebilir. Kayıt bilgilerinin her birine Field (alan) adı verilmektedir. 380 Şekil 9.a-7 Tabloya vermek istediğiniz adı girdikten sonra sıra tablonun kayıt yapısını belirlemeye gelir. DBF dosyasında veya MDB dosyası tablolarında bilgiler kayıtlar şeklinde yer almaktadır. Her kayıt aynı uzunluğa sahiptir. Bir kayıt çok sayıda bilgiden meydana gelebilir. Kayıt bilgilerinin her birine Field (alan) adı verilmektedir. Kayıtta bulunan her bir alan, adı, uzunluğu ve tipi ile tanımlanır. Access tabloları dahilinde aşağıda belirtilen tipte bilgiler kullanılabilir. · · · · · · · · · · · Boolen Byte Integer Long Integer Currency Single Double Date/Time Text Binary Memo Boolean tipli alanlara True, False, Yes, No gibi mantıksal bilgiler aktarılabilir. Bu tip alanların uzunluğu 1 olabilir. Text tipli alanlara en fazla 255 karakter uzunluğundaki karaktersel bilgiler saklanabilir. Memo tipli alanlarda ise en fazla 32KB uzunluğunda metin bilgileri saklanabilir. Örnek olması bakımından BilgiBank.mdb dosyasına dahil etmek istediğimiz Adresler tablosunun bir kaydında aşağıda adları ve tipleri belirtilen bilgiler yer alsın. Alan Adı Ad Alan Tipi Text 381 Alan Uzunluğu 10 Soyad Telefon Adres Sehir Text Text Text Text 15 7 30 15 Kayıtta bulunan her bir alan, adı, uzunluğu ve tipi ile tanımlanır. Hazırlanacak tabloda bulunacak alanların belirlendiği Table Structure diyalog kutusunda tabloya yeni bir alan eklemek için önce Add Field düğmesinde tıklama yapılır (Şekil 9.a-8). Add Field düğmesinde tıklama yapılır. Add Field düğmesinde tıklama yaparsanız tabloya eklenecek alanın adının ve özelliklerinin belirlendiği Add Field diyalog kutusu ekrana gelir. Şekil 9.a-8 Tablo içinde tanımlamak istediğiniz alanın adını Name metin kutusuna yazmalısınız. Alanın başlangıçta Text tipinde 50 karakter genişliğinde olduğu varsayılmaktadır. Eğer daha sonra söz konusu alana sayısal veya karaktersel tipteki bilgiler aktarılacaksa Type liste kutusunda alanın tipini değiştirmeniz gerekir. Type liste kutusu açıldığında Visual Basic tarafından desteklenen alan tiplerini görebilirsiniz (Şekil 9.a-9). Şekil 9.a-9 382 Alanın adının ve tipinin yazımından sonra sıra, alanın genişliğini belirlemeye gelir. Alanın genişliğine yazılabilecek değer ile alanın tipi arasında doğrudan bir bağlantı vardır. Örneğin tabloya eklenen alana tarihsel bilgileri yazmak üzere alan tipi olarak Date/Time seçilirse alan genişliği yazılan Size metin kutusu kullanılmaz duruma gelir. Şekil 9.a-10 “Size” metin kutusuna, çalışma anında veri tabanı dosyası üzerinde işlem yaparken en fazla kaç karakter bilgi yazmak istiyorsanız o değeri yazabilirsiniz (Şekil 9.a-10). Şekil 9.a-11 383 Bu şekilde tabloya istenilen sayıda alan dahil edilebilir.Tabloya ikinci alanı dahil etmek için tekrar Add Fields düğmesinde tıklama yapılıp ekrana Add Field diyalog kutusu getirilir. Özelliklerini belirleyip tabloya dahil ettiğiniz alanı tablodan çıkarmak veya silmek istiyorsanız o alanı seçip Remove Field düğmesinde tıklama yapabilirsiniz. Tablonun yapısını belirledikten sonra Build the Table düğmesinde tıklama yapmanız gerekir (Şekil 9.a-11). Şekil 9.a-12 Daha önce hazırladığınız tablonun özelliklerinde değişiklik yapmak istiyorsanız farenin sağ tuşu ile söz konusu tablonun üzerinde tıklama yapıp tablo ile ilgili kısayol menüsünü ekrana getirmeniz gerekir. 384 Şekil 9.a-13 Eğer tabloyu açıp bilgi girmek istiyorsanız tabloya ait kısayol menüsünden Open, tablonun adını değiştirmek istiyorsanız Rename, tabloyu veri tabanı dosyasından silmek istiyorsanız Delete komutunu verebilirsiniz. Tabloda değişiklik yapmak istiyorsanız Design komutunu verip “Table Structure” diyalog kutusunu ekrana getirirsiniz. Eğer tabloya yeni bir alan dahil etmek istiyorsanız “Table Structure” diyalog kutusundaki Add Field düğmesinde tıklama yapmanız gerekir. Hangi alanı tablodan silmek istiyorsanız Tbale Structure diyalog kutusundaki Fields List liste kutusunda o alanı seçip Remove Field düğmesinde tıklama yapabilirsiniz. 1. Index Hazırlamak Tabloda yer alacak alanları belirleme işleminden sonra en önemli tablo özelliği, tabloda kayıt arama ve sıralama işlemlari yapılırken işe yarayan indexlerdir. Visual Basic dahilinde oluşturulan ve bilgi girilen tablolardan hızlı bir şekilde kayıt okumak, sorgulamalar yapmak için Index dosyalarından yararlanılır. Table Structure diyalog kutusundaki Add Index düğmesine tıklama yapılarak tablodan kayıt okumanın nasıl yapılacağı veya nasıl bir indexleme yapılacağı belirlenir. Add Index düğmesinde tıklama yaparsanız ekrana Add Index diyalog kutusu gelir (Şekil 9.a-14). Şekil 9.a-14 Kayıt aramada kullanılan alanlara Anahtar adı verilmektedir. “Adresler” tablosundan “Soyad” alanına göre arama yapmak istersek Soyad alanını index anahtarı olarak seçelim. Kayıt arama işleminde kullanacağımız indexi tanımlamak için ilk olarak Add Index diyalog kutusunda Indexin adını belirlemeniz gerekir. Indexin adı Name kutusuna yazılmalıdır. Indexin adı Name metin kutusuna yazıldıktan sonra indexe temel oluşturacak alan Available Fields liste kutusunda seçilir (Şekil 9.a-15). 385 Şekil 9.a-15 Indexlemede istenen sayıda alan kullanılabilir. Ancak bu alanların yalnızca birinci (Primary) index olarak kullanılabilir. Burada yalnızca “Soyad” alanı indexlemede kullanılacağı için bu index aynı zamanda Primary Index olarak seçmek üzere diyalog kutusunda bulunan Primary onay kutusu seçili duruma getirilir. Eğer tabloda soyadı (anahtar) aynı olan birden fazla kaydın olmasını istemiyorsanız diyalog kutusundaki Unique onay kutusunu seçili duruma getirmelisiniz. Tablo için ikinci bir indexi tanımlamak istiyorsanız tekrar Add Index düğmesinde ve hazırladığınız indexi silmek istiyorsanız Remove Index düğmesinde tıklama yapabilirsiniz. Bu seçim ve ayarlamalardan sonra OK düğmesinde tıklama yapılınca İndex oluşturulur ve tekrar Structure diyalog kutusuna dönülür. Bu sırada Table Structure diyalog kutusunda hazırlanan indexsin adı yer alır. Şekil 9.a-16 Tablo için ikinci bir indexi tanımlamak istiyorsanız tekrar Add Index düğmesinde ve hazırladığınız indexi silmek istiyorsanız Remove Index düğmesinde tıklama yapabilirsiniz (Şekil 9.a-16). Index 386 hazırlama işlemlerini tamamladıktan sonra Close düğmesinde tıklama yaparak bir tek tablo içeren MDB uzantılı veri tabanı dosyasının hazırlanması işlemi tamamlanmış olur. Dosyanın ve dosyada yer alacak tabloların hazırlanması işleminden sonra Visual Data manager’in File menüsünden Exit komutu verilerek Visual Data Manager’dan çıkabilirsiniz. 2. Veri Tabanı Dosyalarını Açmak Şekil 9.a-17 Tabloya ait kısayol menüsünden Open komutu verirseniz Adresler adlı tablo açılır. Tablo açıldıktan sonra dosyaya yeni kayıt yazabilir, mevcut kayıtlarda değişiklik yapabilir veya istediğiniz kaydı tablodan silebilirsiniz. Update düğmesinde tıklama yapılınca girilen bilgiler tabloya yeni bir kayıt olarak yazılır (Şekil 9.a-17). Şekil 9.a-18 Verilen ekran görüntüsünde tespit edebileceğiniz gibi hazırlanan tablo Database Window penceresinde tablo adının önünde “+” işareti bulunmaktadır. İçinde “+” işareti olan küçük karede tıklama yapıldığı zaman söz konusu tablonun bileşenleri (alanlar, indexler ve özellikler) listelenir. Fields seçeneğinin önünde duran ve üzerinde “+” işareti olan düğmede tıklama yaparsanız tablonun alanları Database Window penceresinde listelenir. Bu şekilde özellikleri listelenen tabloyu istediğiniz gibi değiştirebilirsiniz. 387 9.b. Veri Kontrolü Visual Basic’te veri tabanı dosyaları üzerinde işlem yapmaya yönelik Data adında bir kontrol veya nesne bulunmaktadır. ToolBox penceresinde Data kontrolünü temsil eden d seçili duruma getirilip formun üzerine fare ile sürükleme işlemi yapılınca Forma veri tabanı nesnesi dahil edilir. Forma eklenen ilk veri tabanı nesnesine Data1 adı ve başlığı verilmektedir. Data nesnesine ait Caption değişkenin içeriği veya nesnenin başlığı Properties penceresinde veya çalışma anında değiştirilebilir. Şekil 9.b-1 Data nesnesinde, üzerinde ok işareti olan düğmelerden, veri tabanı dosyasının kayıtları arasında dolaşmak için yararlanılır. Forma eklenen Data nesnesi ile hard diske kaydedilmiş bir veri tabanı doyası arasında bağlantı kurulmadan Data nesnesinin bir işlevi olamaz. Forma eklenen Data nesnesi ile hard diskteki hangi veri tabanı üzerinde işlem yapılacağı Properties penceresinde belirlenir. Bunun için Data nesnesine ait DatabaseName değişkeninden yararlanılır (Şekil 9.b-2). Şekil 9.b-2 Başlangıçta DatabaseName özelliğinin içeriği boştur. Bu sırada Properties penceresinde, üzerinde bulunulan değişkenin içeriğinin yazılı olduğu satırın kenarında bulunan ve üzerinde üç nokta işareti (...) olan düğmede tıklama yapılınca o sırada geçerli sürücü ve klasörde seçilebilecek veri tabanı 388 dosyalarının listelendiği DatabaseName diyalog kutusu ekrana gelir (Şekil 9.b-3). Bağlantı kurmak istediğiniz veri tabanı dosyasının adını ezbere biliyorsanız DatabaseName diyalog kutusunu ekrana getirmeden dosyanın adını doğrudan Properties penceresine yazabilirsiniz. Şekil 9.b-3 DatabaseName diyalog kutusunda “Biblio” adlı MDB uzantılı dosyayı seçelim. Bu diyalog kutusunda veri tabanı dosyası seçimini Aç düğmesinde tıklama yaparsanız seçtiğiniz veri tabanı dosyası ile, forma dahil edilen Data nesnesi arasında bağlantı kurulur. Seçilen veri tabanı dosyasının adı Properties penceresinde DatabaseName özelliğinin karşısına yazılır (Şekil 9.b-4). Şekil 9.b-4 Ancak Data nesnesi ile veri tabanı dosyası arasında kurulan bu bağlantı henüz yeterli değildir. Çünkü MDB uzantılı bir veri tabanı dosyasında birden fazla Table olabilir. Veri tabanı dosyasının hangi tablosundan bilgi okunmak isteniyorsa söz konusu tablonun adı Data nesnesine ait 389 RecordSource değişkenine aktarılır. Bu iki işlemden sonra forma eklenen Data nesnesi ile hard diskteki veri tabanı dosyası arasında bağlantı kurulmuş olunur (Şekil 9.b-5). Şekil 9.b-5 Bir MDB uzantılı veri tabanı dosyası açılıp dosyadaki tablolardan biri seçildiğinde kayıt okuma kafası tablodaki ilk kayda konumlanır. Tablonun açılması ile birlikte kayıt okuma kafasının ilk kayda konumlanması sırasında Data nesnesi ile ilgili olarak Reposition olayı meydana gelir. Bu olaydan yararlanarak formdaki “Data1” nesnesine ait Data1_Reposition yordamına aşağıda verilen program kodlarını ekleyelim. Private Sub Data1_Reposition() Show Cls FontName = "Arial" FontSize = 12 Print "Adı :"; Data1.Recordset.Fields(" Ad ").Value Print "Soyadı :"; Data1.Recordset.Fields("Soyadı").Value Print "Adres :"; Data1.Recordset.Fields("Adres").Value Print "Telefon :"; Data1.Recordset.Fields("Telefon").Value Print "Şehir :"; Data1.Recordset.Fields("Şehir").Value End Sub “Data1” adında bir veri tabanı nesnesi içeren formun dahil olduğu proje çalıştırılınca Şekil 9.b-6’de verilen ekran görüntüsü elde edilir. 390 Şekil 9.b-6 Tablodaki bir kaydın hepsine birden RecordSet adı verilmektedir. Kaydın hangi alanı üzerinde işlem yapılmak isteniyorsa o alanın adı Fields özelliğine parametre olarak verilir. Alanın içeriği ise Value değişkeninde saklanır. Bu işlem sırasında Reposition olayı meydana geldiği için Şekil 9.b-6’da ekran görüntüsü verilen yordam tekrar işletilir ve tablodaki bir sonraki kaydın içeriği formun üzerine yazılır. Bu sırada Data nesnesinde üzerinde ucu sağa bakan ok işareti olan düğmede tıklama yapacak olursanız, seçilen tablodaki bir sonraki kayıt aktif olur. Data nesnesinin düğmelerinden yararlanmadan tablodaki kayıtların arasında dolaşabilirsiniz. MDB uzantılı veri tabanı dosyalarının tablolarında bir sonraki kayda gitmek için MoveNext methodundan yararlanılmaktadır. Private Sub Form_Click() Data1.Recordset.MoveNext End Sub Buna göre çalışma anında formun üzerinde herhangi bir yerde tıklama yapılınca kayıt okuma kafası tablodaki bir sonraki kaydın üzerine gider. Kayıt okuma kafasının yer değiştirmesi ile birlikte Reposition olayı meydana geldiği için Data1.Reposition yordamı bir kez daha işletilir ve aktif kaydın içeriği ekrana yazılır. İşe yarar programlar yazarken bu teknikle veri tabanı dosyalarını incelemek veya kayıtların arsında bu şekilde dolaşmak pratik değildir. Çünkü Visual Basic, veri tabanı dosyalarını inceleme ve üzerinde işlem yapmak için henüz anlatılmayan bir çok kolaylıklar sağlamaktadır. Veri tabanı dosyasındaki bilgileri formun üzerine yazmak için TextBox kontrolünden yararlanılmaktadır. TextBox nesnelerinin DataFields özelliğinden yararlanarak, seçilen tablonun alanı ile TextBox nesnesi arasında bağlantı kurulmaktadır. Şekil 9.b-7’de verilen ekran görüntüsünü aldığımız sırada tasarım anında forma yerleştirmiş olduğum TextBox nesnesi seçili durumdaydı. 391 Şekil 9.b-7 TextBox’ların DataField özelliği, üzerinde çalışılan projede bir Data nesnesi olduğu zaman anlamlıdır. Data nesnesi ile birlikte TextBox’lardan başla Image, Label ve Picture Box kontrolleri kullanılabilir. Properties penceresinde “Data1” nesnesinin DatabaseName özelliğine “Müşteri.mdb” ve RecordSource özelliğine ise “Adresler” tablosunun adını aktaralım. Bu iki işlem veya seçim yardımıyla formdaki Data1 nesnesi ile hard diskteki “Müşteri.mdb” dosyası arsında bağlantı kurulmuş oldu. Şimdi formdaki TextBox’larla “Data1” nesnesi arasında bağlantı kuralım. Formlarda birden fazla Data nesnesini dahil etme imkanı olduğu için TextBox ile hangi Data nesnesi arasında bağlantı kurulmak isteniyorsa TextBox’ın DataSource özelliğine ilgili Data nesnesinin adı aktarılmaktadır (Şekil 9.b-8). Şekil 9.b-8 Bu seçim sayesinde formdaki Data nesnesi ile TextBox arasında kurulan bağlantı yeterli değildir. Ayrıca söz konusu TextBox’ın tablodaki bir alanla ilişkilendirilmesi gerekir. Properties penceresinde 392 formdaki ilk TextBox’a ait DataField özelliği üzerinde tıklama yapınca ekrana “Adresler” tablosunda bulunan alanların adları listelendi (Şekil 9.b-9). Şekil 9.b-9 Formdaki ilk TextBox’ı “Adresler” tablosundaki “Ad” alanı ile ilişkilendirmek istediğim için bu lidteden “Ad” alanını seçtim. Formdaki her TextBox için DataSource ve DataFielde seçimi yapılıp proje çalıştırılırsa aşağıda verilen ekran görüntüsü elde edilir (Şekil 9.b-10). Şekil 9.b-10 Bu kayıtta istenilen değişiklik yapılabilir. Kayıtta yapılan değişikliklerin hard diskteki dosyaya yazılması veya kaydın güncelleştirilmesi konusunda kullanıcının ek işlem yapmasına gerek yoktur. Çalışma anında Data nesnesinin üzerinde ucu sağa bakan ok işareti olan düğmede tıklama yapılınca “Adresler” tablosunda bulunan bir sonraki kaydın bütün alanları otomatik olarak TextBox’lara aktarılır. 393 Şimdiye kadar verilen ekran görüntülerinden tespit etmiş olduğunuz gibi Data nesnesinin üzerine nesnenin adı yazılmaktadır. Data nesnesinin Caption özelliğinden yararlanarak Data nesnesinin üzerine yazılacak bilgiyi belirleyebilirsiniz (Şekil 9.b-11). Şekil 9.b-11 1. Tablodaki Kayıtların Arasında Dolaşmak Yukarıda verilen örnekte kayıtlar arasında dolaşmak için Data nesnesinde bulunan düğmelerden yararlanılıyordu. Programcının kayıtlar arasında dolaşmak için ek bir işlem yapmasına gerek yoktur. Data nesnesine ait düğmelerden yararlanmadan “Adresler” tablosunun kayıtları arasında dolaşmak için üzerinde çalışılan projenin formuna Sonraki, Önceki ve EnSon adında üç düğme yerleştirelim (Şekil 9.b-12). 394 Şekil 9.b-12 RecordSet nesnesine tablodaki bir sonraki kaydın içeriğini aktarmak için MoveNext methodundan yararlanılır. MoveNext methodu kayıt okuma kafasını bir sonraki kaydın üzerine taşırken MovePrevious methodu kayıt okuma kafasını bir önceki kayda konumlandırır. Private Sub Sonraki_Click() Data1.Recordset.MoveNext End Sub Private Sub Önceki_Click() Data1.Recordset.MovePrevious End Sub Kayıt okuma kafasını tablodaki ilk kayda konumlandırmak için MoveFirst, en son kayda konumlandırmak için MoveLast methodundan yararlanılır. “Data1” nesnesinin formun üzerinde görünmesine gerek yoktur. Bu nedenle çalışma anında etkili olmak üzere Properties penceresinde Data nesnesine ait Visible özelliğinin içeriği False yapılmalıdır (Şekil 9.b-13). Şekil 9.b-13 Data nesnesini temsil eden düğmeler ekranda görünür durumda iken kullanıcı en son kaydın üzerindeyken bir sonraki kayda gitmeye neden olan düğmede tıklama yapacak olursa Visual Basic her 395 hangi bir tepkide bulunmaz. Ancak kayıtlar arasında dolaşmak için forma eklenen düğmeler kullanılmak istendiği zaman, dolayısıyla program kodu yazılarak kayıtlar arasında dolaşmak istendiği zaman sorunlar çıkar. İlk kaydın üzerinde iken Data nesnesine tekrar MovePrevious methodu uygulanırsa programın çalışması kırılır. Eğer kayıtlar arasında program kodu yazarak dolaşmak istiyorsanız bazı önlemler almanız gerekir. Bunun için RecordSet nesnesinin BOF ve EOF özelliklerinden yararlanılmalıdır. Private Sub Önceki_Click() İf Data1.RecordSet.BOF Then MsgBox “Tablonun ilk kaydının üzerindesiniz” Else Data1.Recordset.MovePrevious End If End Sub Diğer yandan Data nesnesinin BOFAction ve EOFAction özelliklerinden yararlanarak herhangi bir teknikle dosyanın sonuna veya başına gidildiğinde Data nesnesinin nasıl davranması gerektiğini belirleyebilirsiniz. Şekil 9.b-14 EOFAction özelliği başlangıçta Move Last değerini içerdiği için dosyanın veya tablonun en son kaydının üzerinde iken MoveNext methodunu kullanmanız halinde Visual Basic bir tepkide bulunmaz ve tablodaki en son kayıt aktif kayıt olma özelliğini korur. Ancak Data nesnesinin EOFAction özelliğine “EOF” değerini aktaracak olursanız, tablonun en son kaydının üzerinde ikem MoveNext methodunu kullanmanız halinde kayıt okuma kafası tablonun sonuna gider ve ekranda görüntülenen herhangi bir kayıt olmaz. EOFAction özelliğinin işlevini tam olarak anlamak için üzerinde çalıştığımız projenin formuna yerleştirmiş olduğumuz Data nesnesinin EOFAction özelliğine EOF değerini aktaralım. Ardından 396 tablodaki en son kaydı aktif duruma getirelim. Bu sırada Sonraki Kayıt düğmesinde tıklama yapıp MoveNext metodunun kullanıldığı yordam işletilecek olunursa dosyanın sonuna gidilir. Accees uyumlu veri tabanı dosyasında her tablonun sonunda EOF ve başında BOF olarak adlandırılan bir bölge bulunmaktadır. Şekil 9.b-15’de verilen ekran görüntüsü Adresler tablosundaki en son kayıt aktif kayıt durumunda iken “Sonraki Kayıt” başlıklı düğmede tıklama yapıp MoveNext metodu işletildikten sonra alınmıştır. Şekil 9.b-15 Eğer Data nesnesinin EOFAction özelliğine Add New değerini aktaracak olursanız tablodaki en son kayıt aktif durumda iken MoveNext metodunu işletecek olursanız sanki AddNew metodu kullanılmış gibi tablonun sonuna boş bir kayıt eklenir. Benzer şekilde Data nesnesinin BOFAction özelliğinden yararlanıp tablodaki ilk kaydın üzerinde iken MovePrevius metodu kullanıldığı zaman Visual Basic’ın nasıl davranması gerektiğini belirleyebilirsiniz. BOFAction özelliği başlangıçta Move First bilgisini içerdiği için ilk kaydın üzerinde iken MovePrevious metodunu işletecek olursanız Visual Basic size bir tepkide bulunmaz. Data nesnesinin BOFAction özelliğine BOF değerini aktaracak olursanız tablodaki ilk kaydın üzerinde iken Move Previous metodu bir önceki kayda gitmek istemeniz halinde tablonun BOF olarak adlandırılan kısmına gidilir (Şekil 9.b-16). 397 Şekil 9.b-16 2. Tabloya Yeni Kayıt Girmek ve Kayıt Silmek Tablonun üzerinde bulunan kaydı silmek veya tablodan çıkarmak için Delete methodundan yararlanılır. Ancak dosyadan Delete methodu ile yapılan kayıt silme işlemi sonrası Data nesnesi ile ilişkilendirilen söz konusu nesnelerin içerikleri güncelleşmez. Bunun için bazı ek işlemlerin yapılması gerekir. Bu amaçla ReFresh veya aktif kaydı değiştiren MovePrevious gibi bir methodun kullanılması gerekir. Private Sub Sil_Click() Data1.Recordset.Delete Data1.Recordset.MovePrevious End Sub Üzerinde çalışılan veri tabanı dosyasının Data nesnesi ile erişim sağlanan tablosuna yeni bir kayıt eklemek için AddNew methodundan yararlanılır. Private Sub Yeni_Click() Data1.Recordset.AddNew 398 End Sub Formdaki Yeni Kayıt başlıklı düğmede tıklama yapılınca tablonun sonuna boş bir kayıt eklenir (Şekil 9.b-17). Tablonun sonuna eklenen bu kayda ekrandaki TextBox’lar aracılığı ile bilgi girilir. Ancak AddNew methodu ile tablonun sonuna boş bir kayıt eklemeden önce kullanıcıdan MsgBox() fonksiyonu yardımıyla onay alabilirsiniz. Şekil 9.b-17 Eğer Data nesnesi ile erişim sağlamak istediğimiz tabloda herhangi bir kayıt yoksa, forma yerleştirilen metin kutularının içerikleri boş olur. Ayrıca bu sırada Data nesnesi işlevsizleşir. Bu durumda ilk olarak tabloya AddNew methodu ile yeni bir kayıt eklemek gerekebilir. 3. CancelUpdate Metodu İle Kayıt Girişi İptali Yukarıdaki sayfalarda anlatıldığı gibi AddNew metodu ile tablonun sonuna eklenen boş kaydın alanlarına bilgi girilip başka bir kaydın üzerine gidilmesi halinde kendiliğinden güncelleşmektedir. AddNew metodu kullandıktan sonra pişman olrsanız CancelUpdate metodu ile tablonun sonuna eklemiş olduğunuz kaydı silebilirsiniz. CancelUpdate metodunun işlevini görmek için üzerinde çalıştığımız projenin formuna “Vazgeç” başlıklı düğme yerleştirelim. Ardından bu düğmenin Click yordamına CancelUpdate medodunu içeren bir program satırı yazalım. Private Sub Vazgeç_Click() Data1.Recordset. CancelUpdate End Sub Bu program satırı sayesinde AddNew medodu ile dosyanın sonuna eklenen kayıt silinir. Bu sırada başka bir kaydın üzerine gidilmesi halinde dosyanın sonuna eklenen kayıt güncelleşir. 399 4. Edit Metodu ve Mode Özelliği Şimdiye kadar verilen bilgilerden bildiğiniz gibi Data kontrolü ile erişim sağlamanın tablolar üzerinde herhangi bir hazırlık yapmadan değişiklik yapmak mümkündür. Formdaki metin kutuları ile tablodaki alanlar arasında bağlantı kurulduğu için metin kutularında yapılan değişiklikler anında tabloya yansıtılmaktadır. Ancak aktif kayıtta yaptığınız değişiklikleri CancelUpdate metodu ile iptal edebilmek istiyorsanız aktif kayıtta değişiklik yapmaya başlamadan önce Edit metodu ile Edit moduna geçmeniz gerekir. Aşağıda verilen program kodu sayesinde çalışma anında formun üzerinde tıklama yapıldığı zaman edit moduna geçilir. Private Sub Form_Click() Data1.Edit End Sub Edit formunda iken aktif kayıtta yaptığınız değişiklikleri CanselUpdate metodu ile iptal edebilirsiniz. Eğer Edit moduna geçilmeden kullanıcının aktif kayıtta değişiklik yapmasına izin vermek istemiyorsanız Data nesnesinin ReadOnly özelliğinden yararlanabilirsiniz. Bu özelliği anlamak için önce formun Click yordamına aşağıda ekran görüntüsü verilen iki program satırı yazalım. Private Sub Form_Click() Data1.ReadOnly = True Data1.Refresh End Sub Çalışma anında formun üzerinde tıklama yapılıp bu yordam işletilirse Data nesnesinin ReadOnly özelliği True yapılarak Data nesnesi ile erişim sağlanan tabloda değişiklik yapılması engellenir. Ancak Read Only özelliğinin devreye girmesi için Refresh metodunun kullanılması gerekmektedir. Ancak kullanıcı aktif kayıtta değişiklik yapmak istediği zaman forma yerleştirmiş olduğumuz “Düzenle” başlıklı düğmede tıklama yapacaktır. Düzenle başlıklı düğmenin Click yordamında önce Data nesnesinin ReadOnly özelliğinde yapılan değişikliğin etkili olmasını sağlamak için ayrıca ReFresh metodunun kullanılması gerektiğini biliyorsunuz. “Düzenle” başlıklı düğme için yazılan program kodlarında Data nesnesinin ReadOnly özelliği kaldırıldıktan sonra Edit metodu edit moduna geçilmekte ve UpdateRecord metodu aktif kaydın son hali tabloya yazılmaktadır. Private Sub Düzenle_Click() Data1.ReadOnly = False Data1.Refresh Data1.Recordset.Edit 400 Data1.Recordset.Update End Sub Üzerinde bulunulan kayıtla ilgili olarak o sırda yapılan işlemler hakkında bilgi edinmek için Data nesnesinin EditMode özelliğine bakabilirsiniz. Aktif kayıt üzerinde herhangi bir işlemin yapılmadığı anlamda EditMode özelliği 0 değerini içermektedir. Edit metodu ile edit modunda iken EditMode özelliğine 1 değeri aktarılmaktadır. Eğer AddNew metodu dosyanın sonuna henüz eklenen kaydın üzerinde bulunuyorsa EditMode özelliği 2 değerini içermektedir. 5. Validate Olayı Data nesnesi ile ilgili olarak yapılan MoveNext, MoveLast, AddNew, Delete vb. olaylardan önce Validate olayı meydana gelmekte veya Data nesnesine ait Validate yordamına yazılmış olan program satırları varsa işletilmektedir. Data nesnesi üzerinde yapılan işlemlerden önce onay alma veya uyarma gibi bütün işlemlerin Validate olayından yararlanılarak yapılması önerilmektedir. Validate yordamı dışarıdan Action ve Save adında iki parametre almaktadır. Private Sub Data1_Validate(Action As Integer, Save As Integer) End Sub Action adlı ilk parametre ile Validate olayının meydana gelmesine neden olan olayın hangisi olduğu öğrenilir. Örneğin Data nesnesindeki bir sonraki kayda gitmek üzere MoveNext methodu kullanılırsa, bir sonraki kayda gitmeden önce Validate olayını temsil eden yordam işletilir ve bu yordama Action parametresi ile 3 sayısal değeri gönderilir. Data nesnesine Delete methodu uygulanmak istenirse silme işlemi öncesinde Data nesnesine ait Validate yordamı otomatik olarak işletilir. Bu sırada Validate yordamına Delete methodunu temsilen 7 sayısal değeri gönderilir. Private Sub Data1_Validate(Action As Integer, Save As Integer) If Action = 7 Then Cevap 0 MsgBox (“Bu kayıt dosyadan silinsin mi ?”,4) If Cevap = 7 Then Action = 0 End If End If End Sub Validate olayı meydana geldiği zaman işletilecek bu yordama önce yordama ait Action adlı parametrenin içeriği kontrol edilir. Tablodan Delete methodu ile kayıt silme işlemi yapılmak istendiği zaman Action parametresine 7 sayısal değeri aktarılıp Validate yordamı ondan sonra işletilir. Bunu şöyle anlatmak gerekir; Eğer Action parametresinin veya değişkenin içeriği 7 ise kullanıcı veri tabanı dosyasından kayıt silmek istemiştir. Programcı bu sonuçtan yola çıkarak kullanıcıyı olası yanlışlıklarda konusunda uyarır. Çalışma anında üzerinde çalıştığımız projenin “Kayıt Sil” başlıklı düğmede tıklama yapılınca aşağıdaki ekran görüntüsü elde edilir (Şekil 9.b-18). 401 Şekil 9.b-18 MsgBox fonksiyonu ile ekrana getirilen bu diyalog kutusunda kullanıcı kayıt silme işlemini onaylıyorsa ek işlem yapmadan yordamdan çıkılır ve daha sonra kayıt silme işlemi planlanan biçimde gerçekleşir. Eğer kayıt silme işlemi yapılmak istenmiyorsa Action değişkenine 0 değeri aktarılmaktadır. Action değişkeninin içeriği 0 iken Data nesnesi üzerinde o sırada herhangi bir işlem yapılmaz. Ancak kullanıcının Data nesnesi üzerinde başka bir işlem yapma isteği ile birlikte Action değişkeninin içeriği kendiliğinden tekrar güncelleşir. Action Değişkeninin İçeriği Data Nesnesi Üzerine Yapılmak İstenen İşlem 1 MoveFirst ile dosyadaki ilk kayda gitmek 2 MovePrevious ile bir önceki kayda gitmek 3 MoveNext ile bir sonraki kayda gitmek 4 MoveLast ile dosyadaki en son kayda gitmek 5 AddNew ile dosyaya yeni bir kayıt yazmak 6 Update ile güncelleme yapmak 7 Delete ile dosyadan kayıt silmek 8 Find ile kayıt arama işlemi yapmak 9 Bookmark ile kayıt işaretleme 10 Close ile dosyayı kapatmak 11 UnLoad ile Formu dolayısıyla dosyayı bellekten silmek 6. Tabloda Kayıt Aramak Data kontrolü ile erişim sağlanan tablodan istenen bir kaydı aramak için FindFirst, FindNext, FindLast ve FindPrevious metodları kullanılmaktadır. Yukarıdaki hazırlamış olan forma önce “Kayıt Arama” başlığına sahip bir düğme yerleştirelim (Şekil 9.b-19). 402 Şekil 9.b-19 Çalışma anında Kayıt Arama başlığına sahip düğmede tıklama yapıldığı zaman InputBox fonksiyonu ile bir diyalog kutusu ekrana getirilecek. InputBox fonksiyonu ile ekrana getirilen diyalog kutusunda Soyadı girilen kişiye ait bilgiler Adresler tablosundan aranıp ekrana getirilecektir. Bu işlemleri yapacak program satırlarını Kayıt Arama başlıklı düğmenin Click yordamına yazalım. Private Sub Arama_Click() Soyadı$ = InputBox ( “ Aranan kişinin soyadı : ”) Ölçüt = “Soyadı = ’ “ & Soyadı$ Data1.Recordset.FindFirst Ölçüt End Sub Şekil 9.b-20 403 &“ ’ ” Çalışma anında Kayıt Arama başlıklı düğmede tıklama yapılırsa , InputBox fonksiyonu tarafından aranacak soyadı bilgisini girebileceğiniz bir diyalog kutusu ekrana getirilir (Şekil 9.b-20). InputBox fonksiyonu ile ekrana getirilen diyalog kutusuna girilen bilgi Soyadı$ değişkenine aktarılmaktadır. (Şekil 9.b-21). Şekil 9.b-21 FindFirst metodu ile arama yapmadan önce tablodan aranacak bilginin veya kayıt arama ölçütünün tanımlanması gerekir. Ölçüt tanımı yapılan satırdaki “Soyadı”, tabloda aramaya temel oluşturan alandır. Eğer “Adı” alanına göre arama yapmak istemiş olunsaydı Arama_Click yordamı aşağıdaki gibi düzenlenir. Private Sub Arama_Click() Soyadı$ = InputBox ( “ Aranan kişinin adı : ”) Ölçüt = “Adı = ’ “ & Soyadı$ &“ ’ ” Data1.Recordset.FindFirst Ölçüt End Sub Eğer Data kontrolü erişim sağladığımız tabloda aynı soyada sahip birden fazla kayıt olaydı, FindFirst metodu ile ilk kaydı bulduktan sonra aynı soyada sahip ikinci ve üçüncü kaydı bulmak için FindNext metodunu kullanılır. Private Sub Tekrar_Click() Data1.Recordset.FindNext Ölçüt End Sub 404 Yukarıdaki sayfada aranacak kayıtla ilgili bilgi içeren Ölçüt değişkenini Arama_Click() yordamı içinde herhangi bir bildiri deyimini kullanmadan tanımladığımız için bu değişkeni başka yordamlarda kullanmak mümkün değildir. Bu nedenle formun Declaration kısmında Ölçüt değişkenini String bildiri deyimini kullanarak tanımlandı. 7. Dosyayı Başka Kullanıcılara kapatmak (Exclusive Özelliği) Çok kullanıcılı ortamlarda üzerinde çalıştığınız veya açmak istediğiniz dosyanın başka bir kullanıcı tarafından açılıp üzerinde işlem yapılmasını istemiyorsanız Table nesnesine ait Exlusive özelliğinden yararlanabilirsiniz. Başlangıçta Data nesnesinin Exlusive özelliği False değerini içerdiği için dosyaya başka bir kullanıcı başka bir teknik veya programla erişim sağlayabilir (Şekil 9.b-22). Şekil 9.b-22 Başlangıçta Data nesnesinin ReadOnly değişkeni False değerini içerdiği için tablonun kayıtlarında istenen değişiklik yapılabilir. Data nesnesinin ReadOnly özelliğinin içeriği çalışma anında program kodu yazılarak değiştirilebilir. Private Sub Form_Load() Data1.ReadOnly = True End Sub Veri tabanı dosyası tablosunun kayıtlarında değişiklik yapılmasını istemiyorsanız Properties penceresinde Data nesnesine ait ReadOnly değişkenine True değerini aktarmanız yeterlidir (Şekil 9.b23). 405 Şekil 9.b-23 8. Options Özelliği İle tabloları Kontrol Altına Almak Yukarıdaki sayfalarda anlatıldığı gibi Exclusive özelliği ile tabloya başka kullanıcının erişim sağlamasını engellemek mümkündür. Ayrıca ReadOnly özelliği ile tablodaki kayıtlarda değişiklik yapısında değişikliğe izin vermeyebilirsiniz. Ancak Exclusive özelliği çok kullanıcılı ortamlarda yeterli olmaz. Çünkü aynı tabloya birden fazla kullanıcı kayıt girişi yapabilir veya birisi kayıt girişi yaparken mevcut kayıtlarda değişiklik yapmak isteyebilir. Bu gibi durumlarda Options özelliğinden yararlanılmaktadır. Options özelliği başlangıçta 0 değerini içermektedir (Şekil 9.b-24). Şekil 9.b-24 Options özelliği 0 değerini içerirken Data kontrolü ile erişim sağladığım tablo üzerinde istediğiniz işlemi yapabilirsiniz. Eğer Options özelliğine 1 değerini aktaracak olursanız çok kullanıcılı ortamlarda 406 başka kullanıcılar tablonun içeriğinde değişiklik yapamazlar. Benzer şekilde Options özelliğine 2 değerini aktaracak olursanız diğer kullanıcılar tabloyu açıp inceleyemezler. 9. Veri Tabanı Dosyası Formatını Seçmek Formlara eklenen Data nesnesi aracılığı ile erişim sağlanan veri tabanı dosyasının tipi veya ait olduğu veri tabanı programının adı Data nesnesine ait Connect değişkeninde tutulur. Başlangıçta Data kontrolü ile erişim sağlanmak istenen veri tabanı Access ile hazırlanmış olduğu varsayılmaktadır (Şekil 9.b-25). Şekil 9.b-25 Eğer erişim sağlanan veri tabanı dosyası Access formatında ise Connect değişkenine dosyanın kaynağı aktarılmaz. Dsoya dBASE IV formatında ise “dBASE IV”, Paradox formatında ise “Parafdox” ve FoxPro2.5 formatında ise FoxPro 2.5 bilgisi aktarılır. 10. Tablodaki Kayıt Sayısını Öğrenmek Data nesnesi yardımıyla erişim sağladığınız tablonun aktif kaydının numarası RecordSet nesnesinin RecordCount özelliğinde saklanmaktadır. Private Sub Form_Click() MsgBox Data1.Recordset.RecordCount End Sub 407 Diğer yandan Data nesnesi ile erişim sağlanan tablodaki aktif kaydın numarası AbsolutePosition özelliğinde saklanmaktadır. Bu özellikten yararlanarak Data nesnesinin başlığına aktif kaydın ve toplam kayıt numarasını yazabilirsiniz. Bu işlemi yapmak üzere aşağıda ekran görüntüsü verilen program satırlarını görelim. RecordSet nesnesinin AbsolutePosition özelliği tablodaki kayıtları 0’dan başlayarak numaraladığı için bu özelliğe “1” değeri eklenir. Private Sub Data1_Reposition() KayıtNo = Data1.Recordset.AbsolutePosition KayıtSayı = Data1.Recordset.RecordCount Data1.Caption = Str(KayıtNo +1) + “/” + Str (KayıtSayı) End Sub Şekil 9.b-26 Bu program satırları sayesinde erişim sağlanan tablodaki aktif kaydın numarası ile birlikte tablodaki toplam kayıt sayısı Data nesnesinin Caption özelliğine yazılır. 11. BookMark Özelliği İle kayıt İşaretlemek Bazen bir kaydın üzerinde işlem yapmaya başlamadan önce söz konusu tabloda veya başka bir tabloda başka bir kayda gidip gelme ihtiyacı duyulur. Bu gibi durumlarda tekrar dönülüp üzerinde işlem yapılmak istenen kayıt BookMark özelliği ile işaretlenir. BookMark özelliğinin işlevsiz anlatılmak için üzerinde çalıştığımız projenin formuna “İşaretle” ve “İşaretli kayda Git” başlığına sahip iki düğme yerleştirelim (Şekil 9.b-27). 408 Şekil 9.b-27 Çalışma anında “İşaretle” başlıklı düğmede tıklama yapıldığında aktif kayıt işaretlenecek. Ancak BookMark medonunun geriye gönderdiği değeri bir değişkende tutmak gerekir. Bu amaçla formun (Declaration) kısmında “Konum” adında Variant tipinde bir değişken tanımlayalım. Dim Ölçüt As String Dim Konum As Variant Bu değişkeni form dahilinde değişik yordamlarda kullanabilmek için formun Declaration kısmında tanımladım. Çalışma anında BookMark metodu ile işaretlenen kayda ait bilgi bu değişkende saklanacak. BookMark metodunun kullanılış biçimini aşağıda görebilirsiniz. Private Sub İşaretle_Click() Konum = Data1.Recordset.Bookmark End Sub Çalışma anında “İşaretle” başlıklı düğmede tıklama yapılırsa aktif kayıt işaretlenir ve işaretleme ile bilgi “Konum” değişkenine aktarılır. İşaretleme işleminden sonra herhangi bir teknikle tablodaki istenen kaydın üzerine gidilip işaretli Kayda Git düğmesinde tıklama yapıldığı zaman, işaretlenen kaydın aktif kayıt yapılmasını sağlamak için bu kez BookMark metodunun aşağıda gibi kullanılması gerekir. Private Sub Git_Click() Data1.Recordset.Bookmark = Konum 409 End Sub Şekil 9.b-28 9.c. Veri Form Sihirbazı ile Form Hazırlamak Tablolara bilgi girişi sırasında kullanmanız gereken formu ve gerekli ayarlamaları Data Form Wizard yardımı ile otomatik olarak hazırlayabilirsiniz. Data Form Wizard başlatmada kullanılan komut Add-Ins menüsünde bulunmaktadır. Ancak aşağıda verilen ekran görüntüsünde görebileceğiniz gibi başlangıçta Add-Ins menüsünde Data Form Wizard adında herhangi bir komut yoktur (Şekil 9.c1). 410 Şekil 9.c-1 Eğer Add-Ins menüsünde Data Form Designer komutu yoksa önce Add-Ins menüsünden AddManager komutunu vererek Data Form Wizard’ın Add-Ins menüsünde bir komut ile temsil edilmesini sağlamanız gerekir. Add-Ins menüsünden Add-Ins komutunu verecek olursanız ekrana Add-In Manager diyalog kutusu gelir (Şekil 9.c-2). Şekil 9.c-2 Add-In Manager diyalog kutusunda Visual Basic ile birlikte verilen yardımcı program ve Wizard’lar listelenmektedir. Bu diyalog kutusundaki VB 6 Data Form Wizard seçeneğinin üzerinde iken Loaded/Unloaded onay kutusunu seçili duruma getirecek olursanız, veri giriş formu hazırlamada kullanılan Data Form Wizard sihirbazı Add-Ins menüsünde bir komut ile temsil edilir (Şekil 9.c-3). Şekil 9.c-3 411 Daha önceki konulardan bildiğiniz gibi üzerinde çalıştığınız prıjeye yeni bir form dahil etmek için Project menüsünden Add Form komutunu verdiğiniz zaman ekrana form tipi seçimi yapılan Add Form diyalog kutusu gelmektedir (Şekil 9.c-4). Şekil 9.c-4 Eğer Data Form Wizard’dan yararlanarak bir veri giriş ve görüntüleme formu hazırlamak istiyorsanız Add- Ins menüsünden komut vermek yerine Add Form diyalog kutusundan yararlanabilirsiniz. Add Form diyalog kutusunda VB Data Form Wizard seçeneğini seçip Aç düğmesinde tıklama yaparsanız Data Form Wizard çalışmaya başlar. Daha önce hazırladığımız “Adresler” adlı tablo için bilgi giriş ve görüntüleme de dahil olmak üzere her türlü işlemi yapmada kullanmak üzere Data Form Wizard yardımı ile bir form hazırlayalım. Bu amaçla önce Add-Ins menüsünden Data Form Wizard komutunu verip Data Form Wizard’ın çalışmasını sağlayalım (Şekil 9.c-5). 412 Şekil 9.c-5 Data Form Wizard’ın ilk adımını temsil eden Introduction başlıklı diyalog kutusunda Wizard’ın çalışma şekli üzerinde etkili olan profil dosyası seçimi yapılmaktadır. Data Form Wizard için daha önceden herhangi bir profil dosyası hazırlamadığımız için form hazırlama işlemine devam etmek üzere Next düğmesinde tıklama yapalım (Şekil 9.c-6). Data Form Wizard’ın 2. adımını temsil eden Database Type başlıklı diyalog kutusunda veritabanı tipi seçimi yapılmaktadır. Şekil 9.c-6 413 Örnek olması için hazırladığımız form ile, daha önce Visual Data Manager ile hazırlamış olduğum Access uyumlu veri tabanı dosyasındaki “Adresler” tablosu üzerinde işlem yapmak istediğimiz için Database Type başlıklı diyalog kutusunda Access’i seçelim. Data Form Wizard’ın 2. adımını temsil eden Database Type başlıklı diyalog kutusunda veri tabanı dosyası formatı seçiminden sonra Next düğmesinde tıklama yaparak Data Form Wizard ile form hazırlama işleminin bir sonraki adımına geçilir. Bir sonraki adımı temsil eden Database başlıklı diyalog kutusunda veri tabanı dosyası seçimi yapılmaktadır (Şekil 9.c-7). Şekil 9.c-7 Hazırlanacak form ile işlem yapılacak dosya belirlendikten sonra tekrar Next düğmesinde tıklama yapılarak form hazırlama işlemi ile ilgili bir sonraki adıma geçilir. Data Form Wizard’ın bir sonraki adımını temsil eden Form başlıklı diyalog kutusunda hazırlanacak formun görünüşü veya düzeni seçilmektedir. Aşağıda ekran görüntüsü verilen form başlıklı diyalog kutusunda 5 değişik form düzeninden birini seçebilirsiniz (Şekil 9.c-8). Şekil 9.c-8 414 Eğer Data Form Wizard ile hazırlamak istediğiniz formda aynı anda tablodaki yalnızca bir kaydın olmasını istiyorsanız Form Layout adı altında bir araya getirilen radyo düğmelerinden Single Record’u seçmeniz gerekir. Eğer tablodaki kayıtların Excel tablosu şeklinde ekrana getirilmesini istiyorsanız Grid radyo düğmesini seçmelisiniz. Kayıtlar birden fazla tablodan alınacaksa Master/Detail radyo düğmesini seçebilirsiniz. Örnek olması için hazırlamak istediğimiz formda aynı anda yalnızca bir kaydın olmasını istediğimiz için Single Record’ı seçelim. Form düzeni seçimi yapılan diyalog kutusu ekranda iken Next düğmesinde tıklama yaparsanız tablo seçimi yapılan Record Source başlıklı diyalog kutusu ekrana gelir. Aşağıda ekran görüntüsü verilen bu diyalog kutusundaki Record Source liste kutusu yardımı ile tablo seçimi yapılır. Bu amaçla Record Source liste kutusu açılır. Şekil 9.c-9’da verilen ekran görüntüsünü aldığımız sırada daha önce seçmiş olduğumuz “Müşteri” adlı veri tabanı dosyasında “Adresler” adlı tablo olduğundan bu tablo listelendi (Şekil 9.c-9). Şekil 9.c-9 Record Source liste kutusu yardımı ile tablo seçimi yaptıktan sonra sıra tablodaki hangi alanlar için bilgi giriş formunda metin kutusu hazırlanacağına karar vermeye gelir. Seçilen tabloda bulunan alanlar Available Columns liste kutusunda listelenir (Şekil 9.c-9). Tabloda bulunan alanları üzerinde ucu sağa bakan ok işareti olan düğmede tıklama yaparak hazırlamak istediğiniz forma tek tek dahil edebilirsiniz. Üzerinde ucu sağa bakan iki ok işareti olan düğmede tıklama yaparak bütün alanları bir seferde forma dahil edebilirsiniz. Şekil 9.c-10’da verilen ekran görüntüsünü “Adresler” adlı tablodaki bütün alanları forma dahil ettikten sonra aldık. 415 Şekil 9.c-10 Record Source diyalog kutusu ekranda iken Next düğmesinde tıklama yapılarak düğme seçimi yapılan Control Selection başlıklı diyalog kutusu ekrana getirilir(Şekil 9.c-11). Eğer Data Form Wizard yardımı ile hazırlamak istediğiniz form ile tabloya yeni kayıt eklemeyi düşünüyorsanız Add Button onay kutusunun seçili özelliğini kaldırabilirsiniz. Şekil 9.c-11 Benzer şekilde tablodaki kayıtları silmede kullanılan Delete düğmesinin forma yerleştirilmesini istemiyorsanız Delete Button düğmesine ait onay kutusunu pasif duruma getirmeniz gerekir. Control 416 Selection başlıklı diyalog kutusunda herhangi bir işlem yapmadan Next düğmesinde tıklama yaparak Data Form Wizard’ın son adımını temsil eden Finished başlıklı diyalog kutusu ekrana gelir. Şekil 9.c-12 Bu diyalog kutusu Data Form Wizard ile form hazırlama işleminin son adımını temsil ettiği için Next düğmesi kullanılmaz durumdadır. Bu sırada Finish düğmesinde tıklama yapacak olursanız Wizard, formu hazırlamadan önce bilgi vermek amacıyla ekrana “Data Form Create” diyalog kutusu gelir (Şekil 9.c-13). Şekil 9.c-13 Bilgi vermek amacıyla ekrana getirilen bu diyalog kutusunun Data Form Wizard’ı daha sonra tekrar kullandığınızda ekrana getirilmesini istemiyorsanız “Don’t show this dialog ın the future” onay kutusunu seçili duruma getirmelisiniz. Bu diyalog kutusunu OK düğmesi ile kapattıktan kısa bir süre sonra seçtiğiniz tablonun seçtiğiniz alanlarına bilgi girişinde kullanabileceğiniz form hazırlanıp projeye dahil edilir. (Şekil 9.c-14). 417 Şekil 9.c-14 Verilen ekran görüntüsünden tespit edebileceğiniz gibi Data Form Wizard yardımıyla hazırlanan forma tablonun seçilen her bir alanı için ayrı bir metin kutusu eklendi. Metin kutularından başka forma bir Data nesnesi ve Metin kutularından başka forma bir Data nesnesi ve 5 düğme eklendi. Add düğmesi ile tabloya yeni bir kayıt ekleyebilir, Delete düğmesi ile Formda görüntülenen kaydı tablodan silebilirsiniz. Data Form Designer yardımıyla hazırlanan bu formda istediğiniz değişiklikleri yapabilirsiniz. Özellikle forma eklenen düğmelerin başlıklarını ve adlarını değiştirebiliriz. Ekle düğmesinde tıklama yapıldığı zaman tablonun sonuma boş bir kaydın eklenebilmesi için Data Form Designer tarafından Ekle düğmesi için gerekli olan program satırlarını otomatik olarak hazırlamaktadır. Vısual Basic kendisi için program kodu hazırlanmış olan nesnelerin adları sonradan değiştirildiği zaman akıllı davranmıyor. Eğer kendisi için program kodu girişi yaptığınız nesnenin adını daha sonradan değiştirme gereğini duyacak olursanız, hazırmış olduğunuz program satırlarını ad değiştirme işleminden sonra ilgili yordamların içine taşımanız gerekir. Private Sub Ekle_Click() Data1.Recordset.AddNew End Sub Data Form Wizard hazırladığı forma otomatik dahil ettiği Data nesnesi için Reposition olayı meydana geldiği zaman işletilmek üzere bazı program satırlarını hazırlamaktadır. Private Sub Data1_Reposition() Screen.mousePointer = vbDefault On Error Resume Next Data1.Caption = “Record AbsolutePosition+1) :” & ( Data1. Recordset. End Sub Bu program satırları ile data nesnesinin üzerine aktif kayd ın numarası yazılmaktadır. Böylece hangi kaydın üzerinde olduğunuzu Data nesnesinin başlığına bakıp anlayabilirsiniz. Data Form Wizard yardımı ile hazırladığınız form üzerinde çalıştığınız projenin başlangıç formu olacaksa Project menüsünden Properties komutunu vererek proje ile ilgili seçim ve ayarlamalar ın yapıldığı Project Properties diyalog kutusunu ekrana getirmeniz gerekir. 418 Üzerinde çalıştığınız projenin çalışma biçimi ile ilgili olarak seçim ve ayarlama yapmak için Project menüsünden Properties diyalog komutunu verirseniz ekrana Project Properties diyalog kutusu gelir. (Şekil 9.c-15). Şekil 9.c-15 Projede birden fazla form varsa General sekmesindeki Startup Object liste kutusunda hangi formun başlangıç formu olacağını belirleyebilirsiniz. 9.d. Birden fazla tablo üzerinde işlem yapmak Data nesnesi hakkında bilgi verilen bölümde aynı proje içinde yalnızca bir tablo üzerinde işlem yaptık. Bu bölümde ise aynı anda iki tablo üzerinde nasıl işlem yapılacağını göreceğiz. STOK.MDB 419 adında ve “Kartlar” ve “Hareketler” adına sahip iki tablo içeren bir veri tabanı dosyası hazırlayalım. Bu amaçla Visual Database Manager uygulamasını başlatalım. Veri tabanı dosyası hazırlarken kullanılan Visual Data Manager uygulamasını başlatmak için Add-Ins menüsündeki Visual Database Manager komutundan yararlanmak gerektiğini biliyorsunuz. Şekil 9.d-1 Add-Ins menüsünden Visual Database Manager komutunu verecek olursanız ekrana Visual Database Manager penceresi gelir. Data Manager penceresinde yeni bir veri tabanı dosyası hazırlamak için File menüsünden New komutunu vermek gerekiyor (Şekil 9.d-2). Daha önce hazırlayıp hard diske kaydettiğiniz veri tabanı dosyasında değişiklik yapacak veya dosyadaki tablolara Data Manager aracılığıyla kayıt girişi yapacaksanız Open Database komutu ile açmanız gerekir. Şekil 9.d-2 Daha önceki konulardan bildiğiniz gibi Visual Database Manager penceresinde File-New komutu verildiği zaman, hazırlanacak veri tabanı dosyası formatının seçildiği bir alt menü açılmaktadır. Access formatında veri tabanı dosyası hazırlamak istediğimiz için alt menüden Access 7.0’ı seçelim. New komutu ile ekrana gelen alt menüden dosya formatını seçtikten sonra ekrana hazırlanacak veri tabanı dosyasının adının ve dosyanın kaydedileceği klasörün belirlendiği Select Microsoft Access Database to Create diyalog kutusu gelmektedir (Şekil 9.d-3). 420 Şekil 9.d-3 Bu diyalog kutusunda hazırlamak istediğiniz dosyanın adını Dosya adı metin kutusuna yazıp Kaydet düğmesinde tıklama yaparsanız seçtiğiniz klasör ve sürücüde henüz herhangi bir işlem içermeyen MDB uzantılı bir dosya hazırlanır. Bu şekilde MDB uzantılı veri tabanı dosyasını hazırladıktan sonra şimdi Kartlar ve Hareketler adında iki tablo hazırlayıp bu veri tabanı dosyasına dahil edelim. Bu amaçla ilk olarak Database Window penceresinin üzerinde farenin sağ tuşuna ile tıklama yaparak veri tabanı dosyası ile ilgili kısayol menüsü Ekrana getirelim (Şekil 9.d-4). Şekil 9.d-4 Yeni bir tablo hazırlayıp veri tabanı dosyasına dahil etmek için Database Window penceresi içinde farenin sağ tuşu ile ekrana getirilen kısayol menüsünden New Table komutunu vermek gerekir. Daha önceki konulardan bildiğiniz gibi Database Window penceresine ait kısayol menüsünden New Table komutu verildiği zaman tablo yapısının belirlendiği Table Structure diyalog kutusu ekrana gelmektedir. Şekil 9.d-5’teki verilen ekran görüntüsü “Kartlar” tablosunun yapısını belirledikten sonra alındı. 421 Şekil 9.d-5 Bu şekilde dosyada yer alacak ilk tablonun kayıt yapısını belirledikten sonra tablo için Index tanımlayalım. Ekranda Table Structure diyalog kutusu varken Index hazırlamak için Add Index düğmesinde tıklama yapılır (Şekil 9.d-6). Add Index düğmesinde tıklama yapıldığı zaman ekrana AddIndex diyalog kutusunun geldiğini daha önceki konulardan biliyorsunuz. Şekil 9.d-6 Add Index diyalog kutusunda ilk olarak Name metin kutusuna hazırlamak istenen Indexin adı yazılır. Ardından Indexleme hangi alan veya alanlara göre yapılacaksa söz konusu alan Available Fields liste kutusunda seçilir (Şekil 9.d-7). Aynı koda sahip birden fazla Stok kartının tanımlanmasını engellemek için Unique onay kutusunu seçili duruma getirilir. ( Aynı koda sahip birden fazla stok hareketinin kaydını yapmak gerekirse bu kutu seçili duruma getirilmez) 422 Şekil 9.d-7 Hazırlamak istediğimiz index için alan seçimini yaptıktan sonra önce Ok değmesinde tıklama yaparak indexin tabloya dahil edilmesi sağlanır (Şekil 9.d-8). Ardından Close düğmesinde tıklama yaparak Add Index diyalog kutusunu kapatılır. Tanımlanan index Table Strucrure diyalog kutusunun sol alt köşesindeki Index List liste kutusunda listelenir. Şekil 9.d-8 Hazırlayıp “Stok” adlı MDB uzantılı veri tabanı dosyasına dahil etmek istenen ilk tablonun kayıt yapısını bu şekilde belirledikten sonra Build the Table düğmesinde tıklama yaparak tablonun 423 hazırlanmasını ve Table Structure diyalog kutusunun kapanması sağlanır. Table Structure diyalog kutusunu “Build the Table” düğmesi ile kapatınca kayıt yapısını belirlediğim tablo Visual Dtata Manager dosyası içinde alt pencere durumundaki veri tabanı dosyasına ait pencerede yer almaya başladı (Şekil 9.d-9). Şekil 9.d-9 Veri tabanı dosyasında yer almasını istediğim “Kartlar” adlı tabloyu bu şekilde hazırladıktan sonra diğer tabloyu hazırlamak üzere tekrar Database Window penceresi içinde farenin sağ tuşu ile kısayol menüsünü ekrana getirelim. Kısayol menüsünden New Table komutunu verip ekrana Strukture Table diyalog kutusu gelir. Şekil 9.d-10’da verilen ekran görüntüsünde “Hareketler” adı verilen ikinci tablonun kayıt yapısı belirlenmiştir. 424 Şekil 9.d-10 “Hareketler” adı verilen tablonun kayoıt yapısını bu şekilde belirledikten sonra şimdi tablo için bir index hazırlayalım. Bu amaçla önce Add Index düğmesinde tıklama yaparak ekrana Add Index diyalog kutusu getirilir. Şekil 9.d-11’de verilen ekran görüntüsünde Add Index diyalog kutusunda hazırlamak istediğimiz index için gerekli ayarlama ve seçim işlemleri yapılmıştır. Şekil 9.d-11 Aynı koda sahip birden fazla stok hareketinin kaydını yapmak gerekeceği için “Kartlar” tablosu için hazırlanan indexten farklı olarak Unigue onay kutusu seçili duruma getirilmez. Bu işlemlerden sonra önce OK. ve ardından Close düğmelerinde tıklama yaparak Add Index diyalog kutusu kapatılır. En son olarak Table Structure diyalog kutusunda Build he Table düğmesinde tıklama yaparak “Hareketler” tablosunun hazırlık işlemleri tamamlanır (Şekil 9.d-12). Şekil 9.d-12 Bundan sonraki veri tabanı dosyaları ile ilgili bir çok işlemi bu iki tablo üzerinde gerçekleştirelim. Daha önce “Adresler” tablosu için yaptığınız bir çok işlemi Kartlar ve Hareketler tabloları içinde yapacağız. 425 Şekil 9.d-13 Hazırlayacağım örnek proje ile temel olarak iki işlem yapacağız. İlk işlemde Kartlar tablosuna stok kartlarının girişini yapacağız. İkinci işlemde ise Hareketler tablosuna stok giriş ve çıkışlarının kaydını yapacağız. Bu nedenle hazırlamak istediğimiz örnek projede 3 form olacak. Projenin ana formu için menü hazırlamak yerine konumun kolay anlaşılmasını sağlamak için projenin ana formuna 3 düğme dahil edelim (Şekil 9.d-13). Proje çalıştırılır çalıştırılmaz projenin ana formu ekrana gelecek. Ana formdaki “Stok Kartları” başlıklı düğmede tıklama yapıldığı zaman Stok kartları başlıklı form, “Stok Hareketleri” düğmesinde tıklama yapıldığı zaman Stok hareketleri başlıklı form ekrana gelecek. Bu nedenle projeye önce iki form dahil edeceğiz. Üzerinde çalıştığımız projeye yeni bir form dahil etmek için Project menüsünden Add Form komutunu vermeniz gerektiğini biliyorsunuz. Bu formları sıfırdan hazırlamak yerine Data Form Designer’den yararlanabilirsiniz. Çalışma anında Stok kartları başlıklı düğmede tıklama yapıldığı zaman ekrana Stok Kartları başlıklı “Kartlar” adındaki formun gelmesini sağlamak için “Stok Kartları” başlıklı düğmesinin Click yordamına program satırları ekleyelim. Stok kartlarını girmede veya daha önce girilen kartları bulup ekrana getirmede kullanmak üzere projeye dahil ettiğimiz ikinci forma Properties penceresinden yararlanarak “Kartlar” adını verelim. Private Sub Command1_Click() Kartlar.Show End Sub Şimdi önce Stok Kartları başlıklı form aracılığı ile Ticaret.mdb adındaki veri tabanı dosyasındaki “Kartlar” tablosuna stok kartlarının girişini yapalım. Bu amaçla ilk olarak bu forma ToolBox’tan yararlanarak bir Data nesnesi dahil edelim. Ardından Data nesnesi için Properties penceresinde DatabaseName özelliği yardımı ile veri tabanı dosyası, RecorsSource özelliği yardımıyla tablo seçimi yapalım (Şekil 9.d-14). 426 Şekil 9.d-14 Bu işlemden sonra Stok Kartları bağlığına sahip forma, Kartlar tablosunda bulunan her alan için birer Label ve Textbox nesnesi dahil ettim. Ayrıca çalışma anında tabloya yeni Stok Kartların girişini yapabilmek, kartların arasında dolaşabilmek ve mevcut kartlarda gerekirse değişiklik yapabilmek için forma 3 düğme dahil edelim. 427 Şekil 9.d-15 Kayıtlar arsında dolaşırken Data nesnesinden yararlanmak istediğimiz için forma Önceki ve Sonraki gibi başlıklara sahip düğmeleri dahil etmedik. Şimdi sırada forma eklediğimiz metin kutuları ile seçtiğimiz tablonun alanları arasında bağlantı kurmaya geldi. Bu amaçla önce Formdaki ilk metin kutusunu seçili duruma getirip tabloyu erişimde kullanılacak Data nesnesini seçelim. Çünkü bir formda birden fazla Data nesnesi bulunabilir (Şekil 9.d-16). Şekil 9.d-16 Şekil 9.d-17 Formdaki ilk metim kutusu için Data nesnesi seçimini yaptıktan sonra Textbox nesnesinin DataField özelliğinden yararlanarak alan seçimi yapalım. (Şekil 9.d-17). Bunu yapmak için ışıklı bantı Properties penceresinde DataField özelliğinin üzerine götürüp StokKodu alanını seçtim. Seçili durumda olan metin kutusu nesnesi için DataSource özelliği yardımıyla Data nesnesi seçimini yapmadan DataField özelliği ile alan seçimi yapamazsınız. 428 Benzer işlemi sırasıyla formdaki diğer metin kutuları içinde yapalım. Formdaki 2. metin kutusunun DataField özelliğine “StokAdı”, 3.metin kutusu nesnesinin DataField özelliğine ise “Birim” alanın adını aktaralım. Bu işlem ve hazırlıklardan sonra stok kartlarının girişine başlayabiliriz. Ancak bilgi girişine başlamadan önce Yeni Kart düğmesinde tıklama yapılarak henüz herhangi bir kayıt içermeyen dosyanın sonuna boş bir kaydın eklenmesi sağlanmalıdır. Belirtilen tablonun sonuna boş bir kayıt eklemek için AddNew methodunun kullanıldığını daha önceden biliyorsunuz. Bu nedenle Yeni Kart başlıklı düğmenin Click yordamını aşağıdaki gibi düzenleyelim. Private Sub Ekle_Click() Data1.Recordset.AddNew Text1.SetFocus End Sub Bu değişiklikten sonra proje çalıştırılıp Yeni Kart düğmesi ile bu yordam işletilirse dosyanın sonuna baş bir kayıt eklenir ve ekleme noktası ilk metin kutusunda hazır olarak bekler. Bu hazırlıklardan sonra bu projeyi çalıştırınca ekrana ilk olarak üzerinde 3 düğme olan ve ana form görevi yapan Stok Projesi başlıklı form gelir. Bu sırada stok kartı girişi yapmak üzere Stok Kartları düğmesinde tıklama yaparsanız daha önce bu düğmenin içinde kullanılan Show metodu yardımıyla ekrana Stok Kartları başlıklı form gelir (Şekil 9.d-18). 429 Şekil 9.d-18 Stok Kartları formundaki Data nesnesi yardımıyla üzerinde işlem yapılmak istenen Kartlar tablosu henüz herhangi bir kayıt veya bilgi içermediği için formdaki metin kutularının içeriği boş durumdadır (Şekil 9.d-18). Şekil 9.d-19 “Data1” nesnesi ile erişim sağladığım tabloya daha önce kayıt girişi yapmış olsaydık Stok Kartları başlıklı form ekrana getirilir getirilmez tablodaki ilk kaydın içeriği ekrana getirilirdi. Tabloya yeni bir kaydın girişini yapmak için ilk önce “Yeni Kart” düğmesinde tıklama yaparak tablonun sonuna içeriği boş bir kayıt ekleyelim. Ardından formdaki metin kutularına bilgi girelim. Bu stok kartına göre depoda 10 adet 37 ekran Arçelik renkli TV bulunmaktadır. Bu sırada Değiştir düğmesinde tıklama yapılırsa metin kutularının içeriği üzerinde bulunan kaydın alanlarına, başka bir deyişle tabloya yansıtılır. Bu işlemi yapacak yordamı aşağıda verdim. Private Sub Değiştir_Click() 430 Data1.UpdateRecord End Sub Metin kutularına girişini yaptığınız bilgileri “Değiştir” düğmesinde tıklama yapıp AddNew metodu ile tablonun sonuna eklediğiniz kayda yansıttıktan sonra tekrar Yeni Kayıt düğmesinde tıklama yaparak istediğiniz sayıda kaydın girişini yapabilirsiniz. Stok dosyasından kayıt silmek amacıyla kullanmak üzere "”Kart Sil"”başlıklı düğmenin Click yordamına aşağıda ekran görüntüsünü verdiğim program satırlarını dahil ettim. Private Sub Sil_Click() Data1.Recordset.Delete Data1.Recordset.MovePrevious End Sub Eğer yeni bir kaydın girişini yaparken veya tablodaki mevcut kayıtlardan birini silerken silme işlemi öncesi kullanıcıdan onay almak istiyorsanız Data nesnesine ait Validate olayından yararlanabilirsiniz. Private Sub Data1_Validate (Action As Integer, Save As Integer) If Action = 7 Then Secim = MsgBox( “Bu Kayıt silinsin mi? “,4) If Secim = 7 Then Action = 0 End If End If End Sub 431 Ancak hareket görmüş olan bir Stok kartını tablodan silmek hatalara neden olur. Bu nedenle ticari programlarda hareket görmüş olan Stok Kartlarının silinmesine izin verilmez. Anlatılan şekilde Kartlar tablosuna istenen sayıda kaydın girişini nasıl yapıldığını anlattıktan sonra “Hareketler” tablosuna stok giriş ve çıkışlarını nasıl kaydedeceğimizi anlatalım. Bu amaçla projeye dahil ettiğimiz forma ikinci Data nesnesi dahil edelim. Çünkü Hareketler tablosu üzerinde işlem yaparken aynı zamanda Kartlar tablosu üzerinde işlem yapacağız. Stok giriş ve çıkışında kullanmak için hazırladığımız form Şekil 9.d-20’de verildi. Şekil 9.d-20 Forma eklemiş olduğum ilk Data nesnesi ile üzerinde işlem yapmak istediğimiz MDB uzantılı “Ticaret” dosyasındaki “Hareketler” tablosunu ilişkilendirelim. Diğer yandan “Data2” nesnesinin RecordSource özelliği için tablo seçimi yapmadan önce DatabaseName özelliğinden yararlanarak veri tabanı dosyası seçimi yapalım (Şekil 9.d-21). Şekil 9.d-21 Forma eklemiş olduğum “Data2” adındaki ikinci Data nesnesi ise “Kartlar” tablosu ile ilişkilendirelim. Stok giriş ve çıkış işlemlerine ait kayıtları “Hareketler” tablosuna yazacağız ama bu sırada Kartlar tablosundaki ilgili stok kaydının “Miktar” alanında artma veya azalma meydana 432 gelecektir. Diğer yandan henüz kaydı yapılmamış olan bir stokun giriş ve çıkışını engelleyeceğiz (Şekil 9.d-22). Şekil 9.d-22 Hareketler başlıklı formu bu şekilde düzenlenip proje çalıştırılıp, ana formdaki Stok hareketleri düğmesinde tıklama yapılırsa Stok Giriş ve Çıkışları başlıklı form ekrana gelir ve ekleme noktası formdaki ilk metin kutusunda hazır olarak bekler. Formdaki Stok hareketleri başlıklı düğmede tıklama yapıldığı zaman Stok Giriş ve çıkışında kullanılmak üzere hazırlanan formun ekrana gelmesini sağlamak için bu düğmeye ait Click yordamını aşağıdaki gibi düzenleyelim. Private Sub Command2_Click() Hareket .Show End Sub Şekil 9.d-23’te verilen ekran görüntüsünü çalışma anında Stok Hareketleri düğmesinde tıklama yaptıktan sonra aldık. Hareket tablosuna daha önce kayıt girişi yapılmış olsaydı ilk kaydın içeriği formdaki metin kutularında görüntülenirdi. 433 Şekil 9.d-23 Hareketler tablosuna bir Stok giriş veya çıkışın kaydını yapmak için ilk olarak “Yeni” düğmesinde tıklama yapılır. Tablonun sonuna boş bir kayıt eklemek amacıyla hazırlanan YeniKayıt_Click yordamı aşağıda verelim. Private Sub YeniKayıt_Click() Data1.Recordset.AddNew Text1.SetFocus End Sub Çalışma anında Hareket tablosunun sonuna boş bir kayıt eklemek üzere “Yeni” başlıklı düğmede tıklama yaparsanız AddNew methodu ile tablonun sonuna boş bir kayıt eklenir. Daha sonra Hareketler tablosuna yazılmak üzere formdaki diğer metin kutularına bilgi girişi yapılır (Şekil 9.d- 24). Şekil 9.d-24 Metin kutularına girilen bilgiler “Değiştir” düğmesinde tıklama yapılınca “Hareketler” tablosundaki aktif kaydına yansıtılır. Bu amaçla “Değiştir” başlıklı düğmenin Click yordamını aşağıdaki gibi düzenledim. Bu yordamda daha önce Kartlar tablosunda kayıtlı olmayan bir stokun giriş veya çıkışını önlemek için önce kodu girilen stok, “Data2” nesnesi ile erişim sağlanan “Kartlar” tablosunda aranmaktadır. Private Sub Değiştir_Click() Data2.Recordset.MoveFirst Do While Data2.Recordset.EOF = False If Data2.Recordset.Stokkodu = Text1.Text Then Exit Do Else Data2.Recordset.MoveNext End If Loop If Data2.Recordset.EOF Then 434 MsgBox “Bu stok kartının kaydı yok” Else Data1.UpdateRecord End If End Sub DBCombo Kontrolü DBCombo kontrolü, kayıt girişi yaparken veya mevcut kayıtları değiştirirken bir tablodaki bir alanın içeriğini listelemek veya seçim yapmak amacıyla kullanılmaktadır. Yukarıdaki sayfalarda hazırladığımız projede Stok giriş ve çıkışlarının kolay yapılmasını sağlamak için “Stok Kodu” başlıklı metin kutusunu silip yerine bir DB Combo kontrolünü yerleştirelim (Şekil 9.d-25). Veri tabanı dosyasındaki Kartlar tablosundaki kayıtları içerecek bu liste kutusunun seçeneklerini belirlerken formdaki “Data2” nesnesinden yararlanalım. Çalışma anında Data2 nesnesinin ekranda görüntülenmesini engellenmek için Visible özelliğine False değerini aktaralım. Şekil 9.d-25 Data nesnesinden yararlanmadan DBCombo nesnesinden yararlanmak mümkün değildir. DBCombo ile Data nesnesi arasında bağlantı kurmak için ilk olarak DBCombo’nun DataSource özelliği ile Data nesnesi seçimi yapılır (Şekil 9.d-26). Üzerinde çalıştığımız Hareket adındaki formdaki Stok Kodu başlıklı liste kutusunda “Data2” adındaki Data nesnesi ile erişim sağlanan Kartlar tablosundan bilgi alınmasını sağlamak için Data2 nesnesini seçelim. 435 Şekil 9.d-26 Şekil 9.d-27 Ardından DBCombo nesnesinin DataField özelliği yardımıyla liste kutusunda bilgilerin seçilen tablonun alanından alınacağı belirlenir (Şekil 9.d-27). DBCombo nesnesinde “kartlar” tablosundaki stokların kodlarını aktarmak istediğim için DataField özelliğine “StokKodu” alanını aktaralım. Şekil 9.d-28 Şekil 9.d-29 DBCombo nesnesi için DataField özelliği yardımıyla alan seçimi yapıldıktan sonra RowSource özelliğinden yararlanarak Data nesnesi seçimi yapılmalıdır (Şekil 9.d-28). Bu seçimden başka DBCombo nesnesinin ListField özelliği yardımıyla bir kez daha alan seçimi yapılmalıdır. DataField özelliği ile çalışma anında DBCombo nesnesi içinde listelenecek bilgilerin alınacağı alan belirlenmektedir (Şekil 9.d-29). Bu ana kadar yapılan hazırlıklara göre Stok giriş ve çıkışı için ekrana Hareketler başlıklı form getirildiği zaman ekleme noktası stok kodu seçimi yapılacak liste kutusunda hazır olarak bekleyecektir. Veri tabanı dosyasındaki Kartlar tablosunu temel alan bu liste kutusunda girişi veya çıkışı yapılacak stokun kodu seçilir. Aşağıda verilen ekran görüntüsünü çalışma anında Stok Kodu seçimi yapılan liste kutusunu açtıktan sonra aldım. Bu sırada Kartlar tablosuna kaydı yapılış 4 stok kartı vardı (Şekil 9.d-30). 436 Şekil 9.d-30 Bu liste kutusunda Stok Kodu seçimi yapıp tarihi girdikten sonra işlem seçimi yapılan diğer liste kutusuna geçtim. İşlem alanına yalnızca “Giriş” veya “Çıkış” bilgilerini yazma imkanı olduğu için tasarım anında İşlem başlıklı metin penceresinde ComboBox nesnesinin List özelliğinden yararlanarak çalışma anında “Giriş” ve “Çıkış” seçeneklerin listelenmesini sağladık. Data Form Wizard İle Birden Fazla Tablo Üzerinde İşlem Yapmak Daha önce tablolar üzerinde işlem yaparken Data Form Wizard ile nasıl form hazırlandığını adım adım anlatmıştım. Hatırlayacağınız gibi Data Form Wizard başlatıldığı zaman ilk olarak sizden hazırlanacak form ile üzerinde işlem yapılacak tablonun dahil olduğu veri tabanı dosyasının formatını seçmeniz isteniyordu. Başlangıçta veri tabanı dosyasının Access ile hazırlandığı varsayılıyordu. Şekil 9.d-31 437 Data Form Wizard’ın Database Type başlıklı diyalog kutusunda veri tabanı dosyası formatı belirlendikten sonra Next düğmesinde tıklama yapılarak seçimi yapılan Database başlıklı diyalog kutusu ekrana geliyordu (Şekil 9.d-31). Şekil 9.d-32 Aynı anda iki tablo üzerinde işlem yaparken daha önce hazırlamış olduğum “Stok” adındaki veri tabanı dosyasından yararlanmak istediğim için bu diyalog kutusunda Ticeret.mdb dosyasını açalım (Şekil 9.d-32). Ardından Next düğmesinde tıklama yaparak ile Form hazırlama işleminin bir sonraki adımını temsil eden “Form” başlıklı diyalog kutusunu ekrana getirelim. Form başlıklı diyalog kutusunda Data Form Wizard ile hazırlanacak ve seçilen tablo üzerinde işlem yaparken kullanılacak formun görünümü seçilmektedir (Şekil 9.d-33). Şekil 9.d-33 Eğer formun üzerinde aynı anda yalnızca bir kaydın görüntülenmesini istiyorsanız Master / Detail radyo düğmesini seçmelisiniz. 438 Şekil 9.d-34 Master/Datail seçeneği ile hazırlanan formda aynı anda iki tablonun üzerinde işlem yapılırken tablolardan birine “ana” tablo, diğerine ise “detay” tablo adı verilmektedir. Form tipi seçiminden sonra Next düğmesinde tıklama yaparsanız Master (ana) tablonun seçildiği Master Record Source diyalog kutusu ekrana gelmektedir (Şekil 9.d-34). Örnek olması için hazırlamak istediğimiz formun üst kısmında Kartlar tablosundan bir kaydın olmasını istediğim için Master Record Source başlıklı diyalog kutusunda önce Record Source liste kutusunda Kartlar tablosunu seçelim. Ardından Kartlar tablosundaki bütün alanları hazırlayacağım forma dahil edelim. Anlatılan şekilde Master Record Source diyalog kutusunda Master tablo seçimini yaptıktan sonra tekrar Next düğmesinde tıklama yaparak Data Form Wizard’ın tablo seçimi yapılan Detail Record Source diyalog kutusunu ekrana getirelim. 439 Şekil 9.d-35 Detail Record Source başlıklı diyalog kutusunda önce “Hareketler” tablosunu seçtim. Tablo seçiminden sonra tablodaki alanlar Available Fields liste kutusunda listelenmektedir. Şekil 9.d-36 Hareketler tablosundaki bütün alanları Selected Fields liste kutusuna kopyaladıktan sonra Next düğmesinde tıklama yaparak ekrana Record Source Relation diyalog kutusunun gelmesini sağladık. Record Source Relation diyalog kutusunda hazırlanacak forma dahil edilecek tablolar arasında kurulacak bağlantıda hangi alanların kullanılacağı belirlenmektedir (Şekil 9.d-36). Master (Kartlar) tablosu ile Detail(Hareketler) tablosu arsında bağlantıyı StokKodu alanından yararlanarak kurmak istediğim için Master ve Detail liste kutuslarında “StokKodu” alanını seçili duruma getirdim. Tablolar arasında nasıl bir bağlantı kurulacağı bu şekilde belirlendikten sonra tekrar Next düğmesinde tıklama yapılırsa Data Form Wizard’ın bir sonraki adımını temsil eden Control Selection diyalog kutusu ekrana getirilir (Şekil 9.d-37). 440 Şekil 9.d-37 Control Selection diyalog kutusunda forma dahil edilecek düğmeler belirlenmektedir. Eğer Data Form Wizard yardımıyla hazırladığınız form aracılığıyla tablolara yeni kayıt girişi yapmak istemiyorsanız Add Button onay kutusunu pasif duruma getirebilirsiniz. Bu diyalog kutusunda herhangi bir seçim ve ayarlama yapmadan Next düğmesinde tıklama yaparak Data Form Wizard en son adımını temsil eden Finished diyalog kutusunu ekrana getirilir. Şekil 9.d-38 Finished başlıklı diyalog kutusunda, Wizard ile forma hazırlarken yaptığınız seçim ve ayarlamaları profil dosyası olarak hard diske kaydedebilirsiniz. Profil dosyası hazırlamak için Finished diyalog kutusundaki 3 nokta (...) işareti olan düğmede tıklama yapmak gerekir. Bu düğmede tıklama yapıldığı zaman profil dosyası belirlendiği Save Profile diyalog kutusu ekrana gelmektedir (Şekil 9.d-39). 441 Şekil 9.d-39 Bu diyalog kutusuna profil dosyasının adını yazıp Kaydet düğmesinde tıklama yaparsanız bu dosyanın adı Finished diyalog kutusundaki metin kutusuna yazılır. Şekil 9.d-40’da verilen ekran görüntüsünü Finished diyalog kutusundaki Finish düğmesinde tıklama yaptıktan sonra aldık. Şekil 9.d-40 Eğer Data Form Wizard yardımıyla hazırladığınız formun üzerinde çalıştığınız projenin başlangıç formu olmasını istiyorsanız Project menüsündeki Project Properties komutu ile ekrana getirilen Project Properties diyalog kutusundan yararlanmanız gerekir. 9.e. Program Kodu ile Veri Tabanı Hazırlamak 442 Visual Basic uygulaması dahilinde çalışma anında yeni bir DateBase nesnesi yani MDB uzantılı veri tabanı dosyası oluşturmak için Visual Basic’in hazır CreateDatabase() fonksiyonundan yararlanılır. 5.0 ve 6.0 versiyonunda CreateDatabase() gibi fonksiyonları kullanabilmek için daha önceden Project menüsünden References komutunu verip ekrana Refrences diyalog kutusunu getirmek gerekir (Şekil 9.e-1). Şekil 9.e-1 Project menüsünden Referances komutu verildiği zaman ekrana gelen diyalog kutusunda üzerinde çalıştığınız Visual Basic proje dahilinde kullanılacak kitaplıklar seçilmektedir. Yeni bir Visual Basic proje hazırladığınızda Referances diyalog kutusunda listelenen seçeneklerin ilk 4’ü seçili durumdadır (Şekil 9.e-2). Şekil 9.e-2 443 Şekil 9.e-3 Microsoft DAO 3.51 Object Library üzerinde çalışılan projeye References diyalog kutusu aracılığı ile dahil edilmediği sürece CreateDatabase() gibi fonksiyonları kullanmak mümkün değildir (Şekil 9.e-3). Eğer üzerinde çalıştığınız Visual Basic’in nesne bağlama ve katma özelliklerinden yararlanmıyorsanız References diyalog OLE Automation seçeneğini iptal edebilirsiniz. CreateDatabase() fonksiyonu dışarıdan ikisi seçimlik olan 3 parametre almaktadır. Oluşturulacak veri tabanı dosyasının adını içeren ilk parametrenin kullanılması zorunludur. Dosya = CreateDatabase(“TEST.MDB”) Bu program satırı ile hard diskteki adı TEST.MDB ve program içindeki adı Dosya olan bir veri tabanı nesnesi oluşturulur. Yeni oluşturulan Dosya adındaki Database nesnesinin ayrıca SET deyimi ile set edilmesi gerekir. Bu nedenle yukarıda verilen program satırı; SET Dosya = CreateDatabase(“TEST.MDB”) şeklinde değiştirilmelidir. Bütün fonksiyonlar gibi CreateDatabase() fonksiyonu da geriye bir değer döndürür. Burada geriye döndürülen değer yeni bir veri tabanı nesnesidir. Bu nesnenin bir kopyası program çalıştığı sürece Database özellikli bir değişkende saklanılacağı için bu değişkenin daha önceden tanımlanması gerekir. Database nesnesinin içeriğini program çalıştığı sürece bellekte saklayacak değişken Database bildiri deyimi ile tanımlanır. Dim Dosya As Database SET Dosya = CreateDatabase(“TEST.MDB”) 444 Oluşturulacak veri tabanı dosyasının adından önce istenirse dosyanın yazılcağı sürücü ve dizin adı belirtilebilir. Create() fonksiyonuna verilen 2. parametrede dil veya ülke kodu belirtilir. Dim Dosya As Database SET Dosya = CreateDatabase(“C:\ORNEK\TEST.MDB”,dbLangGeneral) CreateDatabase() fonksiyonu ile Access formatında MDB uzantılı veri tabanı dosyası oluşturulurken Visual Basic çok sayıda sabit bilgiden yararlanır. Bu sabit bilgilerin ışığında dosya hazırlanır. Bu sabit bilgiler Visual Basic’in 3.0 versiyonunda Visual basic ile Birlikte verilen DATACONS.TXT adlı dosyada bulunuyordu. Bu ndenle Visual Basic’in 3.0 versiyonu dahilinde CreateDatabase() fonksiyonunu kullanmadan önce bu sabit bilgi dosyanın üzerinde çalışılan projeye dahil edilmesi gerekiyordu. Ancak Visual Basic’in 4.0, 5.0 ve 6.0 versiyonunda buna gerek yoktur. CreateDatabase() fonksiyonu ile MDB uzantılı veri tabanı dosyası hazırlanırken gerek duyulan sabitler projeye otomatik olarak dahil edilmektedir. Yukarıda verilen iki satırlık program kodu işletilecek olunursa, belirtilen sürücü ve klasörde TEST.MDB adında Access formatında bir veri tabanı dosyası oluşturulur. Yeni bir veri tabanı dosyası oluşturmak üzere hazırladığım 2 satırlık program kodlarını üzerinde çalıştığım örnek projedeki formun Form_Click() yordamına dahil edelim. Private Sub Form_Load() Dim Dosya As Database Set Dosya = CreateDatabase("c:\Belgelerim\TEST.MDB", dbLangGeneral) End Sub Form_Click yordamı bu şekilde hazırlanan proje başlatılıp çalışma anında formun üzerinde tıklama yapılırsa söz konusu veri tabanı dosyası oluşturulur. Hard diskte bulunan bir veri tabanı dosyası CreateDatabase() fonksiyonu ile tekrar oluşturulmak istenirse hata meydana gelir. Bu şekilde oluşturulan TEST.MDB dosyası program çalıştığı sürece program dahilinde artık bir nesnedir. Bu Database tipindeki nesnenin de kendisine özgü Properties veya özellikleri bulunur. Nasıl ki daha önce hakkında bilgi verilen değişik nesneler üzerinde işlem yapmak için değişik amaç ve işleve sahip metotlar kullanılıyorsa Database nesnesi üzerinde etkili olan metotlar vardır. Bu şekilde oluşturulan bu TEST.MDB adlı veri tabanı dosyasının içeriği henüz boştur. Bu dosyada bilgi kaydedilecek tablo henüz yoktur. Bunu göstermek için Visual Basic ile birlikte verilen Visual data Manager’ı çalıştırıp hazırladığım TEST.MDB dosyasını açınca aşağıda verilen ekran görüntüsünü elde edilir. 445 Şekil 9.e-4 Oluşturduğumuz TEST.MDB adındaki veri tabanı dosyasına şimdi bir Tablo ekleyelim. Önce bu amaçla hazırladığımız örnek yordamı verelim. Daha sonra yordamda kullandığımız deyim ve fonksiyonlar hakkında bilgi vereceğiz. Veri tabanına tablo eklemede kullanılan program satırları projenin formuna ait Form_Click yordamına dahil edelim. Sub Form_Click() Dim Dosya As Database Dim Tablo As New TableDef Dim Idx As New Index Dim Alan1 As New Field Dim Alan2 As New Field Dim Alan3 As New Field Dim Alan4 As New Field Dim Alan5 As New Field Dim Alan6 As New Field Set Dosya = OpenDatabase("C:\Belgelerim\TEST.MDB") Tablo.Name = "ADRES" Alan1.Name = "Ad" Alan1.Type = 10 Alan1.Size = 15 Tablo.Fields.Append Alan1 Alan2.Name = "Soyad" Alan2.Type = 10 Alan2.Size = 15 Tablo.Fields.Append Alan2 Alan3.Name = "Adres" Alan3.Type = 10 Alan3.Size = 30 Tablo.Fields.Append Alan3 446 Alan1.Name = "Tel" Alan1.Type = 10 Alan1.Size = 10 Tablo.Fields.Append Alan4 Alan1.Name = "Sehir" Alan1.Type = 10 Alan1.Size = 10 Tablo.Fields.Append Alan5 Idx.Name = “PrimaryKey” Idx.Unique = True Idx.Primary = True Idx.Fields = "Soyad" Tablo.Indexes.Append Idx Dosya.TableDefs.Append Tablo End Sub Şimdi mevcut bir veri tabanı dosyasına tablo eklemek amacıyla kullanılan bu yordamı kısım kısım açıklayalım. Yukarıdaki sayfalarda belirtildiği gibi veri tabanı dosyaları ile ilgili olarak kullanılan her nesne için önceden değişken tanımlama işlemi yapılmalıdır. Bunun için yordamın en başında veri tabanı dosyası üzerinde işlem yapmada kullanılacak bütün nesneler için önceden değişken tanımlaması yapıldı. Aşağıda tekrar verilen satırlarda Database, Table, Index ve Field nesneleri için değişken tanımlama işlemleri yapılmaktadır. Veri tabanı dosyası nesnesi için değişken tanımlanırken Dim bildiri deyimi ile birlikte Database bildiri deyimi kullanılmaktadır., Dim Dosya As Database Dim Tablo As New TableDef Dim Idx As New Index Dim Alan1 As New Field Dim Alan2 As New Field Dim Alan3 As New Field Dim Alan4 As New Field Dim Alan5 As New Field Dim Alan6 As New Field Benzer şekilde Table nesnesi içi,n değişken tanımlamada TableDef deyimi kullanılmaktadır. Yukarıdaki örnekte veri tabanı dosyasına Tablo eklemek amacıyla kullanılan değişkene Tablo adı verildi. Eğer veri tabanı dosyasına birden fazla Table nesnesi eklemek veya birden fazla table nesnesi içeren veri tabanı dosyası üzerinde işlem yapılmak istenirse TableDef bildiri deyimi ile birden fazla Table tipli değişken tanımlamamız gerekirdi. Aslında Dim Tablo As New TableDef program satırı ile yapılan değişken tanımlama bildiğimiz değişken tanımlama işleminden oldukça farklı işleve sahiptir. TableDef bildiri deyimi ile değişken 447 tanımlamadan öte başlangıçta herhangi bir özelliği olmayan bir Table nesnesi tanımlanmaktadır. Tanımlanan nesnenin yeni olduğunu belirtmek için TableDef bildiri deyiminden önce New bildiri deyimi kullanıldı. Bu şekilde yapılan değişken tanımlama işlemine Nesne Tanımlama denilebilir. TableDef bildiri deyimi ile Table nesnesi için değişken tanımlaması yapılan program satırından sonraki satırda Index bildiri deyimi ile Index nesnesi için değişken tanımlaması yapılmaktadır. Veri tabanı programlarının en önemli özelliklerinin başında Index kullanımı konusunda sağladıkları kolaylıklardır. Bunun için veri tabanı dosyası ve Table nesnesi söz konusu olunca, Index dosyasından yararlanmamak düşünülemez. Veri tabanı dosyasında bulunan her Table için ayrı indexleme yapılır. Program dahilinde üretilecek bilgilerden saklanılacak olanlar için veri tabanı dosyası hazırlanırken en başta dosyada saklanılacak bilgiler veya alanların adları, tipleri ve uzunlukları belirlenir. Bunun için yordamın başında her Field nesnesi için Field tipi bir değişken tanımlaması yapılmalıdır. Field tipli değişken tanımlamak için Filed bildiri deyimi kullanılır. Yordamda kullanılacak nesneler için değişken tanımlama işlemi yapıldıktan sonra ilk olarak kendisine Table nesnesi eklenecek veri tabanı dosyasının açılması gerekir. Hard diskteki adı TEST.MDB olan veri tabanı dosyası üzerinde işlem yapabilmek için dosyanın OpenDatabase() fonksiyonu ile açılması gerekir. OpenDatabase() fonksiyonu dışarıdan parametre olarak üç tanesi seçimlik olan 4 bilgi almaktadır. İlk parametrede açılacak dosyanın adı belirtilir. SetDosya = OpenDatabase (“C:\Belgelerim\TEST.MDB”) Bu program satırı ile hard diskteki adı TEST.MDB olan Access formatındaki veri tabanı dosyası açılıp Database tipli “Dosya” değişkenine Set edilir. Eğer açılmak istenen dosya çok kullanıcılı bir ortamda kullanılıyor ve başka kullanıcıların dosyaya erişimi engellenmek isteniyorda OpenDatabase() fonksiyonuna 2. parametre olarak “True” mantıksal değeri verilmelidir. SetDosya = OpenDatabase (“C:\Belgelerim\TEST.MDB”, True) Eğer açılan dosya üzerinde işlem yapılmasını istemiyorsanız dosyayı ReadOnly modunda açmalısınız. Dosyayı ReadOnly modunda açabilmek için 3. parametreden yararlanılır. OpenDatabase) fonksiyonuna 3. parametre olarak True mantıksal değeri verilirse dosyada değişiklik yapılmaz. Eğer açılmak istenen dosya MDB uzantılı Access formatlı dosya değilse, söz konusu dosyanın 4. parametresi belirtilmelidir. SetDosya = OpenDatabase (“C:\Belgelerim\TEST.MDB”, True, False, Paradox) Veri tabanı dosyası için hazırladığımız Table tipli nesnenin henüz adı belli değildir. Aşağıda verilen program satırı ile Table nesnesinin adı belirlenmektedir. Tablo.Name = ”ADRES” Table nesnesine ADRES adını verdik. Table nesnesinin adı belirlendikten sonra sıra bu nesneye Field veya alan eklemeye gelir. Alanın adından başka, alanın tipinin ve uzunluğunun mutlaka belirtilmesi gerekir. 448 Alan1.Name = "Ad" Alan1.Type = 10 Alan1.Size = 15 Alanın veya Field nesnesinin tipini belirtmeye yarayan Type değişkenine aktarılan sayı aşağıda görülüyor. Field nesnesine ait Type değişkenine aktarılan 10 sayısal değerin gerçekte Text tipindeki verileri temsil ettiği görülür. Field nesnesine ait Type değişkenine aktarılan 10 sayısal değerin Text tipindeki verileri temsil ettiğini ezbere bilmiyorsanız, 10 yerine Type değişkenine dbText değerini aktarabilirsiniz. Önce New Field bildiri deyimi ile oluşturulan daha sonra kendisine Name, Type ve Size değişkenleri ile özellikleri belirlenen bir Field nesnesini Table nesnesine dahil etmek veya Field nesnesinden Table nesnesi içinde yararlanmak için Append methodundan yararlanılır. Constant Value Description dbBoolean 1 Boolean (True/False) data dbByte 2 Byte (8-bit) data dbInteger 3 Integer data dbLong 4 Long Integer data dbCurrency 5 Currency data dbSingle 6 Single-precision floating-point data dbDouble 7 Double-precision-floating-point data dbDate 8 Data value data dbText 10 Text adta (variable width) dbLongBinary 11 Binary data (bitmap) dbMemo 12 Memo data Table nesnesinde bulunan Field veya alanlar, Table nesnesine ait Fields adlı değişkeninde saklanır. Field kendi başına bir nesne iken, Fields Table nesnesine ait bir değişkendir. Tablo.Fields.Append Alan1 Bu program satırı ile örneğimize göre diskteki ADRES ve program içindeki “Tablo” olan Table nesnesine Append methodu ile “Alan1” adlı Field nesnesi eklenmektedir. Şimdi sıra Table nesnesine yapılacak kayıtlara erişimde kullanılacak olan Index’in belirlenmesine geldi. Table nesnesine eklenen alanlardan istenen alan Index anahtarı olarak kullanılabilir. Index 449 nesnesinden Table nesnesi içinde yararlanabilmek veya Index nesnesini Table nesnesine dahil edebilmek için daha önce Index nesnesine ait Name, Unique, Primary ve Fields değişkenlerine bilgi aktarılması gerekiyor. Idx.Name = “PrimaryKey” Idx.Unique = True Idx.Primary = True Idx.Fields = "Soyad" Index’in adı Name değişkenine, Index anahtarı olarak kullanılacak alanın adı ise Index nesnesine ait Fields değişkenine aktarılır. Table nesnesine ait Fields değişkeni ile Index nesnesine ait olanı birbirleri ile karıştırmamak gerekir. Bir table nesnesinde birden fazla index kullanılabilir. Ancak bunlardan yalnızca biri Primary index olarak seçilebilir. Bunun dışında aynı anahtar değerine sahip birden fazla kayda izin verilip verilmeyeceğini Index nesnesine ait Unique değişkeni ile belirlenir. Index nesnesinin gerekli olan bütün özellikleri bu şekilde belirlendikten sonra yine Append methodu ile hazırlanan Index nesnesi Table nesnesine dahil edilmelidir. Tablo.Indexes.Append Idx Hazırladığımız Index nesnesine Idx adını verdiğimizi hatırlayalım. Bu işlemden sonra Table nesnesi veri tabanı nesnesine dahil edilebilir duruma geldi. Table nesnesini Database nesnesine dahil edebilmek için yine Append methodundan yararlanılır. Database nesnesinde bulunan Table’lar Database nesnesine ait TableDefs adlı değişkende saklandığı için Database nesnesine Table nesnesi eklemede kullanılan program satırı aşağıdaki gibi olmalıdır. Dosya.TableDefs.Append Tablo Bu örnek çalıştırıldıktan sonra hard diskteki adı TEST.MDB olan Access formatındaki veri tabanı dosyasına ADRES adında bir tablo eklenir (Şekil 9.e-5). 450 Şekil 9.e-5 1. MDB Dosyasına Yeni Kayıt Yazmak Şekil 9.e-6 Çalışma anında kullanıcı Formdaki TextBox’lara kaydın içeriğini girip Kaydet düğmesinde tıklama yapınca TextBox’ların içerlikleri MDB dosyasının ADRES adlı tablosuna yazılacaktır. Bu nedenle TEST.MDB veri tabanı dosyası ile dosyanın ADRES adlı tablonun açılması sağlanmalıdır. Veri tabanı dosyasını ve dosyadaki tabloyu açmak için daha önceden Database ve RecordSet tipli iki değişkenin tanımlanması gerekir. Veri tabanı dosyasına kayıt girmek amacıyla kullanılacak bu örnek projede birden fazla yordam olacağı için Database ve RecordSet tipli değişkenlerin forma ait Declaration kısmında tanımlanması gerekir (Şekil 9.e-7). 451 Şekil 9.e-7 Database tipli değişkene “Dosya”, RecordSet tipindeki değişkene ise “Kayıt” adını verelim. Değişken tanımlama işleminden sonra dosyanın ve tablonun açılmasını sağlamalı veya tanımlanan değişkenlere Set edilmelidir. Form_Load yordamındaki Kayıt.Index = “PrimaryKey” satırı ile kullanılacak index dosyası seçilir. Kayıt girişinde olmasa bile kayıt okumada mutlaka index dosyası açılmalıdır. Seçilen index dosyası o anda kullanılan Table nesnesine ait “Index” adlı değişkende saklanır. Kayıt girilecek tablodaki alanlarla aynı sayıda TextBox bulunan bir forma sahip proje çalıştırılınca imleç formdaki ilk TextBox’a konumlanır. Veri tabanı dosyasına yazılmak istenen kaydın ayrıntılarının ilgili TextBox’lara yazılması tamamlanınca formdaki Kaydet başlıklı düğmede tıklama yapılmalıdır. Bu nedenle TextBox’lara girilen bilgilerin MDB dosyasına yazacak program kodlarının Kaydet başlıklı düğmeye ait Click yordamına yazılması gerekir. Private Sub KAYDET_Click() Cevap = MsgBox("Bu kayıt dosyaya yazılsın mı?", 4) If Cevap = 6 Then Kayıt.AddNew Kayıt.Fields("Ad") = Text1.Text Kayıt.Fields("Soyad") = Text2.Text Kayıt.Fields("Adres") = Text3.Text Kayıt.Fields("Tel") = Text4.Text Kayıt.Fields("Sehir") = Text5.Text Kayıt.Update Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text5.Text = "" 452 Text1.SetFocus End If End Sub Çalışma anında TextBox’lara bilgi girilip “Kaydet” düğmesinde tıklama yapıldığı zaman işletilen Kaydet_Click yordamında en başta kullanıcıdan MsgBox() fonksiyonu ile kaydın tabloya yazılması konusunda onay alınmaktadır. Yöneltilen soruya Evet cevabının verilemsi halinde ilk olrak AddNew methodu ile tablonun sonuna boş bir kayıt eklenir. Ardından TextBox’ların içerikleri tek tek kaydın alanlarına aktarılır. En son olarak Update methodu ile RecordSet nesnesinin içeriklerinin tabloya yazılması sağlanır. 2. Veri Tabanı Dosyasındaki Kayıtların Arasında Dolaşmak Proje başlatılır başlatılmaz hem veri tabanı dosyası açılır hem de dosyanın seçilen tablosundaki ilk kaydı ekrana getirilir. Bu amaçla projenin formunun Form_Load yordamı aşağıdaki şekilde düzenlenir. Private Sub Form_Load() Set Dosya= OpenDatabase("C:\Belgelerim\TEST.MDB") Set Kayıt = Dosya.OpenRecordset("ADRES") Kayıt.Index = "PrimaryKey" Kayıt.MoveFirst Text1.Text = Kayıt.Fields("Ad") Text2.Text = Kayıt.Fields("Soyad") Text3.Text = Kayıt.Fields("Adres") Text4.Text = Kayıt.Fields("Tel") Text5.Text = Kayıt.Fields("Sehir") End Sub 453 Şekil 9.e-8 TEST adı verilen veri tabanı dosyası CreateDatabase() fonksiyonu ile hazırlanırken ikinci parametre olarak “dbLangGeneral” yerine dbLangTurkish bilgisi verilseydi indexler Türkçenin alfabetik sırasını gözetirdi. Set Dosya = CreateDatabase( “C:\ORNEK\TEST.MDB “, dbLangTurkish) Bu sırada “Sonraki kayıt” başlıklı düğmede tıklama yapılınca bu düğmeyle aynı ada sahip yordam işletilir. Bir sonraki kaydı ekrana getirmek için MoveNext methodu ile kayıt okuma kafası bir sonraki kayda konumlanır. Private Sub İleri_Click() Kayıt.MoveNext Text1.Text = Kayıt.Fields("Ad") Text2.Text = Kayıt.Fields("Soyad") Text3.Text = Kayıt.Fields("Adres") Text4.Text = Kayıt.Fields("Tel") Text5.Text = Kayıt.Fields("Sehir") End Sub Bir önceki kayda gitmeyi sağlayan yordamın, bu yordamdan tek farkı, MoveNext yerine MovePrevious methodunun kullanılmasıdır. 3. Veri Tabanı Dosyasında Kayıt Aramak Tablolarda çok sayıda kayıt varsa ileri geri arama suretiyle kayıt arama bazen pratik olmaz. Bu amaçla indexlerden yararlanarak hızlı bir şekilde istenen kayıt tabloda bulunabilir. Veri tabanı 454 dosyasının aktif tablosundan arama yapmak için Seek methodu kullanılır. Açık olan herhangi bir index yokken Seek methodu kullanılamaz. Kullanıcı çalışma anında tablodan kayıt araması yapmak istediği zaman Kayıt Arama başlıklı düğmede tıklama yapacak. Bu düğmede tıklama yapılınca kullanıcıdan aranacak kaydın arama anahtarı istenir. Üzerinde çalıştığımız TEST.MDB dosyasındaki tek Table olan ADRES tablosunda bir tek index hazırlanmış ve index için Soyad alanı index anahtarı olarak gösterilmiştir. Buna göre bie Seek methodu ile ancak Soyad alanına göre kayıt araması yapılabilir. Bu amaçla Kayıt Arama başlıklı düğmede tıklama yapılınca SetFocus methodu ile imlecin Soyad TextBox’ına gitmesi sağlandı. Private Sub KayıtArama_Click() Text1.Text = "" Text2.Text = "" Text3.Text = "" Text4.Text = "" Text5.Text = "" Kayıt.MoveFirst Text1.SetFocus End Sub Verilen program kodlarından tespit edileceği gibi Kayıt Arama başlıklı ve “Arama” adlı düğmede tıklama yapılınca, Formdaki bütün TextBox’ların içerikleri silinmektedir. Bu sırada Tab tuşu veya fare ile ekleme noktasını bir sonraki metin kutusuna aktaracak olursanız “Soyad” adlı bu metin kutusu ile ilgili olarak LostFocus olayı meydana gelir. Bu nedenle kayıt arama işlemini yapacak program kodları “Soyad” adına sahip metin kutusunun LostFocus yordamına dahil edilir. Private Sub Soyad_LostFocus() Kayıt.Seek "=", Text2.Text Text1.Text = Kayıt.Fields("Ad") Text2.Text = Kayıt.Fields("Soyad") Text3.Text = Kayıt.Fields("Adres") Text4.Text = Kayıt.Fields("Tel") Text5.Text = Kayıt.Fields("Sehir") End Sub Yapılan tanımlamaya göre kullanıcı aramak istediği kaydın anahtarını girdikten sonra aramayı başlatabilmesi için Soyad adındaki TextBox’ta iken Tab tuşuna basması gerekiyor. Soyad adlı TextBox’ta Tab tuşuna basılması halinde işletilecek bu yordam ile Soyad TextBox’ın içeriğine göre Seek methodu ile arama yapılır. Bu yordamda aranan kayıt bulunduktan sonra alanların içerikleri ilgili TextBox’lara aktarılır. Aranan kaydın dosyada bulunup bulunmadığını öğrenmek için Table nesnesine ait NoMatch değişkenin içeriğine bakılır. Seek methodu ile arama yapılan her arama işleminden sonra Tabloya ait NoMatch değişkenin içeriği güncelleşir. Aranan kayıt varsa bu değişkenin içeriğine mantıksal False (0) , aranan kayıt bulunamazsa bu kez NoMatch değişkenine mantıksal True (-1) değeri aktarılır. 455 Private Sub Soyad_LostFocus() Kayıt.Seek "=", Text2.Text If Kayıt.NoMatch = 0 Then Text1.Text = Kayıt.Fields("Ad") Text2.Text = Kayıt.Fields("Soyad") Text3.Text = Kayıt.Fields("Adres") Text4.Text = Kayıt.Fields("Tel") Text5.Text = Kayıt.Fields("Sehir") End If End Sub Seek methodunun dışarıdan iki parametre aldığı görülür. Birincisinde “=”,”<” gibi operatörler, ikincisinde ise arama anahtarı. Eğer arama anahtarınız Maaş gibi sayısal bilgi içeren bir alan ve Tablodan maaşı 15.000.000’ dan fazla olan herhangi bir kişinin kaydı aranıyor olsaydı Seek methodu, TabloNesnesi.Seek > 15000000 şeklinde kullanılırdı. Seek methodundan sonra tabloya ait NoMatch değişkeninin içeriği güncelleşir. Arana kayıt bulunmuş ise bu değişkenin içeriği mantıksal yanlış veya 0 olur. 4. Kayıtlarda Değişiklik Yapmak Çalışma anında “Değiştir” başlıklı düğmede tıklama yapılınca TextBox’ların en son içeriği Update methodu ile tabloda aynı kaydın üzerine tekrar yazılacaktır. Bunun için de TextBox’ların içeriklerinin tekrar alanlara aktarılması gerekir. Okunan bir kaydın içeriğinde değişiklik yapabilmek için daha önceden Edit moduna geçmek gerekiyor. Bunun için Edit methodundan yararlanılır. Private Sub Değiştir_Click() Kayıt.Edit Kayıt.Fields("Ad") = Text1.Text Kayıt.Fields("Soyad") = Text2.Text Kayıt.Fields("Adres") = Text3.Text Kayıt.Fields("Tel") = Text4.Text Kayıt.Fields("Sehir") = Text5.Text Kayıt.Update End Sub 5. Veri Tabanı Dosyasından Kayıt Silmek 456 Önce silinmek istenen kayıt bulunur. Ardından Delete methodu ile söz konusu kayıt dosyadan silinir. Bu yordamda Delete methodu ile yapılan kayıt silme işleminden sonra MovePrevious methodu ile tablodaki bir önceki kayda gidilmekte ve bu kaydın içeriği TextBox’lar aracılığı ile ekrana getirilmektedir. Private Sub KayıtSil_Click() Kayıt.Delete Kayıt.MovePrevious Text1.Text = Kayıt.Fields("Ad") Text2.Text = Kayıt.Fields("Soyad") Text3.Text = Kayıt.Fields("Adres") Text4.Text = Kayıt.Fields("Tel") Text5.Text = Kayıt.Fields("Sehir") End Sub 9.f. Recordset Nesnesi Visual Basic’in veri tabanı özellikleri hakkında bilgi verilen daha önceki bölümlerden bildiğiniz gibi üzerinde çalıştığınız projenin herhangi bir formuna bir Data nesnesi yerleştirmeniz halinde Database ve RecordSet nesneleri otomatik olarak hazırlanmaktadır. Diğer yandan Data kontrollerinden yararlanmadan tabanı dosyası üzerinde işlem yaparken Database ve RecordSet nesnelerini kendimiz tanımlamak durumdayız. Veri tabanı dosyaları üzerinde işlem yaparken kullanılan RecordSet gibi nesnelerin şimdiye kadar anlatılmayan özellikleri hakkında bilgi vermek için yeni bir proje hazırlayalım (Şekil 9.f-1). 457 Şekil 9.f-1 Proje çalıştırıldığı zaman Stok veri tabanı dosyası açılacak ve Kartlar tablosundaki ilk kaydın içeriği forma yerleştirmiş olduğumuz metin kutularına yazılacaktır. Bu amaçla ilk olarak formun Declaration kısmında Database ve RecordSet tipinde iki değişken tanımlamak gerekir (Şekil 9.f-2). Şekil 9.f-2 Hemen hatırlatmak gerekirse Data kontrolünü kullanmadan Visual Basic’in veri tabanı özelliklerinden yararlanmak veya Database nesnesi yardımıyla dosya açmak için daha önceden Project menüsündeki Referans komutu ile ekrana getirilen Referans diyalog kutusundan yararlanıp üzerinde çalıştığımız projeye Microsoft Database Object kitaplık dosyasını dahil etmemiz gerekir (Şekil 9.f-3). 458 Şekil 9.f-3 Projenin değişik yordamlarında kullanacağımız değişkenleri formun Declaration kısmında tanımlayıp ve Projeye “Microsoft Database Object” kitaplık dosyasını dahil ettikten sonra Form_Load yordamına aşağıdaki program satırlarını yazalım. Private Sub Form_Load() Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb") Set Kayıt = Dosya.OpenRecordset("Kartlar") Kayıt.Index = "KodIndex" Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdı") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") Form1.Text5 = Kayıt.Fields("Miktar") End Sub Daha önceki konulardan bildiğiniz gibi bu program satırları ile önce Stok.mdb dosyası açılmaktadır. Ardından OpenRecordSet() fonksiyonu ile Stok veri tabanı dosyasındaki “Kartlar” tablosu açılmakta ve bir RecordSet nesnesi hazırlanmaktadır. Visual Data Manager ile Kartlar tablosunu hazırlarken StokKodu alanını temel alan ve “KodIndex” adındaki bir index tanımlamıştık. Daha önce söz konusu tablo (RecordSet nesnesi) için hazırlanmış olan indexlerden hangisini kullanmak istiyorsanız o index’in adını RecordSet nesnesinin Index özelliğine aktarmanız gerekir. Projenin çalışması sona erdirildiği veya projedeki tek form kapatıldığı zaman açılan dosyanın kapatılmasını sağlamak için Form_Unload yordamında Close metodunu kullanmalıyız. Close methodu ile veri tabanı dosyasını kapatırsanız daha önce açılan tablolar ve indexler kendiliğinden kapanır. Private Sub Form_Unload(Cansel As Integer) Dosya.Close 459 End Sub Bu işlemlerden sonra hazırlanan proje çalıştırılınca Kartlar tablosundaki ilk kaydın içeriği formdaki metin kutusuna yazıldı. Daha önce hazırlanan index devreye sokulduğu için kayıtlar indexe temel oluşturan alana göre sıralanıp öyle ekrana gelir (Şekil 9.f-4). Şekil 9.f-4 İlk olarak tablolarda nasıl arama yapıldığı konusunda bilgi edinelim. Bu amaçla formun üzerine Kayıt Arama başlığına sahip bir düğme yerleştirelim. Daha önceki konulardan bilindiği gibi kayıt ararken “Seek” metodu kullanılmaktadır. Seek metodunun kullanış şeklini hatırlayalım. Private Sub Arama_Click() Ara = InputBox("Kayıt Arama") Kayıt.Seek "=", Ara If Kayıt.NoMatch = False Then Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdi") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") Form1.Text5 = Kayıt.Fields("Miktar") Else MsgBox "Aranan Kayıt Bulunamadı" End If End Sub Çalışma anında Kayıt arama başlıklı düğmede tıklama yapılıp bu yordam işletilecek olunursa önce InputBox()) fonksiyonu yardımıyla aranacak kaydın veya Stokun kodunun girilebildiği bir diyalog kutusu ekrana gelir (Şekil 9.f-5). 460 Şekil 9.f-5 InputBox fonksiyonu ile ekrana getirilen diyalog kutusuna yazılan StokKodu önce “Ara” adı verilen değişkene aktarılır. Ara değişkeni ise Seek metoduna parametre olarak verilmektedir. Daha önceki konulardan bildiğiniz gibi Seek methodu ile indexlerden yararlanarak yapılan her arama işleminden sonra RecordSet nesnesinin NoMatch özelliğinin içeriği değişmektedir. Seek metodu ile yapılan arama işlemi sonucu aranan kayıt tabloda bulunduğu zaman NoMatch özelliğine mantıksal yanlış (false) değeri aktarılmaktadır. Yazılan program kodlarına göre aranan kayıt bulunduktan sonra kaydın içeriği formdaki metin kutularına aktarılmaktadır. Aynı Stok koduna sahip birden fazla kaydın olmasını engellemek için Kartlar tablosu için hazırladığımız indexe Unique özelliği verilmişti. Ancak “Hareketler” tablosunda aynı Stok koduna sahip birden fazla kayıt bulunabileceği için Hareketler tablosu için hazırlanan indsex Unique özelliğine sahip değildir. Aynı koda veya arama anahtarına sahip birden fazla kaydın söz konusu olduğu durumlarda Seek metodu yeterli olmamaya başlar. Bu gibi durumlarda FindFirst, FindNext, FindLast ve FindPrevios metotları kullanılmaktadır. Arama işlemi yapılırken kullanılan bu 4 metodu anlatmak için “Kartlar” tablosu ile birlikte Stok veri tabanı dosyasındaki “Hareketler” tablosunu açalım. Bu amaçla ilk olarak Hareketler tablosu için formun Declaration kısmında “İşlemler” adında bir RecordSet nesnesi tanımlayalım. Bu şekilde Hareketler tablosu için bir RecordSet nesnesi tanımlandıktan sonra içeriği ekrana getirilen Stok Kartı ile ilgili giriş-çıkışları “Hareketler” tablosundan bulup formun alt kısmına yazabilmek için üzerinde çalışılan projenin formunu düzenleyelim (Şekil 9.f-6). 461 Şekil 9.f-6 Form bu şekilde düzenlenip proje çalıştırıldığı zaman ilk olarak Kartlar tablosundaki ilk kaydın içeriği formun üst kısmındaki metin kutularına yazılır. Bu işlemleri yapacak program kodları aşağıda görebilirsiniz. Ardından içeriği ekranda görüntülenen Stok kartına ait ilk giriş veya çıkış işlemleri Hareketler tablosundan aranıp formun alt kısmında bir sıra halinde düzenlenen metin kutularına yazılır. Private Sub Form_Load() Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb") Set Kayıt = Dosya.OpenRecordset("Kartlar") Set Islemler = Dosya.OpenRecordset("Hareketler", dbOpenDynaset) Kayıt.Index = "KodIndex" Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdi") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") Form1.Text5 = Kayıt.Fields("Miktar") Ölçüt = Text1.Text Ölçüt = "StokKodu ='" & Ölçüt & "'" Islemler.FindFirst Ölçüt Form1.Text6 = Str(Islemler.AbsolutePosition + 1) Form1.Text7 = Islemler.Fields("Tarih") Form1.Text8 = Islemler.Fields("Islem") Form1.Text9 = Islemler.Fields("Aciklama") Form1.Text10 = Islemler.Fields("Miktar") End Sub Proje çalıştırıldığı zaman işletilecek bu yordamda önce Stok veri tabanı dosyası, ardından Kartlar ve Hareketler tablosu açılmaktadır. Ardından Kartlar tablosu için daha önce hazırlanmış olan “KodIndex” adındaki index devreye sokulmaktadır. Bu örnekte Hareketler tablosunu açarken veya bu tablo için RecordSet nesnesini tanımlarken OpenREcordSet() fonksiyonuna ikinci parametre olarak “dbOpenDynaset” değeri aktarıldı. OpenRecordSet() nesnesine dbOpenDynaset veya dbOpenSnopshot değerleri ikinci parametre olarak verilmeden tanımlanan RecordSet nesneleri, FindFirst gibi metotları desteklemiyor. Yukarıda kodları verilen Form_Load yordamında Hareketler 462 tablosunda arama yaparken FindFirst metodu kullanıldı. Şekil 9.f-7’de verilen ekran görüntüsü proje çalıştırıldıktan sonra alınmıştır. Şekil 9.f-7 Çalışma anında “Sonraki Hareket” başlığına sahip düğmede tıklama yapıldığı zaman içeriği ekranda görüntülenen Stok kartı ile ilgili bir sonraki Stok giriş veya çıkış kaydını formun alt kısmına getirmek için Aşağıda program kodları verilen program satırları hazırlandı. Private Sub Sonraki_Hareeket_Click() Ölçüt = Text1.Text Ölçüt = "StokKodu ='" & Ölçüt & "'" Islemler.FindNext Ölçüt Form1.Text6 = Str(Islemler.AbsolutePosition + 1) Form1.Text7 = Islemler.Fields("Tarih") Form1.Text8 = Islemler.Fields("Islem") Form1.Text9 = Islemler.Fields("Aciklama") Form1.Text10 = Islemler.Fields("Miktar") End Sub İçeriği ekranda görüntülenen Stok kartına ait ikinci Hareketler tablosunu aramak için FindNext metodu kullanıldı. Bu yordam ikinci kez işletildiğinde ise bu kez söz konusu stok kartına ait 3. hareket kaydı tablodan aranıp ekrana getirilir. Benzer şekilde FindLast veya FindPrevius metotlarını kullanabilirsiniz. Eğer formun üst kısmındaki metin kutularına Kartlar tablosundaki bir sonraki Stok kartının içeriğini yazmak istiyorsanız bu kez “Sonraki Stok Kartı” düğmesinde tıklama yapmanız gerekir. Sonraki Stok Kartı başlıklı düğme için hazırlanmış olan program kodları aşağıda görebilirsiniz. Private Sub SonrakiKart_Click() Kayıt.Index = "KodIndex" Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdi") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") 463 Form1.Text5 = Kayıt.Fields("Miktar") Ölçüt = Text1.Text Ölçüt = "StokKodu ='" & Ölçüt & "'" Islemler.FindFirst Ölçüt Form1.Text6 = Str(Islemler.AbsolutePosition + 1) Form1.Text7 = Islemler.Fields("Tarih") Form1.Text8 = Islemler.Fields("Islem") Form1.Text9 = Islemler.Fields("Aciklama") Form1.Text10 = Islemler.Fields("Miktar") End Sub Bu yordam sayesinde önce Stok kartındaki bir sonraki kayıt aktif kayıt durumuna getirilmektedir. Ardından söz konusu stok kartı ile ilgili ilk stok giriş veya çıkış kaydı Hareketler tablosundan bulunup formun alt kısmına yazılmaktadır. Şekil 9.f-9’de verilen ekran görüntüsü çalışma anında “Sonraki Stok Kartı” başlıklı düğmede tıklama yapıldıktan sonra alınmıştır. Şekil 9.f-9 1. RecordSet Nesnesi ile DBGrid Nesnesini Birlikte Kullanmak Şimdi örnek olması için formun alt kısmına metin kutularını silip bir DBGrid nesnesi yerleştirelim. Bu amaçla ilk olarak Components diyalog kutusundan yararlanıp üzerinde çalışılan projeye DBGrid kontrolünü dahil edelim. DBGrid nesnesinden yararlanabilmek için formun üzerine ayrıca bir Data nesnesi yerleştirelim. Şekil 9.f-10’da verilen ekran görüntüsünü DBGrid kontrolü projeye dahil edildikten sonra alınmıştır. 464 Şekil 9.f-10 Bu işlemden sonra ekrana Properties diyalog kutusunu getirip Data nesnesi için veri tabanı dosyası ve tablo seçimi yapılır. Data nesnesi için veri tadanı dosyası seçilirken DatabaseName özelliğinden yararlanılır. Properties penceresinden yararlanarak Data nesnesi için dosya ve tablo seçimi yapıldıktan sonra DBGrid nesnesi için DataSource özelliğnden yararlanarak RecordSet seçimi yapılır (Şekil 9.f-11). Şekil 9.f-11 Bu seçim ve ayarlamalardan sonra Form_Load yordamı aşağıdaki gibi yeniden yazıldı. Private Sub Form_Load() Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb") Set Kayıt = Dosya.OpenRecordset("Kartlar") 465 Kayıt.Index = "KodIndex" Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdi") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") Form1.Text5 = Kayıt.Fields("Miktar") End Sub Bu program satırları sayesinde Kartlar tablosu açılır ve ilk kaydın içeriği formdaki metin kutularına yazılır. Data nesnesi ile DBGrid nesnesi arasında Properties penceresinden yararlanılarak bağlantı kurulduğu için bu sırada proje çalıştırılacak olursa formun üst kısmına Kartlar tablosundaki ilk kayıt, Grid nesnesinde ise Hareketler tablosundaki bütün kayıtlar görüntülenir. Ancak DBGrid nesnesinde yalnızca içeriği formun üst kısmında görüntülenen Stok kartına ait hareket kayıtlarının listelenmesi istendiği için Form_Load yordamına SQL dilinin Select deyiminin kullanıldığı satır eklendi Private Sub Form_Load() Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb") Set Kayıt = Dosya.OpenRecordset("Kartlar") Kayıt.Index = "KodIndex" Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdi") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") Form1.Text5 = Kayıt.Fields("Miktar") Data1.RecordSource="select*from[Hareketler]where[StokKodu]="& Kayıt![StokKodu] & "" Data1.Refresh End Sub Form_Load yordamına eklenen bu program satırı sayesinde Formun üst kısmının içeriği görüntülenen stok kartına ait stok giriş ve çıkış kayıtları görüntülenir. Şekil 9.f-13’de verilen ekran görüntüsü bu değişiklikler gerçekleştirilip proje çalıştırıldıktan sonra alınmıştır. Data nesnesine Visible değişkenine Properties penceresinden yararlanarak True değeri aktarıldığı için çalışma anında Data nesnesi ekranda gizlenmiş durumdadır. 466 Şekil 9.f-12 Bu sırada Sonraki Stok Kartı başlıklı düğmede tıklama yapıldığı zaman bir sonraki Stok kartının içeriğinin formdaki metin kutularında görüntülenmesi istenirse bu düğmenin Click yordamı aşağıdaki şekilde düzenlenir. Private Sub SonrakiKart_Click() Kayıt.MoveNext Form1.Text1 = Kayıt.Fields("StokKodu") Form1.Text2 = Kayıt.Fields("StokAdi") Form1.Text3 = Kayıt.Fields("Birim") Form1.Text4 = Kayıt.Fields("Fiyat") Form1.Text5 = Kayıt.Fields("Miktar") Data1.RecordSource = "select*from [Hareketler] where [StokKodu]=" & Kayıt![StokKodu] & "" Data1.Refresh End Sub Bu yordam sayesinde hem bir sonraki Stok kartının üzerine gidilir hem de DBGrid nesnesine bu stok kartına ait giriş ve çıkış kayıtları yazılır. Şekil 9.f-20’deki ekran görüntüsü “Sonraki Stok Kartı” başlıklı düğmede tıklama yapıldıktan sonra alınmıştır. Şekil 9.f-20 2. DATA Kontrolü ile DAO Library’i Birlikte Kullanmak Bu kitabın şimdiye kadar verilen bölümlerinde veri tabanı dosyaları üzerine işlem yaparken ya Data kontrolünden ya da Microsoft DAO 3.5 Library kitaplığından yararlandık. Program kodu dahilinde veri tabanı dosyası üzerinde işlem yaparken kullanılan OpenF,database() ve OpenRecordset() gibi fonksiyonları kullanabilmek için Microsoft DAO 3.5 Librar’nin projeye dahil edilmesi gerekir. Diğer yandan aynı anda Data kontrolünden hem de Microsoft DAO 3.5 Library ile kullanıma sunulan fonksiyon ve motodlarından yararlanmak mümkündür. 467 Data kontrolü ile Microsoft DAO Library’nin birlikte nasıl kullanıldığını görmek için Müşteri adındaki veri tabanı dosyasından yararlanacağız. Bu veri tabanı dosyasında Cari Kartlar ve Cari İşlemler adında iki tablo bulunmaktadır. Şekil 9.f-21'’e verilen ekran görüntüsü verilen formun üst kısmında Data kontrolünden yararlanılarak Cari İşlemler tablosunun aktif kaydı görüntülenecektir. Alt kısmında ise formun üst kısmında içeriği görüntülenen kayda ait Cari Hesap kaydının içeriği görüntülenecektir. Şekil 9.f-21 Bu forma yerleştirmiş olduğumuz Data nesnesi ile Müşteri.mbd dosyasındaki Cari İşlemler tablosu arasında bağlantı kurulur. Ayrıca formun üst kısmındaki TectBox nesneleri ile Cari İşlemler tablosunun alanları arasında bağlantı kuruldu. Bu işlemlerden sonra proje çalıştırıldığında Şekil 9.f22'’deki ekran görüntüsü ile karşılaşılır. Şekil 9.f-22 9.g. Sorgu Hazırlamak ve SQL Dili Bu bölümde ilk olarak Visual Data Manager’den yararlanarak Stok.mdb veri tabanı dosyası için bir sorgu hazırlayalım. Bu amaçla ilk olarak Stok.mdb veri tabanı dosyasını açıp Data Manager penceresinde getirelim. Ardından Manager penceresinin sol tarafındaki Database Window penceresinin sınırları için farenin sağ tuşu ile tıklama yaparak kısayol menüsünü açalım. Şekil 9.g-1 Yeni bir sorgu hazırlamak için kısayol menüsünden New Query komutunu vermemiz gerekir. Kısayol menüsünden New Query komutunu verirsek ekrana sorgu yapısının belirlendiği Query Builder diyalog kutusu gelir (Şekil 9.g-2). 468 Şekil 9.g-2 Çok sayıda seçeneğin bulunduğu Query Builde diyalog kutusunda üzerinde çalışılan veri tabanı dosyasında bulunan tablolar Tables liste kutusunda listelenmektedir. Bu amaçla ilk olarak Tables kutusunda sorguya temel oluşturacak tablo veya tablolar seçilir. Sorgu yardımıyla birden fazla tablodan bilgi derlenecekse fare ile söz konusu tablolar seçilmelidir. Seçilen tabloda bulunan alanlar Fields to Show liste kutusunda listelenir(Şekil 9.g-3). Örnek olması için hazırladığımız sorguda hem “Hareketler” tablosundan hem de “Kartlar” tablosundan alan seçmek istediğimiz için üzerinde çalıştığımız veri tabanı dosyasındaki her iki tabloyu da seçelim. Query Builder diyalog kutusundaki tablo ve alan adlarının üzerinde tıklama yapıldığı zaman seçili duruma gelmektedirler. Seçili durumdaki alan veya tablonun adı üzerinde tıklama yapılırsa seçili olma özelliği kalkar. 469 Şekil 9.g-3 Sorguya kaynaklık edecek tablolar bu şekilde seçildikten sonra Fields to Show liste kutusunda alan seçimi yapılır (Şekil 9.g-4). Bu liste kutusunda alan adlarının önüne ilgili tablonun adı eklendiği için alanın hangi tabloya dahil olduğunu hemen tespit edebilirsiniz. Şekil 9.g-4 Hazırladığımız sorguya “Hareketler” tablosunun bütün alanlarını ve “Kartlar” tablosundan “Stok Adı” alanını dahil etmek için aşağıdaki gibi alan seçimi yapılmalıdır. Bu şekilde alan seçimi yapıldıktan sonra kayıt filtre etme kriterleri önceden biliniyorsa Query Builder diyalog kutusunun üst kısmındaki Field Name liste kutusunda kayıt filtre ederken veya kriter belirlerken kullanılacak alan belirlenir. Şekil 9.g-4’te verilen ekran görüntüsünde Field Name liste kutusunda “StokKodu” alanının adı vardı. Ancak hazırlamak istediğimiz bu sorguda “Hareketler” tablosundaki “İşlem” alanında “Giriş” bilgisi olan kayıtları görmek istediğimiz için Filed Name liste kutusunda “İşlem” alanını seçelim. Ardından Value metin kutusunda “Giriş” yazalım (Şekil 9.g-5). 470 Şekil 9.g-5 Kayıt filtre etme kriterini belirlerken Operator liste kutusunda operator seçimi yapabilirsiniz. Başlangıçta Operator liste kutusunda “=” operatorü seçili durumda olduğu için bu liste kutusunda herhangi bir seçim yapmadık. Eğer “And” veya “Or” bağlacı ile ikinci bir kriter tanımlamak istiyorsanız And Into Criteria veya Or Into Criteria düğmelerinde tıklama yapmanız gerekir. Bu düğmelerde tıklama yapmanız halinde tanımladığınız kriter diyalog kutusunun alt kısmındaki Criteria başlıklı metin kutusuna yazılır. Şekil 9.g-6’da verilen ekran görüntüsü And Into Criteria düğmesinde tıklama yapıldıktan sonra alındı. Şekil 9.g-6 Bu sırada diyalog kutusunun alt kısmına yazılan kriterde istediğiniz değişikliği yapabilir veya yeni bir kriter tanımlayabilirsiniz. Hazırladığınız sorguyu test etmek istiyorsanız Run düğmesine ve sorguyu veri tabanı dosyasına kaydetmek istiyorsanız Save düğmesinde tıklama yapmanız gerekir. Save düğmesinde tıklama yaparsanız sorguya ad verilen bir diyalog kutusu ekrana gelir (Şekil 9.g-7). 471 Şekil 9.g-7 Bu diyalog kutusunda sorgunun adını belirleyip OK düğmesinde tıklama yaparsanız hazırladığınız sorgu veri tabanı dosyasına kaydedilir (Şekil 9.g-8) ama Query Builder diyalog kutusu başka bir sorguyu hazırlayabilmeniz için ekranda kalmaya devam eder. Query Builder diyalog kutusu kapatınca hazırlanan sorgu Visual Data Manager penceresi içinde listelenmeye başlar. Şekil 9.g-8 Hazırladığınız sorguyu Data manager penceresinde iken açabilir, sorgu yardımıyla sorguya temel oluşturan tablodaki kayıtlarda değişiklik yapabilirsiniz. Diğer yandan yeni bir sorguyu hazırlamak için Database penceresinde ait kısayol menüsünden New Query komutunu vermek yerine Utility menüsünden Query Builder komutunu verirseniz ekrana sorgu tasarımı yapan Query Builder diyalog kutusu gelir. Şekil 9.g-9 472 1. Program Kodu Yazarak Sorgu Hazırlamak Sorguların nasıl hazırlandığını anlatmak için işe yeni bir projeyi hazırlamakla başladım. Proje dahilinde Database, RecordSet ve Query nesnelerini kullanacağım için projedeki formun “Declaration” kısmında aşağıdaki gibi 3 değişken tanımlayalım (Şekil 9.g-9). Sorgu hazırlama işlemi öncesi Query nesnesi tanımlamak için QueryDef bildiri deyiminden yararlanmak gerekmektedir. Şekil 9.g-9 Ardından üzerinde çalıştığımız projenin formuna sorgu yardımıyla erişim sağlamak istediğimiz “Adresler” adlı tablonun kayıt yapısını gözeterek aşağıdaki gibi 5 label ve metin kutusu nesnesi dahil edelim (Şekil 9.g-10). Şekil 9.g-10 Çalışma anında formun üzerinde tıklama yapıldığı zaman önce “Müşteri” adlı veri tabanının dosyasının açılmasını Adresler tablosunu temel alan bir sorgunun hazırlanmasını sağlamak üzere Form_Click yordamını aşağıdaki gibi düzenleyelim. Private Sub Form_Click() Set Dosya = OpenDatabase("C:\Kitap\Adres.mdb") Set Sorgu = Dosya.CreateQueryDef("Sorgu", "SELECT Adresler;") Set Tablo = Dosya.OpenRecordset("Sorgu") Text1.Text = Tablo.Fields("Ad") Text2.Text = Tablo.Fields("Soyad") Text3.Text = Tablo.Fields("Adres") Text4.Text = Tablo.Fields("Tel") Text5.Text = Tablo.Fields("Sehir") End Sub 473 * FROM Bu yordamda önce OpenDatabase() fonksiyonu ile veritabanı dosyası açılmaktadır. Bu yordamdaki 2. program satırında SQL dilinin SELECT deyiminden ve CreateQueryDef() fonksiyonundan yararlanılarak bir sorgu hazırlanmaktadır. Ekran görüntüsü verilen program kodlarında görebileceğiniz gibi CreateQueryDef() fonksiyonu dışarıdan 2 parametre almaktadır. İlk parametre ile hazırlanıp veri tabanı dosyasına dahil edilecek sorgunun adı belirtilmektedir. 2. parametrede ise sorgunun yapısını belirlemede kullanılan SQL dilinin deyimleri veya satırları bulunmaktadır. CreateQueryDef() fonksiyonunun kullanıldığı program satırını ikiye bölmek için “-“ karakterinden yararlandık. SQL dilindeki “SELECT” deyimi ile sorguda yer alacak alanlar belirlenmektedir. Sorguya temel oluşturan tablodaki bütün alanların sorguda yer almasını istiyorsanız SELECT deyiminin yanına “*” işaretini yazmanız gerekir. Sorguya hangi alanları dahil etmek istiyorsanız o alanların adlarını aralarına virgül koyarak SELECT deyiminin yanına yazmanız gerekir. FROM deyimi ile sorguya temel oluşturacak tablo belirlenmektedir. Daha önceleri Data kontrolünden yararlanmadan veri tabanı dosyasındaki tablolar üzerinde işlem yapmak için OpenRccordSet() fonksiyonu yardımıyla RecordSet nesnesi hazırlıyorduk. Hangi tablo için RecordSet nesnesi hazırlanmak isteniyorsa o tablonun adı OpenRecordSet() fonksiyonuna parametre olarak veriliyordu. Ancak yukarıda verilen yordamda “Adres” adlı veri tabanı dosyasındaki “Adresler” tablosu üzerinde işlem yaparken hazırladığımız sorguyu kullanmak istemediğimizden bu kez OpenRecordSet() fonksiyonuna bu sorgunun adını parametre olarak verdik. Bu program kodları sayesinde çalışma anında formun üzerinde tıklama yapıldığı zaman hem önce “Sorgu” adında bir sorgu hazırlayıp veri tabanı dosyasına dahil edilecek hem de sorguya temel oluşturan Adresler tablosundaki ilk kaydın içeriği ekrana getirilecektir. Şekil 9.g-11 Bu sırada Visual Data Manager ile “Adres” adlı veri tabanı dosyasına bakacak olursanız dosyaya ”Sorgu” adında bir Query veya sorgunun dahil edildiğini görürsünüz (Şekil 9.g-12 ). Şekil 9.g-12 474 Bu sırada sorgunun üzerinde çift tıklama yaparak sorgunun üzerinden, sorgunun kendisine temel aldığı “Adresler” tablosunun kayıtlarını görüntüleyebilir, sorgu yardımıyla tabloya yeni kayıtların girişini yapabilirsiniz. Şekil 9.g-13’te verilen ekran görüntüsünü sorgunun üzerinde çift tıklama yaptıktan sonra alınmıştır. Şekil 9.g-13 Data Manager penceresinde daha önce CreateQueryDef() fonksiyonu ile hazırlamış olduğunuz bir sorgunun üzerinde farenin sağ tuşu ile tıklama yaparsanız sorgu ile kısayol menüsü açılır. Kısayol menüsündeki Open komutu ile sorguyu açabilir. Delete komutu ile silebilir. Rename komutu ile adını değiştirebilirsiniz. Şekil 9.g-14 Sorguya ait kısayol menüsünden Design komutunu verirseniz sorgunun hazırlanma sırasında kullanılan SQL dilinde yazılmış olan program satırları Visual Data Manager penceresinin sağ tarafındaki SQL Statement penceresine yazılır. Şekil 9.g-15’te verilen ekran görüntüsü kısayol menüsünden Design komutunu verdikten sonra alınmıştır. 475 Şekil 9.g-15 Bu sırada sorguyu hazırlamaya neden olan SQL dilindeki satırlarda değişiklik yapmak suretiyle sorguda değişiklik yapabilirsiniz. Şimdi örnek olması açısından daha önce program kodu yazarak CreateQueryDeff() fonksiyonu ile hazırladığımız sorguda, Visual data manager penceresinde değişiklik yapacağız. Yapacağımız değişiklik sonucu bu sorgu sayesinde yalnızca “Şehir” alanında “Adana” bilgisi olan kayıtlara erişim sağlanacaktır. Şekil 9.g-16 Bu sırada Exercute düğmesinde tıklama yaparak sorguda yaptığınız değişikliğin etkisini görebilirsiniz. Şimdiye kadar Visual Data Manager penceresinde sorgularla ilgili olarak anlatılanlardan tahmin etmiş olabileceğiniz gibi tasarım anında CreateQueryDef() fonksiyonuna başvurmaya gerek duymadan SQL Statement penceresine SQL dilinde program satırları yazarak sıfırdan kendiniz sorgu hazırlayabilirsiniz. Data Manager penceresinde hazırladığınız sorgunun Visual Data Manager penceresinin sol kısmında yer almasını veya daha sonra kullanmak istiyorsanız Save düğmesinde tıklama yapmanız gerekir. Şekil 9.g-17 Sorguda yaptığınız değişiklikleri kaydetmek istiyorsanız Evet düğmesinde tıklama yapmalısınız. Sorguda yaptığınız değişiklikleri dosya yansıtmak isteyip Hayır düğmesinde tıklama yaparsanız, sorgunun en son halinin başka bir ad altında kaydedilmesini sağlamak istediğiniz sorguya ad verebileceğiniz bir diyalog kutusu ekrana gelir. 476 Eğer hazırladığınız Visual Basic projesinde yapılacak sorgulamalar önceden biliniyorsa, Visual Data manager projesinden yararlanarak istediğiniz sayıda sorgu hazırlayabilirsiniz. Daha önceden hazırlayıp veri tabanı dosyasına kaydettiğiniz hangi sorgudan yararlanmak istiyorsanız o sorguyu açmak gerekir. Bu amaçla OpenQueryDef() fonksiyonundan yararlanılmaktadır. Şimdi örnek olması için hazırlayıp “Adres” veri tabanı dosyasına eklediğimiz “Sorgu” adındaki sorgudan yararlanarak “Adresler” tablosundaki bilgilere erişim sağlayalım. Bu amaçla aşağıda ekran görüntüsünü verdiğimiz Form_Click yordamındaki program satırlarını aşağıdaki gibi değiştirelim. ve Form_Load yordamına taşıyalım. Private Sub Form_Load() Set Dosya = OpenDatabase (“C:\Kitap\Adres.mdb”) Set Tablo = Dosya.OpenRecordset (“Sorgu”) Form1.Text1 = Tablo.Fields(“Ad”) Form1.Text2 = Tablo.Fields(“Soyad) Form1.Text3 = Tablo.Fields(“Adres) Form1.Text4 = Tablo.Fields(“Tel”) Form1.Text5 = Tablo.Fields(“Sehir”) End Sub Bu yordam sayesinde proje çalıştırıldığında sorgu koşullarına uyan ilk kaydın içeriği ekrana getirilir. Eğer OpenRecordSet() methoduna “Sorgu”” adındaki sorguyu parametre olarak verseydik daha önce yaptığımız tanımlamalara uygun olarak bu sorgu aracılığı ile yalnızca “Sehir” alanında “Adana” bilgisi olan kayıtlar üzerinde işlem yapılabilinirdi. Sorguların hazırlanması dışında kullanılması tablolardan pek farklı değildir. Şimdiye kadar sorgu hazırlarken SQL dilinin yalnızca SELECT deyiminden yararlandık. SELECT deyimi sayesinde bir tablodan koşula uyan kayıtlar seçilmektedir. Ayrıca SELECT deyimi ile hazırlanan sorgu daha sonra kullanılmak üzere veri tabanı dosyasına kaydedilmektedir. Yukarıda SELECT deyimi ile hazırladığım sorguyu RecordSet nesnesine parametre olarak vermiş ve sorguya temel oluşturan tablo üzerinde işlem yapmıştık. Örneğin bir Cari hesap programı dahilinde hazırladığınız ve bilgi kaydettiğiniz bir tabloda yalnızca hesap bakiyeleri borç veren kayıtlarla ilgilenmek istiyorsanız SELECT deyiminden yararlanabilirsiniz. SELECT deyimi belirtilen koşula uyan kayıtları seçer ve kayıtlar üzerinde işlem yapmanızı sağlar. SQL dilinin DELETE deyimi sayesinde istenen tabloda istenen kayıtlar kolay bir şekilde silinmektedir. Çalışma anında silmek istediğiniz kaydı ekrana getirdikten sonra Kart_Sil düğmesinde tıklama yaparsanız kayıt silinir. Ancak burada anlatmak istediğimiz, bu sırada aynı stok koduna sahip bütün kayıtların bir seferde Hareketler tablosundan silinmesidir. Bu amaçla SQL dilinin DELETE deyiminden yararlanacağız. Bu anlattıklarımıza göre Hareketler tablosundan silinecek kayıtlar çalışma anında belirlenecektir. Ancak konunun kolay anlaşılmasını sağlamak için aşağıda verilen program satırlarını hazırladım. Bu program satırları sayesinde “Hareketler” tablosundaki StokKodu alanından “Arçelik02” bilgisi olan bütün kayıtlar bir seferde silinir. 477 Private Sub Sil_Click() SQL$=“DELETE FROM Hareketler =‘Arçelik02”;”Dosya.Execute SQL$ WHERE StokKodu End Sub Bu yordamda önce DELETE deyimi olan SQL dilinde bir program satırı hazırlayıp SQL$ adını verdiğimiz bir değişkene aktardık. Ardından SQL dilinde yazılmış olan bu program satırını içeren Execute methoduna parametre olarak vererek Hareketler tablosunda StokKodu alanında “Arçrlik02” bilgi olan bütün kayıtların silinmesini sağladık. Ancak DELETE deyimi ile kayıt silme işleminin pratik olabilmesi için WHERE deyimi ile belirlenen koşulun çalışma anında belirlenmesi gerekir. Bu nedenle Kart Sil başlıklı düğme için hazırladığım yordamı aşağıdaki gibi değiştirelim. Private Sub Sil_Click() Kod$ = “’” & Tablo.Fields(“StokKodu”) &” ’ ” & “;” SQL$ = “DELETE FROM Hareketler WHERE StokKodu =” &Kod$ Dosya.Execute SQL$ Tablo.Delete Tablo. MoveNext Form1.Text1 = Tablo.Fields(“StokKodu”) Form1.Text2 = Tablo.Fields(“StokAdi”) Form1.Text3 = Tablo.Fields(“Birim”) Form1.Text4 = Tablo.Fields(“Fiyat”) Form1.Text5 = Tablo.Fields(“Miktar”) End Sub 2. Tablo ve Index Hazırlamak Çalışma anında SQL dilinin CREATE TABLE deyimini kullanarak tablo hazırlayabiliriz. CREATE TABLE deyiminin nasıl kullanıldığını açıklamak için üzerinde çalıştığımız projenin Form_Click yordamına aşağıda ekran görüntüsünü verdiğimiz program satırlarını yazalım. Private Sub Form_Click() Dim Dosya As database Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb") Dosya.Execute “CREATE TABLE CariKart”_ &”(HesapKodu TEXT, Unvan TEXT,Adres TEXT,Borç LONG,Alacak 478 LONG);” End Sub Bu yordamda önce Database tipinde bir değişken tanımladım. Ardından OpenDatabase() fonksiyonu ile, tablo hazırlayıp dahil etmek istediğim veri tabanı dosyası açtım. En son olarak içinde CREATE TABLE deyiminin kullanıldığı SQL satırı yazdım. SQL dili ile yazılmış program satırlarını işletmek için Execute deyimi kullanılmaktadır. Çalışma anında formun üzerinde tıklama yapılıp bu yordam işletilirse Müşteri veri tabanı dosyasına “CariKart” adında bir tablo dahil edilir(Şekil 9.g-18). CREATE TABLE deyimi ile hazırlanan tablonun yapısını size göstermek için Data Manager’dan yararlandık. Şekil 9.g-18 Tablolar için Index hazırlamak için SQL dilinin CREATE INDEX deyiminden yararlanabilirsiniz. CREATE TABLE deyimi ile hazırladığımız tablo için index hazırlamak için aşağıda ekran görüntüsünü verdiğimiz yordamı hazırlayalım. 479 Private Sub Form_Click() Dim Dosya As database Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb") Dosya.Execute “CREATE INDEX KodIndex ON CariKart “&”(HesapKodu ) :” Dosya.Close End Sub Bu yordamda önce kendisi için index hazırlamak istediğimiz tablonun dahil olduğu veri tabanı dosyasını açalım. Ardından içinde CREATE INDEX deyimine yer verdiğimiz bir SQL satırı hazırlayıp Exercute deyimine parametre olarak verelim. Hazırladığımız SQL satırında CREATE INDEX deyimine toplam 3 parametre verelim. İlk parametrede hazırlanmak istenen indexin adı verilmektedir. İkinci parametrede ise indexin dahil edileceği tablonun adı verilmektedir. İndexe temel oluşturacak alan veya alanlar ise3. parametrede verilmektedir. Eğer hazırlamak istediğiniz İndexe Unique özelliği vermek istiyorsanız CREATE INDEX deyimini aşağıdaki gibi kullanmanız gerekir. Private Sub Form_Click() Dim Dosya As database Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb") Dosya.Execute “CREATE UNIQUE INDEX KodIndex CariKart“&”(HesapKodu );” Dosya Close End Sub Indexe Primary özelliği vermek için WITH bağlacını kullanarak PRIMARY bilgisini CREATE INDEX deyimine parametre olarak verebilirsiniz. Private Sub Form_Click() Dim Dosya As database Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb") Dosya.Execute “CREATE INIQUE INDEX _ KodIndex ON CariKart “ &”(HesapKodu )”_ & “WITH PRIMARY;” Dosya Close End Sub 3. Data Kontrolü İle Birlikte SQL Kodu Kullanımı Data kontrolü hakkında bilgi verilen daha önceki bölümlerden hatırlayacağınız gibi Data kontrolü yardımı ile taban dosyaları üzerinde işlem yapabilmek için Data kontrolünün database özelliğine üzerinde işlem yapılmak istenen veri tabanı dosyasının adını aktarmak gerekiyordu. 480 ON Şekil 9.g-19 DatabaseName özelliği ile erişim sağlanmak istenen veri tabanı dosyası belirlendikten sonra RecordSource özelliği ile üzerinde işlem yapılmak istenen tabloyu belirlemek gerekiyordu. Properties penceresinde RecordSource özelliğine ait liste kutusu açıldığında DatabaseName özelliğine aktarılan veri tabanı dosyasındaki tablolar listelenmektedir (Şekil 9.g-20). Şekil 9.g-20 Ancak RecordSource özelliğine ait liste kutusundan tablo adı seçmek yerine tablo ve kayıt seçimini yapmak için SQL kodu yazabilirsiniz. Bu işlemin nasıl yapıldığını size anlatmak için üzerinde çalıştığımız projenin formuna yerleştirmiş olduğumuz Data nesnesinin RecordSource özelliğini aşağıdaki gibi düzenleyelim. 481 Şekil 9.g-21 Data nesnesi ile üzerinde işlem yapmak istediğim tablonun adı iki kelimeden meydana geldiği için tablonun adını köşeli parantezlerin içine alalım. Eğer tablonun adı bir tek kelimeden meydana geliyor olsaydı köşeli parantezlere gerek olmazdı. Data nesnesinin işlevini görmek için projenin formuna ayrıca bir DBGrid nesnesi yerleştirelim. Grid nesnesinin DataSource özelliğine ekran görüntüsü Data ve DBGrid nesnesi yerleştirmiş olduğumuz projeyi çalıştırdıktan sonra alınmıştır (Şekil 9.g-22). Şekil 9.g-22 SELECT deyimi ile üzerinde işlem yapılacak tablo ve kayıtlar belirlenirken herhangi bir kayıt ve alan seçme kriteri belirtilmediği için Grid nesnesi için tablodaki bütün alanlar ve kayıtlar görüntülendi. Eğer Grid nesnesi için yalnızca Hesap Kodu, Adres, Borç alanlarının yer almasını istersek Data nesnesinin RecorSource özelliğini Şekil 9.g-23’teki gibi yazmalıyız. 482 Şekil 9.g-23 RecordSource özelliği için yazdığım SQL kodunda birden fazla kelimeden meydana gelen alan adlarını köşeli parantezlerin arasına alalım. Bu değişiklikten sonra DBGrid nesnesi yerleştirdiğim projeyi çalıştırınca Şekil 9.g-24’teki görüntü elde edilir. Şekil 9.g-24 Eğer ilgili tablodaki bütün kayıtların Grid nesnesi içinde listelenmesini istemiyorsanız RecordSource özelliğine SQL koduna WHERE yardımcı deyimini dahil etmeniz gerekir. 4. Çapraz Sorgu Hazırlamak Bazı özel sorgular için gereken SQL kodunu sıfırdan kendiniz hazırlamak yerine Access’ten yararlanabilirsiniz. Örnek olması için Access yardımı ile “çapraz” adını verdiğim bir çapraz sorgu hazırlayalım. 483 Şekil 9.g-25 Bu sorgu işletildiği zaman CariKart tablosunda bulunan Cari Hesapların borç ve alacak toplamları ekrana getirilmektedir. Şekil 9.g-26’da verilen ekran görüntüsünü bu sorguyu Access dahilinde açtıktan sonra aldık. Şekil 9.g-26 Bu sorguya ait SQL kodlarını size göster için Access’in Görünüm menüsünden SQL Göster komutunu verelim (Şekil 9.g-27, 29-28). Şekil 9.g-27 484 Şekil 9.g-28 Bu çapraz sorguyu hazırlarken şimdiye kadar kullandığımız SQL deyimlerinden başka GROUP BY, INNER JOIN ve PIVOT deyimleri kullanılır. Bu sorguyu Access ile hazırlayıp veri tabanı dosyasına dahil etmek yerine Visual Basic ile birlikte verilen Data Manager’dan yararlanarak hazırlayabilirsiniz. Şimdi Access yardımıyla hazırladığımız bu sorguyu Visual Basic projesi dahilinde kullanalım. Bu amaçla ilk olarak Database ve RecordSet tipinde iki değişken tanımlayalım (Şekil 9.g-29). Şekil 9.g-29 Ardından üzerinde çalıştığım projenin formuna bir Data ve DBGrid nesnesi dahil edelim. Ardından DBGrid nesnesinin DataSource özelliğine Data nesnesinin adını aktaralım. En son olarak Form_Load yordamını aşağıdaki gibi düzenleyelim. Private Sub Form_Load() Set Dosya = OpenDatabase ( “C:\Kitap\Stok.mdb”) Set Sorgu = Dosya.OpenRecordset (“Çapraz”) Set Data1.Recordset = Sorgu End Sub Bu işlemlerde sonra üzerinde çalıştığım projeyi çalıştırınca aşağıdakine benzer bir akran görüntüsü elde ederiz. Şekil 9.g-30 485 9.h. ADO Data Kontrolü Bu kitabın daha önceki bölümlerinde Visual Basic’in veri tabanı özellikleri hakkında bilgi verirken genellikle Data kontrolü kullanıldı. Ancak Visual Basic’in 6.0 versiyonunda Data kontrolünden başka ayrıca ADO Data Control adında bir kontrol daha bulunmaktadır. Veri tabanı dosyaları üzerinde işlem yaparken Data kontrol yerine ADO Data Control’dan yararlanabilirsiniz. Bu kontrolden yararlanabilmek için Project menüsündeki Components komutu verildiği zaman ekrana gelen Components diyalog kutusundan yararlanıp ADO Data Control’ün projeye dahil edilmesi gerekir. Şekil 9.h-1 Components diyalog kutusunda “Microsoft ADO Data Control” onau kutusunu seçip Tamam düğmesinde tıklama yaparsanız, ADO Data Control projeye dahil edilir ve bu kontrol Toolbox’ta bir düğme ile temsil edilir (Şekil 9.h-2). Şekil 9.h-2 486 ADO Data Control’ün nasıl kullanıldığını anmak için yeni bir proje hazırlayalım ve projenin formuna ADO Data Control’ü yerleştirelim. ADO Data Control görünüm olarak Data kontrolünden pek farklı değildir (Şekil 9.h-3). Şekil 9.h-3 Forma yerleştirilen ilk ADO Data Control’e “Adodc1” adı verilmektedir. Şek,l 30-4’te verilen ekran görüntüsünde tespit edebileceğiniz gibi ADO Data Control’ün çok sayıda özelliği bulunmaktadır. Şekil 9.h-4 ADO Data Control ile üzerinde işlem yapılacak veritabanı dosyası, ADO Data Control’ün ConnectionString özelliği ile belirlenmektedir. Ancak ADO Data Control ile veri tabanı dosyaları üzerinde işlem yapılırken ODBC tekniği kullanıldığı için söz konusu veri tabanı dosyası için daha önceden bazı ayarlamaların yapılması gerekmektedir (Şekil 9.h-4). 487 Şekil 9.h-5 ADO Data Control’ü ile veri tabanı dosyaları üzerinde işlem yapabilmek için ilk yapılması gereken ayarlama Windows’un Denetim Masasındaki ODBC seçeneği ile yapılmaktadır. Şimdi örnek olması için “C:” sürücüsündeki “Kitap” klasöründeki “Stok” dosyasına erişim sağlayabilmek için ODBC seçeneği ile ayarlama yapalım Veri tabanı dosyalarına ADO Data Control’ü ile erişim sağlayabilmek için Denetim Masasındaki ODBC seçeneğinin üzerinde çift tıklama yaparsanız ekrana ODBS Veri Kaynağı Yöneticisi diyalog kutusu gelir. 488 Şekil 9.h-6 Toplam 7 sekmenin bulunduğu bu diyalog kutusundaki Kullanıcı DSN sekmesinde, bu ekran görüntüsünü aldığımız sırada tanımlı olan birçok DSN ( Data Source Name) bulunuyordu. Bu sekmedeki tanımlamalar yerel bilgisayar tarafından kullanılabilmektedir. Eğer yapacağınız tanımlamadan NT yüklü başka bir bilgisayarın da yararlanılmasını istiyorsanız DSN tanımlama işlemini bu kez Sistem DSN sekmesinde yapmanız gerekir. Kullandığım bilgisayardaki “Stok.mdb” adındaki Access formatındaki veri tabanı dosyası için DSN tanımlamak istediğimiz için Ekle düğmesinde tıklama yapıp Yeni Veri Kaynağı Oluştur diyalog kutusunu ekrana getirelim (Şekil 9.h-7). 489 Şekil 9.h-7 Bu diyalog kutusunda veri tabanı dosyası sürücüsü seçilmektedir. Kendisi için tanımlama yapmak istediğimiz veri tabanı dosyası Access formatında olduğu için Microsoft Access Driver sürücüsünü seçelim. Sürücü seçimi yapıp Son düğmesinde tıklama yaparsanız Şekil 9.h-8’de ekran görüntüsü verilen ODBC Microsoft Access Kur diyalog kutusu gelir. Şekil 9.h-8 Bu diyalog kutusunda ilk olarak Veri Kaynağı Adı metin kutusuna yapılmak istenen tanımlamaya bir adın verilmesi gerekir. “C:” sürücüsündeki “Stok.mdb” dosyasına ADO Data ile erişim sağlamak için yapmak istediğimiz tanımlamaya “Stok Dosyası” adını verelim. Data Source adı belirlendikten 490 sonra sıra Access formatındaki dosyayı belirlemeye gelir. Eğer söz konusu dosyayı daha önce hazırlayıp hard diske kaydetmişseniz Seç düğmesinde tıklama yaparak dosya seçimi yapmanız gerekir. Yeni bir dosya hazırlamak istiyorsanız Oluştur düğmesinde tıklama yapabilirsiniz. “Oluştur” düğmesinde tıklama yaparsanız hazırlanacak dosya adının belirlendiği Yeni Veritabanı diyalog kutusu ekrana gelir. Kendisi için Data Source tanımlamak istediğim dosyayı daha önce Visual Data Manager programı ile hazırlamış olduğumuz için Seç düğmesinde tıklama yapıp ekrana Veritabanı Seç diyalog kutusunu getirelim. Şekil 9.h-9 Bu diyalog kutusunda kendisi için tanımlama yapmak istediğimiz Stok.mdb dosyasını seçip Tamam düğmesinde tıklama yapıp Select Database diyalog kutusunu kapatınca, seçtiğimiz dosyasın adı ODBC Microsoft Access Kur diyalog kutusu Şekil 9.h-10’da ki şekle dönüştü. Şekil 9.h-10 491 Bu diyalog kutusundaki Açıklama başlıklı metin kutusunu tanımlamak istediğiniz Data Source veya veri tabanı dosyası hakkında açıklayıcı bilgi girebilirsiniz. Dosya seçiminden sonra ODBC Microsoft Accsee Kur diyalog kutusunu Tamam düğmesi ile kapatırsanız Data Source tanımlama işlemini bitirmiş olursunuz (Şekil 9.h-11). Şekil 9.h-11 Bu hazırlıklardan sonra ADO Data ile söz konusu veri tabanı dosyası üzerinde her türlü işlem yapılabilir. Bu işlemlerden sonra üzerinde çalıştığımız projeye dönelim. Properties penceresinde ADO Data nesnesinin özellikleri listelenirken Connection String özelliğinin üzerine gidelim. 492 Şekil 9.h-12 ADO Data Control’ü ile üzerinde işlem yapılacak dosyayı belirlemek için veya data Source seçimini yapmak üzere ConnectionString özelliğine ait üzerinde 3 nokta (...) olan düğme tıklama yaparak ekrana Property Pages diyalog kutusunu getirelim (Şekil 9.h-12). Şekil 9.h-13 Bu diyalog kutusunda data Source seçimi yapmak için ilk olarak Use ODBC Data Source Name radyo düğmesini seçmek gerekir. Ardından bu radyo düğmesine ait liste kutusunu açarsanız daha önce tanımlanmış olan Data Source’lar listelenir (Şekil 9.h-13). 493 Şekil 9.h-14 Üzerinde işlem yapmak istediğimiz dosya için daha önce “Stok Dosyası” adında bir Data Source tanımlamış olduğumuz için bu liste kutusunda sözünü ettiğimiz Data Source’u seçip Property Pages diyalog kutusunu Tamam düğmesi ile kapatırsak ADO Data nesnesinin ComnnectionString özelliğine “DNS=Stok Dosyası” bilgisi aktarılmış olur (Şekil 9.h-14). Anlatılan şekilde ADO Data nesnesi ile erişim sağlamak istenen veri tabanı dosyası belirlendikten sonra sıra üzerinde işlem yapılacak tabloyu belirlemeye geldi. ADO Data nesnesi için tablo seçimi, RecordSource özelliği ile yapılmaktadır. Properties penceresinde Data kontrolüne ait özellikler listelenirken RecordSource özelliğinin üzerine gidildiği zaman DatabaseName özelliği ile belirlenen veri tabanı dosyasındaki tablolar listeleniyordu. Ancak ADO Data nesnesinin RecordSource özelliğine ait liste kutusunda, erişim sağlanan veri tabanı dosyasındaki tablolar listelenmemektedir. Tablo seçimi yapılırken SQL kodu yazmak gerekmektedir. SQL dilinin SELECT deyimini doğrudan RecordSource özelliğine ait metin kutusuna yazabileceğiniz gibi özelliğe ait düğmede tıklama yapabilirsiniz. RecordSource özelliğine ait düğmede tıklama yapılırsa ekrana aşağıda verilen Property Pages diyalog kutusu gelmektedir (Şekil 9.h-15). 494 Şekil 9.h-15 ADO Data nesnesinin RecordSource özelliğine ait Pages diyalog kutusunda RecordSource adı altında gruplanmış 3 seçenek bulunmaktadır. Başlangıçta Command Type başlıklı liste kutusunda “8adCmdUnknown” seçeneği seçili durumdadır. Command Type liste kutusunda 8-adCmdUnknown seçili durumda iken işlem yapmak istediğiniz tablo için Command Text(SQL) başlıklı kutuya SQL dilinin SELECT deyimi ile söz konusu veri tabanı dosyasındaki tablolardan istediğinizi seçebilirsiniz. Stok.mdb dosyasındaki kartlar tablosu üzerinde işlem yapmak istediğimiz için Command Text(SQL) başlıklı kutuyu Şekil 9.h-16’daki gibi düzenleyelim. Şekil 9.h-16 Bu SQL kodu sayesinde “Stok.mdb” dosyasındaki “Kartlar” tablosunun bütün alanlarına erişim sağlanabilir, kayıt girilirken ve mevcut kayıtlarda değişiklik yapılabilir. RecordSource özelliğine ait 495 Property Pages diyalog kutusunu tablo seçmek üzere SELECT deyiminin kullanıldığı SQL kodunu yazdıktan sonra tamam düğmesi ile bu diyalog kutusunu kapatıp tekrar Properties penceresine dönelim (Şekil 9.h-17). Şekil 9.h-17 ADO Data nesnesi ile üzerinde işlem yapmak istenen tabloyu yukarıda anlatılan şekilde SQL kodu ile belirlemek yerine doğrudan tablonun adını yazabilirsiniz. Ancak veri tabanı dosyasında hangi tabloların olduğunu öğrenmek istiyorsanız veya üzerinde işlem yapmak istediğiniz tablonun adını ezbere bilmiyorsanız RecordSource özelliğine ait Properties Pages diyalog kutusunu ekrana getirmeniz gerekir. Eğer RecordSource özelliğine ait Properties Pages diyalog kutusunu tablo seçimini yapmak üzere ekrana getirdiyseniz Command Type liste kutusunda 2-adCmdTable seçeneğini seçmeniz gerekir (Şekil 9.h-18). Şekil 9.h-18 496 Command Type liste kutusunda “2-adCmdTable” seçeneğini seçmeniz halinde Table or Store Procedure Name başlıklı liste kutusu kullanılabilir duruma gelir. Bu liste kutusunda ADO Data nesnesinin ConnectionString özelliği ile seçtiğiniz veri tabanı dosyasındaki tablolar listelenir. Hazırlamak istediğimiz örnek projede ADO Data kontrolü ile “Kartlar” adlı tablo üzerinde işlem yapmak istediğimiz için Kartlar tablosunu seçelim. Şekil 9.h-19’da verilen ekran görüntüsünü RecordSource özelliğine ait Property Pages diyalog kutusunda tablo seçimini yaptıktan sonra alalım. Şekil 9.h-19 Bu işlemlerden sonra seçilen tablodaki kayıtların içeriğini ekranda görebilmek için projenin formuna tablodaki her alan için bir metin kutusu nesnesi yerleştirmek gerekir. Şekil 9.h-20’de verilen ekran görüntüsünün projenin formuna 5 adet metin kutusu ve Label nesnesi yerleştirdikten sonra aldık. Şekil 9.h-20 Üzerinde işlem yapmak istediğim tablodaki her alan için bu şekilde birer metin kutusu yerleştirdikten sonra her metin kutusu için öncelikle DataSource özelliği ile ADO Data nesnesi seçimi yapmak gerekir. Şekil 9.h-21’de verilen ekran görüntüsünü aldığımız sırada üzerinde çalıştığımız projenin “Adocd1” adında bir ADO Data nesnesi vardı. 497 Şekil 9.h-21 Metin kutusu nesnesi için DataSource seçimi yaptıktan sonra DataField özelliği ile alan seçimi yapılır. Properties penceresinde DataField özelliğine ait liste kutusunda ADO Data nesnesinin RecordSource özelliği ile seçilen tablodaki alanlar listelenir (Şekil 9.h-22). Şekil 9.h-22 Bu iki seçim ve ayarlama formdaki her metin kutusu için yapılıp proje çalıştırılarak tablodaki kayıtlar arasında dolaşılabilir. Şekil 9.h-23’de verilen ekran görüntüsünü projeyi çalıştırdıktan sonra aldık. Bu sırda ADO Data nesnesine ait düğmelerden yararlanarak tablodaki istediğiniz kaydın içeriğini ekranda görebilirsiniz. Şekil 9.h-23 498 İçeriği formda görüntülenen kayıtta yaptığınız değişiklikler başka bir kaydın üzerine gitmeniz halinde otomatik olarak veritabanı dosyasına yansıtılır. Eğer tablodaki kayıtlarda değişiklik yapılmasını istemiyorsanız ADO Data nesnesinin Mode özelliğinden yararlanabilirsiniz.Eğer kayıtların yalnız okunabilir olmasını istiyorsanız Mode özelliğine 1-adModeRead değerini aktarmanız gerekir (Şekil 9.h-24). Şekil 9.h-24 1. Data Form Wizard ile Birlikte ADO Data Kontrolünü Kullanmak 499 Daha önce Data Form Wizard hakkında bilgi verilen bölümde, Wizard ile hazırlanan formda veri tabanı dosyasına veya verilere erişim tekniği olarak ADO Data kontrolünü seçmiştik. Şekil 9.h-25 Şimdi bir kez daha Wizard ile ADO Data Control’ün kullanıldığı bir form hazırlayalım ve Data Form Wizard tarafından hazırlanan program kodlarını görelim. Bu amaçla Şekil 9.h-26’daki formu hazırlayalım. Şekil 9.h-26 Yukarıda sayfalarda ADO Data Control’ü ile veri tabanı dosyası üzerinde işlem ODBC tekniğini kullanmıştık. Ancak Data Form Wizard ile hazırlanan formdaki ADO Data Control‘de veriye erişim sağlamak için Microsoft Jet veri tabanı motorunun kullanılacağı varsayılmaktadır. Bunu göstermek için Data Form Wizard yardımı ile hazırladığımız formdaki ADO Data nesnesini seçili durumda iken Properties penceresini ekrana getirelim. Üzerinde işlem yapılacak veri tabanı ADO Data Control’ün ConnectionString özelliği ile belirlenmektedir. 500 Şekil 9.h-27 Bunu ayrıca Properties penceresinde ADO Data Control’ün Custom özelliğine ait düğmede tıklama yapılarak ekrana getirilen Prpperty Pages diyalog kutusunda görebilirsiniz. Yukarıdaki sayfada verilen örnekte veri tabanı dosyalarını ODBC tekniği ile erişmek istediğimiz için Use ODBC Data Source Name radyo düğmesini seçmiştik. Şekil 9.h-28 Tam bu sırada Use Connection String radyo düğmesi seçili durumda iken Build düğmesinde tıklama yapabilirsiniz. Buld düğmesinde tıklama yaparsanız ekrana Data Link Properties diyalog kutusu gelir (Şekil 9.h-29). 501 Şekil 9.h-29 Bu diyalog kutusundaki metin kutusuna ADO Data Control ile üzerinde işlem yapmak istediğiniz dosyanın adını yazabilirsiniz. Üzerinde işlem yapmak istediğiniz dosyanın adını ezbere biliyorsanız bu diyalog kutusundaki üzerinde 3 nokta (...) olan düğmede tıklama yapıp dosya seçimi yapılan Select Access Database diyalog kutusunu ekrana getirebilirsiniz. Bu sırada Data Link Properties diyalog kutusundaki Provider sekmesine geçip dosyalara erişim sağlama tekniğini değiştirebilirsiniz. ADO Data ile erişim sağlanan dosyadaki hangi tablo üzerinde işlem yapılacağı ADO Data nesnesinin RecordSource özelliği ile belirlenmektedir. Şekil 9.h-30 502 Çalışma anında ADO Data ile erişim sağlanan veritabanı dosyasındaki ilgili tabloya yeni bir kayıt için formdaki "“Add"”düğmede tıklama yapmanız gerekir. Şimdi size Data Form Wizard tarafından Add düğmesi için hazırlanan program kodlarını yazalım. Private Sub cmdAdd_Click On Error Goto AddErr datPrimaryRS.Recordsr.AddNew Exit Sub AddErr: MsgBox Err.Description End Sub Buradaki datPrimaryRS, formdaki ADO Data nesnesinin adıdır. Tablonun sonuna yeni kayıt eklemek için Data kontrolünde olduğu gibi Add metodu kullanılmaktadır. Buna göre Data kontrolü ve RecordSet nesnesi ile ilgili olarak daha önce anlatılanlar ADO Data kontrolünde geçerlidir. 2. Program Kodu Yazarak ADO Nesnesi Hazırlamak Yukarıdaki sayfalarda ADO Data kontrolü sayesinde veri tabanı dosyaları üzerinde işlem yaparken ToolBoc’tan yararlanarak formun üzerine ADO nesnesi yerleştirelim. Ancak program kodu yazarak ADO Data (RecordSet) nesnesi hazırlayabilir ve bu nesneden yararlanarak veri tabanı dosyaları üzerinde işlem yapabilirsiniz. 503 Şekil 9.h-31 Ancak program kodo yazarak ADO Data Control ile veri tabanı dosyaları üzerinde işlem yapabilmek için daha önceden Project menüsündeki References komutu ile ekrana getirilen diyalog kutusundan yararlanarak Microsoft ActiveX Data Object adlı library dosyasını projeye dahil etmeniz gerekir (Şekil 9.h-31). Visual Basic’in bu özelliği hakkında size bilgi verebilmek için yeni bir proje hazırladım ve bu projenin formuna 5 adet metin kutusu yerleştirdim. Bu proje çalıştırıldığı zaman seçeceğimiz tablodaki ilk kaydın içeriği bu formdaki metin kutularına aktarılacaktır. Şekil 9.h-32 Program kodu yazarak ADO Data Control’den yararlanmak veya başka bir deyişle ToolBox’tan formun üzerinde nesne yerleştirmeden veri tabanı dosyaları üzerinde işlem yapabilmek için ilk olarak Dim deyimi ile RecordSet ve Connection tanımlamak gerekir. Bu değişkenleri Form_Load 504 yordamında tanımladım. Tanımladığım RecordSet nesnesine “adoSet” ve Connection nesnesine “Dosya” adını verelim.. Private Sub Form_Load Dim adoSet As Recordset Dim Dosya As Connection Bu iki değişkeni Form_Load yordamı yerine formun Declaration kısmında tanımlayabilirsiniz. Bu şekilde yapılan değişken tanımlama işleminden sonra Form_Load yordamına aşağıda ekran görüntüsü vewrilen program kodlarını yazdım. Bu program satırlarında önce Set deyimi ile Connection nesnesi set edilmektedir. Ardından Open methodu ile Connection nesnesini açıp devreye soktum. Private Sub Form_Load Dim adoSet As Recordset Dim Dosya As Connection Set Dosya = New Connection Dosya.Open“PROVIDER=Microsoft.Jet.OLEDB.3.30;_ DataSource=C:\Kitap\Adres.mdb;” Set adoSet = New Recordset AdoSet.Open “select * from Adresler”, Dosya Set Text1.Datasource =adoSet Set Text2.Datasource =adoSet Set Text3.Datasource =adoSet Set Text4.Datasource =adoSet Set Text5.Datasource =adoSet End Sub Open metodu bu örnekte 2 parametreye sahiptir. İlk parametrede veri tabanı dosyasına erişim tekniği(Provider) ve ikinci parametrede ise data Source yani veri tabanı dosyası belirlenmektedir. Open methodu ile Connection nesnesi açılıp devreye sokulduktan sonra Set deyimi ile RecordSet nesnesini set ettim. Ardından Open deyimi ile “adoSet” adını vermiş olduğum RecordSet nesnesi ile üzerinde işlem yapılacak tablo ve alanları belirledik. Form-Load yordamında en son olarak formdaki bütün metin kutularını RecordSet nesnelerine set ettik. Bu işlemlerden sonra sıra metin kutularına tablodaki hangi alandan bilgi alacağı veya hangi alan ile hangi metin kutusu arasında bağlantı kurulacağını belirlemeye gelir. Bu amaçla formdaki ilk metin kutusunu seçip Properties penceresini ekrana getirdim. Metin kutuları ile belirlenen tablodaki alanlardan birisi arasında bağlantı kurma işlemi metin kutusunun DataField özelliği ile belirlenmektedir. 505 Şekil 9.h-33 Ancak üzerinde işlem yapılacak dosya ve tablo, çalışma anında belirlendiği için Properties penceresinde DataField özelliğine ait liste kutusunda listelenen herhangi bir alan adı olmaz. Bu nedenle söz konusu metin kutusu ile arasında bağlantı kurmak istediğimiz alanın adını DataField özelliğine kendiniz doğrudan yazmanız gerekir. Formdaki ilk metin kutusu ile “Adresler” tablosundaki “Ad” alanı arasında bağlantı kurmak istediğiz için “Ad” yazalım. Şekil 9.h-34 Aynı işlemleri formdaki diğer metin kutuları için yaptıktan sonra projeyi çalıştırdım. Form_Load yordamına yazılan program kodları sayesinde adı belirtilen veri tabanı dosyasına erişim sağlanır ve ilgili tablonun ilk kaydının içeriği ekrana getirilir. 506 Şekil 9.h-35 Tablodaki ilk kaydın içeriğini bu şekilde ekrana getirdikten sonra RecordSet nesnesi ile ilgili diğer metotları kullanıp tablo veya kayıtlar üzerinde istediğiniz işlemi yapabilirsiniz. Örnek olması için üzerinde çalıştığımız projenin formuna “Sonraki kayıt” başlıklı bir düğme yerleştirelim ve düğmenin Click yordamını aşağıdaki şekilde düzenleyelim. Private Sub Sonraki_Click() AdoSet.MoveNext End Sub Ancak “adoSet” adını vermiş olduğum RecordSet nesnesini Dim deyimi ile Form_Load yordamı içinde tanımlamış olduğum için bu nesneyi başka yordamlarda kullanabilmek amacıyla değişken tanımlama satırını formun Declaration kısmına taşımıştık Çalışma anında forma yerleştirilmiş olan düğmede tıklama yapılıp MoveNext metodunun kullanıldığı bu yordam işletilirse tablodaki bir sonraki kaydın içeriği ekrana getirilir. Diğer yandan Data Form Wizard ile veri tabanı dosyaları üzerinde işlem yapmaya yönelik olarak form hazırlarken işlemin 3. adımını temsil eden “Form” başlıklı diyalog kutusunda ADO Code tekniğini seçip yukarıda yapılan işlemleri otomatikleştirebilirsiniz. 507 Şekil 9.h-36 508 9.i. Data Environment Visual Basic’in veri tabanı özelliklerini açıklamak amacıyla şimdiye kadar Data ve ADO Data kontrolü ile Microsoft DAO 3,51 Object Library hakkında bilgi verildi. Visual Basic‘in 6.0 versiyonunda veri tabanı dosyaları üzerinde işlem yapmaya yönelik olarak Data Environment adında bir özellik bulunmaktadır. Data Environment özelliği sayesinde daha az program kodu yazarak veri tabanı uygulamaları geliştirmek mümkündür.Data Environment tekniği ile veri tabanı dosyaları üzerine işlem yapabilmek için Project menüsündeki Components komutu ile ekrana getirilen Components diyalog kutusunda ayarlama yapmak gerekir (Şekil 9.i-1). Şekil 9.i-1 Data Environment tekniğinden yararlanabilmek için Components diyalog kutusundaki Designers sekmesindeki Data Environment onay kutusunu seçili duruma getirmeniz gerekir. Components dfiyalog kutusunda Data Environment onay kutusunu seçip projeye dahil ederseniz Project menüsüne More ActiveX Designers adında ve alt menüye sahip bir komut eklenir. Ayrıca bu alt menüye Data Environment adında bir komut dahil edilmektedir (Şekil 9.i-2). 509 Şekil 9.i-2 Üzerinde çalıştığınız projeye bir Data Environment nesnesi eklemek üzere Project menüsünden komut verirseniz projeye” Data Environment1” adında bir Data Environment nesnesi dahil edilir (Şekil 9.i-3). Şekil 9.i-3 Data Environment nesnesi, Visual basic penceresi içinde bir alt pencere ile temsil edilmektedir. Bu ayrıca Data Environment nesnesi üzerinde yapılabilecek işlemleri temsil eden düğmeleri için bir araç çubuğu bulunmaktadır. Projeye Data Environment nesnesi dahil etme işlemi sırasında ayrıca bir Connection nesnesi hazırlanmaktadır. Data Environment nesnesi içinde istenilen sayıda Connection ve Command nesnesi olabilir. Connection nesnesi ile, üzerinde işlem yapılmak istenen veri tabanı dosyasına erişim sağlanmaktadır. Otomatik olarak hazırlanan Connection nesnesi sayesinde herhangi bir veri tabanı dosyasına erişim sağlamak için önce Connection nesnesine ait kısayol menüsü açılır (Şekil 9.i-4). 510 Şekil 9.i-4 Connection nesnesinin özelliklerini değiştirmek veya Connection nesnesi ile erişim sağlayacak veri tabanı dosyasını belirlemek için kısayol menüsündeki Properties komutundan yararlanılmaktadır. Connection nesenesine ait kısayol menüsünden Properties komutunu verirseniz ekrana Şekil 9.i-5’te verilen Data Link Properties diyalog kutusu gelir. Şekil 9.i-5 511 Providor, Connection, Advanced ve All adında 4 sekmenin bulunduğu Data Link Properties diyalog kutusundaki Provider sekmesinde veri tabanı dosyasına erişimde hangi tekniğin kullanılacağı belirlenmektedir. Başlangıçta veri tabanı dosyasına ODBC tekniği ile erişim sağlanacağı varsayılmaktadır. Eğer veri tabanı dosyasına, Data nesnesinde olduğu gibi Jet veri tabanı motoru ile erişim sağlamak istiyorsanız Microsoft Jet 3,51 OLE DB Providor seçeneğini seçebilirsiniz. Veri tabanı dosyalarına ODBC tekniği ile erişim sağlamak istediğim için Microsoft OLE DB Providor For ODBC Driver seçeneğini seçili durumda iken Connection sekmesine geçelim. Connection sekmesinde Data Source seçimi yapılmaktadır (Şekil 9.i-6).. Data Source tanımlama işlemi ise Windows’un Denetim Masasındaki “ODBC” seçeneğinin üzerinde çift tıklama yapıldığı zaman ekrana gelen ODBC Data Source Administrator diyalog kutusunda yapılmaktadır. Bir önceki bölümde örnek olması için “Stok Dosyası” adında bir Data Source tanımlamıştık. Şekil 9.i-6 Connection sekmesinde Data Source seçimini yaptıktan sonra Advanced sekmesine geçelim. Advanced sekmesindeki seçeneklerle veri tabanı dosyası üzerinde yapılabilecek işlemler belirlenmektedir (Şekil 9.i-7). 512 Şekil 9.i-7 Veri tabanı dosyası üzerinde yapılabilecek her işlem bu sekmede bir onay kutusu ile temsil edilmektedir. Bu 3 sekmede yapılan bütün seçim ve ayarlamaları bir arada görmek istiyorsanız All sekmesine geçmeniz gerekir (Şekil 9.i-8). 513 Şekil 9.i-8 All sekmesinde, hangi seçenekte değişiklik yapmak istiyorsanız fare ile o seçeneğin üzerinde çift tıklama yapabilirsiniz veya söz konusu seçenek seçili durumda iken Edit Value düğmesinde tıklama yapabilirsiniz. Bu sırada Property Value liste kutusunu açıp başka bir Data Source'’ seçebilirsiniz (Şekil 9.i-9). Şekil 9.i-9 Eğer aynı Data Environment ile birden fazla veri tabanı dosyasına erişim sağlamak gereği olsaydı, öncelikle Data Environment nesnesinin üzerinde farenin sağ tuşu ile tıklama yapıp kısayol menüsünü ekrana getirmek gerekirdi (Şekil 9.i-10). 514 Şekil 9.i-10 Data Environment penceresi içinde ikinci bir Connection nesnesi hazırlamak üzere kısa yol menüsünden Add Connection komutunu verirseniz Connection hazırlama işlemini tamamlamış olursunuz. Benzer şekilde Data Environment penceresindeki 2. Connection nesnesi için Data Dource seçimi yapabilirsiniz (Şekil 9.i-11). Şekil 9.i-11 Yukarıdaki sayfalarda anlatılan şekilde Connection nesnesi ile seçim ve ayarlamaları yaptıktan sonra sıra Command nesnesi tanımlamaya gelir. Çünkü Data Environment nesnesi sayesinde veri tabanı dosyaları üzerinde işlem yapılırken Command nesnesine gerek duyulmaktadır. Connection nesnesi için yeni bir Command nesnesi hazırlamak istiyorsanız Command nesnesine ait kısayol menüsünden Add Command komutunu vermeniz gerekir. Şekil 9.i-12’de verilen ekran görüntüsü farenin sağ tuşu ile Connection nesnesinin üzerinde tıklama yapıp kısayol menüsünü açıldıktan sonra alınmıştır. 515 Şekil 9.i-12 Connection nesnesine ait kısayol menüsündeki Delete komutu ile Connection nesnesini silebilir ve Rename komutu ile adını değiştirebilirsiniz. Connection nesnesine yeni bir Command nesnesi dahil etmek üzere kısayol menüsünden Add Command komutunu verirseniz Data Environment penceresi içinde bir Command nesnesi hazırlanır. Şekil 9.i-13’te verilen ekran görüntüsü kısayol menüsünden Add Command komutu verildikten sonra alınmıştır. Şekil 9.i-13 Anlatılan şekilde bir Command nesnesi hazırladıktan sonra, bu nesnenin işe yarayabilmesi için bazı ayarlamaların yapılması gerekmektedir. Bu amaçla farenin sağ tuşu ile Command nesnesine ait kısayol menüsünü açıp Properties komutunu vermek gerekir. Şekil 9.i-14’te verilen ekran görüntüsü Command nesnesine ait kısayol menüsünden Properties komutu verildikten sonra alınmıştır. 516 Şekil 9.i-14 General sekmesindeki Command Name metin kutusunu nesneye verilmek istenen adı yazılmaktadır. Bu metin kutusunun içeriğini değiştirip Command nesnesine istediğiniz adı verebilirsiniz. Yine bu sekmedeki Connection liste kutusu ile Connection seçimi yapılmaktadır. Şekil 9.i-15’te verilen ekran görüntüsü alındığı sırada projedeki Data Environment penceresinde yalnızca 2 Connection nesnesi vardı. Şekil 9.i-15 Command nesnesine ait özelliklerin listelendiği bu diyalog kutusundaki Source of Data adı altında bir araya getirilmiş olan 2 radyo düğmesi ile Connection nesnesi ile belirlenen veri tabanı dosyasının (tablo ve alanlar) nasıl belirleneceği seçilmektedir. Eğer söz konusu nesneleri SQL kodu ile belirlemek istiyorsanız SQL Statement radyo düğmesini seçtikten sonra SQL kodu yazmanız gerekir. 517 Connection nesnesi ile söz konusu veri tabanı dosyasının bir tablosu üzerinde işlem yapmak için Database Object liste kutusunu açıp Table seçeneğini seçilmelidir (Şekil 9.i-16). Şekil 9.i-16 Database Object liste kutusunda “Table” seçeneğini seçtikten sonra sıra üzerinde işlem yapılacak tablonun seçimine gelir. Çünkü veri tabanı dosyasında birden fazla tablo olabilir. Bu nedenle Object Name liste kutusunu açıp tablo seçimi yapılmalıdır (Şekil 9.i-17). Şekil 9.i-17 Bu ekran görüntüsünü aldığım sırada “Connection1” nesnesi ile erişim sağlamak istediğim “Stok” adlı veri tabanı dosyasında 2 tablo bulunuyordu. Bu işlemden sonra Command nesnesinin önüne, bu nesnenin başka nesneler içerdiğini işaret etmek için artı (+) işareti konulur (Şekil 9.i-18). 518 Şekil 9.i-18 Comand nesnesine ait alt nesnelerin listelenmesini sağlamak için nesneye ait simgede tıklama yapmak gerekir. Command nesnesinin Object Name özelliğine adı aktarılan tablodaki bütün alanlar, Command nesnesine bağlı olarak Data Environment penceresi içinde listelenir (Şekil 9.i-19). Şekil 9.i-19 Data Environment penceresi içinde listelenen bu alanları projenin herhangi bir formunda kullanabilirsiniz. Bu işlemin nasıl yapıldığını görmek için Visual Basic penceresi içinde Form ve Data Environment pencerelerinin aynı anda görüntülenmesini sağlayalım (Şekil 9.i-20). Şekil 9.i-20 Command nesnesi ile eriğim sağlanan ilgili tablodaki hangi alanın içeriğini formun üzerinde görüntülemek istiyorsanız fare ile Data Environment penceresinden sürükleyip formun üzerine yerleştirmeniz gerekir. Şekil 9.i-21’de verilen ekran görüntüsü “StokKodu” alanını sürükleyip formun üzerine yerleştirildikten sonra alınmıştır. 519 Şekil 9.i-21 Söz konusu alanı Data Environment penceresinden alıp formun üzerine yerleştirme işlemi sırasında formun üzerinde label ve metin kutusu nesnesi konulur. Benzer şekilde diğer alanları sürükleyip formun üzerine bırakabilirsiniz (Şekil 9.i-22). Şekil 9.i-22 Forma bu şekilde yerleştirdiğiniz Label ve TextBox nesnelerinin biçim özelliklerinde istediğiniz değişikliği yapabilirsiniz. Bütün bu hazırlıklardan sonra proje çalıştırılacak olursa, erişim sağlanan tablodaki ilk kaydın içeriği ekrana getirilir (Şekil 9.i-23). Şekil 9.i-23 Connection ve Command nesneleri varsayım olarak açık durumda oldukları için ayrıca ek bir işlem yapmaya gerek yoktur. Ancak bilgi sahibi olmanız açısından Form_Load yordamını aşağıdaki şekilde düzenlenebilir. Private Sub Form_Load() If DataEnvironment1.Connection1.State = adStateClosed Then DataEnvironment1.Connection1.Open End If 520 If DataEnvironment1.rsConnection1.State = adStateClosed Then DataEnvironment1.rsConnection1.Open End If End Sub Bu yordamda kullanılan Open metodu sayesinde Connection ve “rsCommand” adı verilmiş olan RecordSet nesnesi açık durumda değilse açılır. Bu program kodunda Command nesnesinin önüne eklenen “rs” harfleri RecordSet anlamındadır. Şimdi ise tablodaki kayıtların arasında dolaşabilmek için forma 2 düğme yerleştirelim (Şekil 9.i-24). Şekil 9.i-24 Çalışma anında “Sonraki Kayıt” başlıklı düğmede tıklama yapıldığı zaman işletilmek üzere bu düğmenin Click yordamını aşağıdaki gibi düzenlenir. Daha önceki konulardan bildiğiniz gibi bir sonraki kaydın üzerine gitmek için RecordSet nesnesine MoveNext metodu uygulanmaktadır. Privatr Sub Sonraki_Click() DataEnvironment1.rsCommand1.MoveNext End Sub Daha önce Data kontrolü ile ilgili olarakREcordSet nesnesi hakkında verilen bütün bilgiler Command nesnesine ait RecordSet nesnesi için de geçerlidir. 521 9.j. Crystall Report ile Rapor Hazırlamak Visual Basic ile birlikte Visual Basic projeleri dahilinde veya başka bir program ile hazırlanan veri tabanı dosyalarından rapor hazırlamak amacıyla kullanılan Crystal Reports adında bir rapor üreticisi verilmektedir. Ancak Visual Basic 6.0’ı daha önce anlatılan şekilde bilgisayara kuracak olursanız Crystal Report programı kurulmaz. Eğer Crystal Report programı ile rapor dosyası hazırlamak ve bu rapor dosyalarını Visual Basic projeleri dahilinde kullanmak istiyorsanız Visual Studio paketinden çıkan 3.CD’den yararlanmak gerekir. Crystal Report programı için Add-Ins menüsünde Report Designer adında bir komut hazırlanır (Şekil 9.j-1). Şekil 9.j-1 Add-Ins menüsündeki bu komut verilip rapor üreticisi programı başlatıldıktan sonra ekrana Crystal Reports penceresi gelir (Şekil 9.j-2). Crystal Reports ile kolay bir şekilde profesyonel kalitede raporlar hazırlayıp Visual Basic projeleri içinde kullanılabilir. 522 Şekil 9.j-2 Crystal Reports ile hazırlanan rapor dosyalarına RPT uzantısı verilmektedir. Yeni bir rapor hazırlamak için File menüsünden New komutu verilir veya araç çubuğundaki ilk düğmede tıklama yapılır. File menüsünden New komutunu verirseniz ekrana Create New Report diyalog kutusu gelir. Create New Report diyalog kutusunda rapor hazırlama yardımcısı (Expert) seçilmektedir (Şekil 9.j-3). Şekil 9.j-3 Hazırlamak istediğiniz rapor, Create New Report diyalog kutusunda birer düğme ile temsil edilen rapor hazırlama Expert’lerinden hangisine yakınsa onu seçmeniz gerekir. Standart bir rapor hazırlamak istiyorsanız Standart düğmesinde, çapraz sorgu hazırlamak istiyorsanız Cross-Tab 523 düğmesinde ve mektup etiketleri hazırlamak istiyorsanız Mail Label düğmesinde tıklama yapmanız gerekir. Custom düğmesinde tıklama yaparsanız Create Nwe Report diyalog kutusunun alt kısmına 5 düğme eklenir (Şekil 9.j-4). Şekil 9.j-4 Standart düğmesinde tıklama yapılınca Expert çalışmaya başlar ve Expert’in ilk adımını temsil eden diyalog kutusu ekrana gelir (Şekil 9.j-5). Rapor hazırlama Expert’in ilk adımını temsil eden diyalog kutusunda hazırlanmak istenen rapora kaynaklık edecek veri tabanı dosyası seçilmektedir. Şekil 9.j-5 524 Veri tabanı dosyasını seçmek için Data File düğmesinde tıklama yapılırsa Choose Database File diyalog kutusu ekrana gelir (Şekil 9.j-6). Şekil 9.j-6 Bu diyalog kutusunda rapora kaynaklık edecek veri tabanı dosyası seçilip önce Add düğmesinde, ardından Done düğmesinde tıklama yapılınca rapor hazırlama Expert’in 2. adımını temsil diyalog kutusu ekrana gelir. Rapor hazırlama Expert’in 2. adımını temsil eden diyalog kutusunda seçilen veri tabanı dosyasındaki tablolar birer liste kutusu ile temsil edilmektedir. Şekil 9.j-7 Bu sırada diyalog kutusunun üst kısmındaki “Step 1:Tables” sekmesinde tıklama yapıp rapor hazırlama işleminin ilk adımına geçecek olursanız seçilen veri tabanı dosyasındaki tablo ve sorguların listelendiğini görebilirsiniz. Rapor hazırlama işleminin ilk adımına dönmek için Back düğmesinde tıklama yapabilirsiniz. Şekil 9.j-8’de verilen ekran görüntüsünde “Stok” adlı veri tabanı dosyasında dört tablo bulunmaktadır. 525 Şekil 9.j-8 Rapor dahilinde yararlanmayacağınız tabloları Delete düğmesi ile bu diyalog kutusundan silebilirsiniz. Eğer hazırlayacağınız rapor ile birden fazla veri tabanı dosyasından bilgi derleyecekseniz tekrar Data File düğmesinde tıklama yapıp veri tabanı dosyası seçimi yapılan Choose Database File diyalog kutusunu ekrana getirebilirsiniz. Ekranda rapor hazırlama Expert’in 2. adımını temsil eden diyalog kutusu varken Next düğmesinde tıklama yapıp rapora dahil edilecek alanların seçildiği sekmeye geçebilirsiniz. Aşağıda verilen ekran görüntüsünde görebileceğiniz gibi seçilen tablolardaki alanlar Database Fields liste kutusunda listelenmektedir (Şekil 9.j-9). 526 Şekil 9.j-9 Raporda yer almasını istediğiniz alanları Add düğmesinde tıklama yaparak rapora dahil edebilirsiniz. Şekil 9.j-10’da verilen ekran görüntüsü raporda yer almasını istediğimiz alanları göstermektedir. Rapora dahil edilen alanların adları aynı zamanda sütun başlığı olarak kullanılmaktadır. Eğer alan adlarından farklı sütun başlıkları kullanmak istiyorsanız Report Fields liste kutusunda alan seçtikten sonra Column Heading metin kutusuna istediğini başlık metnini yazabilirsiniz. Şekil 9.j-10 Rapor hazırlama Expert’in 4. adımını temsil eden Sort sekmesinde raporda yer alacak bilgilerin nasıl sıralanacağı ve nasıl bir gruplama yapılacağı konusunda seçim yapılmaktadır. Raporda bilgilerin StokKodu alanına göre sıralanmasını istediğimiz için Add düğmesi ile StokKodu alanını Group Fields liste kutusuna kopyalayalım. 527 Şekil 9.j-11 Sort sekmesinde kayıtların nasıl sıralanacağı ve gruplanacağı konusunda seçim yapıldıktan sonra Total sekmesine geçilir. Total sekmesinde sayısal bilgi içeren alanların içeriğinin toplanması konusunda seçim yapılmaktadır. Rapora dahil edilecek bilgileri herhangi bir alana göre toplamak istemediğimiz için Total sekmesinde herhangi bir seçim ve ayarlama yapmadık (Şekil 9.j-12). Şekil 9.j-12 Rapor hazırlama sihirbazının 6. adımını temsil eden Select sekmesinde raporda yer almasını istemediğiniz kayıtları filtre edebilirsiniz. Kayıt filtre etme işlemini hangi alana göre yapmak 528 istiyorsanız o alanı Add düğmesi ile Report Fields liste kutusundan Select Fields liste kutusuna kopyalamanız gerekir (Şekil 9.j-13). Şekil 9.j-13 Örnek olması için raporda StokKodu alanında “Arçelik” bilgisi olan kayıtların yer almasını sağlamak için StokKodu alanını Select Fields liste kutusuna kopyalayalım. Alan kopyalama işleminden sonra Select sekmesinin alt kısmında değişiklik meydana gelmektedir (Şekil 9.j-14). Şekil 9.j-14 Başlangıçta herhangi bir koşula göre kayıtlar fitre edilmediği için diyalaog kutusuna yerleştirilen liste kutusunda “any value” seçeneği bulunmaktadır. Şekil 9.j-15’te verilen ekran görüntüsünü almak Select Fields liste kutusuna alan kopyalama işleminden sonra diyalog kutusuna yerleştirilen liste kutusunda “Any value” seçeneğin yerine önce “Like” seçeneğini seçelim. Ardından liste kutusunun hemen yanına yerleştirilen metin kutusna “Arçelik *” yazalım. 529 Şekil 9.j-15 Kayıtların nasıl filtre edileceğini bu şekilde belirledikten sonra rapor biçiminin seçildiği Style sekmesinde rapor biçiminin başka rapora verilmek istenen başlık Title metin kutusuna yazılabilir (Şekil 9.j-16). Şekil 9.j-16 530 Bu işlemlerden sonra Preview Report düğmesinde tıklama yapılarak rapor hazırlanır. Rapor hazırlama Expert’i ile hazırladığımız raporu aşağıda görebilirsiniz (Şekil 9.j-17). Şekil 9.j-17 Crystal report uygulamasından çıkmadan önce hazırlanan raporun kaydedilmesi gerekir. Bunun için File menüsündeki Save komutundan yararlanılır. File menüsünden Save komutunu verirseniz ekrana rapora istenen adın verilebileceği File Save As diyalog kutusu gelir. Raporu “Arçelik.rpt” adıyla kaydettikten sonra Crystal Report programın çalışmasını sona erdirelim. Şekil 9.j-18 531 1. Report Kontrolü Crystal Reports programı ile yukarıda anlatılan şekilde hazırlanan rapor dosyalarından yararlanarak ekrana veya yazıcıya raporlar almak mümkündür. Ancak bu yeterli değildir. Crystal Reports ile hazırlanan RPT uzantılı rapor dosyalarının Visual Basic projeleri dahilinde kullanılabilmesi gerekir. Bunun için üzerinde çalışılan projeye Crystal Reports kontrolünü temsil eden özel kontrol dosyasının eklenmesi gerekir (Şekil 9.j-19). Şekil 9.j-19 Visual Basic’in Project menüsünde bulunan Components komutu ile ekrana getirilen Components diyalog kutusunda Crystal Report kontrolü üzerinde çalışılan projeye dahil edilince ToolBox penceresine rapor kontrolünü temsil eden bir düğme eklenir (Şekil 9.j-20). 532 Şekil 9.j-20 ToolBox pencersinde Crystal Reports kontrolünü temsil eden düğme seçili duruma getirildikten sonra üzerinde çalışılan projenin aktif formuna rapor nesnesi eklenir (Şekil 9.j-21). Şekil 9.j-21 Forma eklenen ilk Crystal Reports nesnesine Crystal Reports1 adı verilmektedir. Rapor nenesinin adı nesneye ait Name değişkeninde tutulmaktadır. Tasarım anında Rapor nesnesine istenen ad verilebilir (Şekil 9.j-22). Şekil 9.j-22 Forma eklenen Report nesnesine kaynaklık edecek RPT uzantılı rapor dosyasının adı Report nesnesine ait ReportFileName adlı değişkene aktarılır (Şekil 9.j-23). 533 Şekil 9.j-23 Bu özelliğe aktarılacak RPT uzantılı dosyayı ve bulunduğu klasörün adı ezbere biliniyorsa ışıklı bant ReportFileName özelliğinin üzerinde iken üzerinde 3 nokta bulunan düğmede tıklama yapılırsa ekrana Properties Pages başlıklı bir diyalog kutusu gelir. Bu diyalog kutusunda Report nesnesine kaynaklık edecek rapor dosyası veya raporun hedefi belirlenir. Report nesnesi yardımı ile veri tabanı dosyasından derlenen kayıtlar yazıcıya, ekrana veya bir dosyaya gönderilebilir. Eğer raporu ekranda görmek istiyorsanız To Window, yazıcıdan almak istiyorsanız To Printer ve raporun içeriğini bir dosyaya yazmak istiyorsanız To File radyo düğmesini seçili duruma getirmeniz gerekir (Şekil 9.j-24). Şekil 9.j-24 Rapor dosyasının adını ve yerini ezbere bilmiyorsanız ReportFileName başlığına sahip metin kutusunun sonuna konulan düğmede tıklama yapmanız gerekir (Şekil 9.j-24). Bu düğmede tıklama yaparsanız ekrana Choose Report diyalog kutusu gelir (Şekil 9.j-25). 534 Şekil 9.j-25 Reports nesnesine kaynaklık edecek RPT uzantılı rapor dosyasını seçip Aç düğmesinde tıklama yaparsanız seçtiğiniz dosya Report nesnesinin ReportFileName değişkenine aktarılır. ReportFileName değişkeninin içeriği çalışma anında program kodu yazılarak belirlenebilir. Report nesnesi ile rapor almaya başlamak için Report nesnesine ait Action değişkeninden yararlanılır. Action değişkenine “1” sayısal değeri aktarılacak olunursa rapor alınmaya başlanır. Action değişkenine değer aktarma işlemini bir düğmede tıklama yapma olayına bağlayalım. Bunun için Report nesnesini dahil ettiğimiz forma “Rapor” başlıklı bir düğme ekleyelim. Yukarıda anlatıldığı gibi tasarım anında Report nesnesine ait Properties penceresinde gerekli seçim ve ayarlamalar yapılıp çalışma anında Rapor başlıklı düğmede tıklama yapılınca rapor hazırlanıp ekrana verilecektir. Bunun için Action değişkeninin içeriğini değiştiren program kodlarını Rapor başlıklı ve adlı komut düğmesinin Click yordamına dahil edelim. Private Sub Rapor_Click() CrystalReport1.Action = 1 End Sub Bu sırada Rapor başlıklı düğmede tıklama yapılacak olunursa Crystal Report nesnesine ait Action değişkenine 1 sayısal değeri aktarılır ve ekrana bir pencere içinde Raporlama yapılır. Hazırladığımız Rapora kaynaklık eden veri tabanı dosyasındaki tabloda az sayıda kayıt olduğu için bu penceredeki raporun sayfaları arasında dolaşmaya yarayan düğmeler kullanılamaz durumdadır. Bu pencere üzerindeki büyüteç resmi bulunan düğmede tıklama yapılacak olunursa raporun kağıt üzerindeki tam görüntüsü ekrana getirilir (Şekil 9.j-26). 535 Şekil 9.j-26 Rapor nesnesine başlık vermek istiyorsanız Report nesnesine ait WindowTitle özelliğinden yararlanmalısınız (Şekil 9.j-27). Şekil 9.j-27 Henüz adı olmayan bu rapora ait penceredeki rapor formu 3 kısma ayrılmış durumdadır. Formun en başında Page Header yani formun başlığı vardır. Formun en başına başlık bilgisi yazmak için Insert menüsündeki Text Field komutundan yararlanabiliriz (Şekil23-28). 536 Şekil 9.j-28 Bunun için Text Field komutunu tuşlarsanız ekrana Edit Text Field diyalog kutusu gelir. Bu kutu içindeki Text kutusuna formun başlığını yazıp Accept tuşuna basarsanız, yazdığınız yazı formun üzerine aktarılır (Şekil 9.j-29,30). Şekil 9.j-29 Şekil 9.j-30 537 Başlık yazısının hangi tarafa yaslanacağına başlık yazısının üzerine fareile çift tıklattığınızda ekrana gelen Format String diyalog kutusundaki Alignment bölümünden seçeceğiniz Left, Centered ve Right komutlarından herhangi biri ile verebilirsiniz (Şekil 9.j-31). Şekil 9.j-31 Örnek olması için hazırladığımız raporun başlığına “Şilt ve Hediye Alan Personel Listesi”” bilgisini yazalım. Hatta örnek olması için rapor başlığına ilgisiz bir adet resim dosyası ilave edelim (Şekil 9.j-32). Şekil 9.j-32 Yazının başlığına resim ilave etmek için Insert menüsündeki Picture komutundan yararlanabilirsiniz (Şekil 9.j-28). Bunun için Picrure komutu verilecek olursanız ekrana gelen Choose Picture File diyalog kutusundan istenilen resim seçer ve formun istediğiniz kısmına yerleştirebilirsiniz.(Şekil 9.j-33). 538 Şekil 9.j-33 Raporun başlığı için Font ve punto seçimi için Format menüsündeki Font komutundan yararlanabilirsiniz (Şekil 9.j-34). Şekil 9.j-34 Raporun başlığının yüksekliği istenildiği gibi azaltılıp arttırılabilir. Başlığa bilgi eklendikçe başlığın yüksekliği otomatik olarak ayarlanır. Başlığın tasarımı bittikten sonra benzer işlemler raporun alt kısmı yani Page Footer için de yapılabilir (Şekil 9.j-35). Şekil 9.j-35 539 Rapora sayfa numarası eklemek için İnsert menüsünden Special Field Page Number Field ve raporun her sayfasına günün tarihinin yazılmasını sağlamak için İnsert menüsündeki Special Field Print Date Field komutundan yararlanabilirsiniz (Şekil 9.j-36). Şekil 9.j-36 Şimdi geriye rapor formunun Details kısmı kaldı. Raporlar temelde rapora kaynaklık eden veri tabanı dosyasından kayıt okuyup formun üzerine yazmaya dayandığı için Detail kısmında mutlaka veri tabanı dosyasından okunacak bilgiler için alanlara (Fields) yer verilir. Insert menüsünden Database Fields komutu verilince ekrana Insert Database Fields diyalog kutusu gelir. Eğer Insert Database Field diyalog kutusu ekranda ise Insert menüsünden komut vermeye gerek kalmadan istediğiniz alanı seçili duruma getirip Insert düğmesinde tıklama yapabilirsiniz. (Şekil 9.j37). Şekil 9.j-37 Bu diyalog kutusunda seçilen tabloda bulunan bütün alanlar listelenir. Raporda hangi alan için yer ayrılacaksa o alan bu diyalog kutusunda seçili duruma getirilip Insert düğmesinde tıklama yapılır. Insert düğmesinde tıklama yapıldıktan sonra fare işaretinin ucuna seçilen alan ile aynı genişliğe sahip bir dikdörtgen eklenir. Bu dikdörtgen raporun istenilen kısmına bırakılır (Şekil 9.j-38). 540 Şekil 9.j-38 Bu şekilde raporda yer alması istenen bütün Database Fields’ler için Raporun üzerinde yer ayırma işleminden sonra raporun hazırlanması işlemi bitirilebilir. Normal olarak rapor başlığına Untitled Report 1 bilgisi verilmiş durumdadır. Raporun varsayılan başlığını değiştirmek için Report menüsünden Report Title komutu verilir (Şekil 9.j-39). Şekil 9.j-39 Rapora başlık vermek üzere Report menüsünden Report Title komutunu veiriseniz ekrana Edit Report Title ditalog kutusu gelir (Şekil 9.j-40). 541 Şekil 9.j-40 Bu diyalog kutusunda Title kutusuna Rapora verilmek istenen başlığın girişi yapılıp Accent düğmesinde tıklama yapılınca Rapor dosyasına başlık bilgisi verme işlemi tamamlanır ( Şekil 9.j-41). Şekil 9.j-41 Hazırlanan raporun yazıcıdan alınması için Print menüsünden Print Window komutunu vermelisiniz. Bu komut verilince seçilen dosyadaki kayıtlar Rapor penceresine gelir. 542 2. Sıfırdan Rapor Hazırlamak Create Report Expert’ten yararlanarak sıfırdan bir rapor hazırlayalım. Bu amaçla önce Crystal Report programını başlatalım. Ardından File menüsünden New komutunu verip rapor hazırlama tekniğinin seçildiği Create New Report diyalog kutusunu ekrana getirelim. Expert veya Sihirbazdan yararlanmadan rapor hazırlarken başvurulan Custom Report düğmesi başlangıçta Create New Report diyalog kutusunda yer almadığı için ayrıca Custom düğmesinde tıklama yapalım (Şekil 9.j-42). Şekil 9.j-42 Expert’lerden yararlanmadan kendimiz rapor hazırlamak istediğimiz için Custom Report düğmesinde tıklama yapıp bu düğmeyi seçili duruma getirdikten sonra, rapora kaynak oluşturan veri tabanı dosyasını seçmek üzere Data File düğmesinde tıklama yapalım. Data File düğmesinde tıklama yaparsanız veri tabanı dosyası seçimi yapılan Choose Database File diyalog kutusu ekrana gelmektedir. 543 Şekil 9.j-43 Bu diyalog kutusunda rapora temel oluşturacak veri tabanı dosyasını seçip OK. düğmesinde tıklama yaparsanız Crystal Report programı içeriği boş bir rapor hazırlayıp ekrana getiri. Crystal Report programı ayrıca ekrana Insert Database Field penceresini getirmektedir. Şekil 9.j-44 Insert database Field penceresinde, seçilen veri tabanı dosyasındaki tablolar ve tablolardaki alanlar listelenmektedir. Insert Database Field penceresinden yararlanarak alanlar dahil etmeden önce raporun kısımları hakkında bilgi alalım. Şekil 9.j-45’te verilen ekran görüntüsünde görebileceğiniz gibi Crystal Report ile hazırlanan raporlar 5 ayrı kısımdan meydana gelmektedir (Şekil 9.j-45). 544 Şekil 9.j-45 Title başlıklı satıra rapora verilmek istenen başlık yazılmaktadır. Rapor kaç sayfadan meydana gelirse gelsin, Title satırına yazılan bilgi bir kez kullanılır. Raporun her sayfasının başına yazılmak istenen bilgi Page Header satırına ve rapor sayfasının alt kısmına yazılmak istenenler ise Details satırına yazılır. Details satırı, seçilen tabloda kaç kayıt varsa o kadar tekrarlanır. Şimdi ilk olarak örnek olması için raporun başlığını girelim. Raporun başlığını girmek için Insert menüsünden Text Field komutunu vermek Gerekir (Şekil 9.j-46). Şekil 9.j-46 Raporun başlığını girmek üzere Insert menüsünden Text Field komutunu verirseniz ekrana rapor başlığı olarak kullanabileceğiniz metni girebileceğiniz Edit Text Field diyalog kutusu gelir (Şekil 9.j47). 545 Şekil 9.j-47 İstediğiniz rapor başlığını bu diyalog kutusuna girip Accept düğmesinde tıklama yaparsanız fare işaretinin ucuna, Edit Text Field diyalog kutusuna girdiğiniz metnin miktarına bağlı olarak bir dikdörtgen eklenir. Şekil 9.j-48 Edit Text Field diyalog kurusuna girdiğiniz metni sayfa başlığı olarak kullanmak üzere Page header satırına yerleştirebilirsiniz. Rapor başlığı olarak kullanılmak üzere girilen metin çin font ve punto değişikliğini yapmak için Format menüsündeki Font komutundan yararlanmak gerekir (Şekil 9.j-49). Şekil 9.j-49 Format menüsünden Font komutunu vermeden önce raporun Title kısmına yerleştirmiş olduğunuz nesnenin üzerine tıklama yaparak seçili duruma getirebilirsiniz. Format menüsünden Font komutu verildiğinde ekrana Yazıtipi diyalog kutusu gelmektedir (Şekil 9.j-50). 546 Şekil 9.j-50 Yazıtipi diyalog kutusunda istediğiniz font, punto ve yazı rengini seçip tamam düğmesinde tıklama yaparsanız bundan seçili durumdaki nesne etkilenir. Title satırının yüksekliği seçilen punto değerinden otomatik olarak etkilenir (Şekil 9.j-51). Şekil 9.j-51 Aynı zamanda yazı kutusunun üzerinde iken farenin sağ tuşuyla tıklama yapmanız halinde Şekil 9.j-52’de görülen diyalog kutu ekrana gelir. Bu diyalog kutusunda Change Font’u tıklarsanız ekrana Yazıtipi diyalog kutusu gelir. (Şekil 9.j-52). 547 Şekil 9.j-52 Şekil 9.j-32 Rapora yerleştirmiş olduğunuz nesnelerin biçim özelliklerinde değişiklik yaparken Crystal Raports penceresinin alt kısmına yerleştirilen araç çubuğundan da yararlanabilirsiniz (Şekil 9.j-32). Benzer şekilde sayfa üstbilgisi olarak kullanmak üzere raporun Page Header kısmına İnsert menüsündeki Text Field komutundan yararlanarak sabit bilgi yerleştirebilirsiniz. Şekil 9.j-54’de verilen ekran görüntüsü raporun Page Header kısmına sütun başlıklarını yazdıktan sonra alınmıştır. Şekil 9.j-54 Raporun Page Header kısmını bu şekilde düzenledikten sonra sıra Details kısmına geldi. Details kısmına yazılacak bilgiler veri tabanı dosyasından alınacağı için, daha önce ekrandan kaldırdığımız Insert Database Field penceresini ekrana getirmek gerekir. Bu amaçla Insert menüsünden Database Field komutu verilir (Şekil 9.j-55). 548 Şekil 9.j-55 Insert menüsünden Database Field komutunu verip ekrana Database Field penceresini getirdikten sonra rapora temel oluşturması için daha önce seçmiş olduğunuz veri tabanı dosyasındaki tablolardan istediğiniz alanı seçip rapora dahil edebilirsiniz (Şekil 9.j-56). Şekil 9.j-56 Insert Database Field penceresinde rapora dahil etmek istediğiniz alanı seçtikten sonra Insert düğmesinde tıklama yapmanız gerekir (Şekil 9.j-57). Şekil 9.j-57 Insert düğmesinde tıklama yaptıktan sonra fare işaretini raporun Detail kısmına götürelim. Insert Database Field penceresinde listelenen alanlardan birini seçip insert düğmesinde tıklama yapıp raporun Datails kısmında tıklama yaptığınızda Crystal Reports programı kendiliğinden alanın adını, 549 raporun Page Header kısmına yazmaktadır. Ancak Page Header kısmına yazılacak bilgileri daha önceden yazdıysanız bu işlem sırasında Page Headse kısmına otomatik olarak yazılan alan başlıklarını silmeniz gerekir. Şekil 9.j-58 Hazırlamak istediğimiz raporun Page footer olarak adlandırılan kısmına sayfa numarasını ve günün tarihini yazalım. Raporun page footer kısmına güncel tarih ve sayfa numarası yazmak için Insert Special Field komutu verildiği zaman ekrana gelen alt menüden Page Number Field komutunu vermeniz gerekir (Şekil 9.j-58). Şekil 9.j-59 Raporun Summary kısmını kullanmak istemezsek bu kısmı ortadan kaldırabiliriz. Bu amaçla Edit menüsünden Show/Hide Section komutunu verip ekrana Show/Hide Section diyalaog kutusunu getirelim. Başlangıçta raporun bütün kısımları görüntülendiği için bütün kısımların önünde “S” harfı bulunmaktadır. (Şekil 9.j-60). 550 Şekil 9.j-60 Raporun Summary kısmını gizlemek için ışıklı bantı Summary seçeneğinin üzerine götürüp Hide Section radyo düğmesini seçmek yeterlidir (Şekil32-61). Şekil 9.j-61 Bu işlemlerden sonra rapor sayesinde ekrana listelenecek veya yazıcıya gönderilecek bilgiler hakkında bilgi edinmek istiyorsanız Design modundan Preview moduna geçebilirsiniz. Preview moduna geçmek için üzerinde Preview yazan düğmede tıklama yapabilirsiniz (Şekil32-62). 551 Şekil 9.j-62 Erişim sağlanan veri tabanı dosyasının ilgili tablosundaki bütün kayıtlara yer verildi. Eğer raporda tabloda bütün kayıtların yer almasını istemiyorsanız Report menüsündeki Select Records Expert komutunu verebilirsiniz (Şekil 9.j-63). Şekil 9.j-63 Rapor sayesinde erişilen tablodaki bazı kayıtları filtre etmek üzere Report menüsünden Select Record Expert komutunu verirseniz ekrana Choose Field diyalog kutusu gelir. Choose Field diyalog kutusunun üst kısmında rapora dahil edilen alanlar, alt kısmında ise rapora temel oluşturması için seçilen veri tabanı dosyasındaki bütün tablolar ve bu tablolardaki alanlar listelenmektedir (Şekil 9.j64). Şekil 9.j-64 552 Rapora dahil etmiş olduğumuz Adı alanını seçili durumda iken OK. düğmesinde tıklama yapacak olursak ekrana Select Records Expert diyalog kutusu gelir (Şekil 9.j-65). Select Records Expert diyalog kutusunda iki sekme bulunmaktadır. İlk sekmenin adı, seçilen alan ile aynıdır. Eğer birden fazla alana göre filtre etmek istemiş olsaydık New sekmesine geçerek ikinci bir alanı seçmemiz gerekirdi. Şekil 9.j-65 Verilen ekran görüntüsünde tespit edebileceğiniz gibi kayıt seçme kriteri olarak kullanabileceğiniz çok sayıda seçenek bulunmaktadır. Kayıtlar alanında “Soyadı” bilgisi olan kayıtların rapora dahil edilmesini veya listelenecek kayıtlar konusunda eşitlik arandığı için equal to seçeneğini seçelim. Şekil 9.j-66 Kayıt seçme kriterinin belirlendiği liste kutusunda “equal to” seçeneğini seçince liste kutusunun yanına başka bir liste kutusu konuldu (Şekil 9.j-67). 553 Şekil 9.j-67 Kayıt seçme kriterini liste kutusuna doğrudan yazabileceğiniz gibi liste kutusundan seçebilirsiniz. Şekil 9.j-68 Bu liste kutusunda “ABDULKADIR” değerini seçtikten sonra Select Records Expert diyalog kutusunu OK. düğmesi ile kapatalım. Ardından Preview moduna geçip raporun son durumuna bakalım (Şekil 9.j-69). 9.k.Data Report İle Rapor Hazırlamak Bir önceki bölümde Crystal Report programı yardımıyla raporların nasıl hazırlandığı ve Visual Basic projeleri dahilinde nasıl kullanıldığı konusunda bilgi verildi. Ancak Visual Basic’in 6.0 versiyonunda rapor hazırlamaya yönelik olarak kullanılan bazı yeni kontroller bulunmaktadır. Visual Basic 6.0’da rapor hazırlamak için ilk olarak üzerinde çalışılan projeye bir Data Report penceresi dahil edilmektedir. Üzerinde çalıştığınız projeye bir Data Report penceresi eklemek istiyorsanız Project menüsündeki Componets komutu ile ekrana getirlen diyalog kutusundaki Designers sekmesinden yararlanarak Data Report’un yüklenmesi gerekir (Şekil 9.k-1). 554 Şekil 9.k-1 Üzerinde çalıştığınız projeye Data Report Designer yüklü iken Project menüsünde Add Data Report komutu bulunmaktadır (Şekil 9.k-2). Eğer Project menüsünde Add Data Report komutu bulunuyorsa Components kutusunu ekrana getirip ayarlama yapmanıza gerek yoktur. Şekil 9.k-2 Üzerinde çalıştığımız projeye, rapor hazırlamak amacıyla kullanılan bir pencere eklemek üzere Add Data Report komutunu verirseniz başlangıçta “DataReport1” adına sahip bir rapor nesnesi hazırlanır ve projeye dahil edilir. Üzerinde çalıştığınız projeye bir Data Report nesnesi dahil etmek için Projevt menüsünden komut vermek yerine Standart araç çubuğundaki ilgili düğmede tıklama yapıldığı zaman açılan menüdeki komutu verebilirsiniz (Şekil 9.k-3). 555 Şekil 9.k-3 Standart araç çubuğundaki 2.düğmenin sağ tarafında bulunan ve liste kutusu gibi olan küçük düğmede tıklama yaparsanız Project menüsündeki komutların bir çoğunun yer aldığı bir menü ekrana gelir (Şekil 9.k-4). Şekil 9.k-4 Verilen ekran görüntüsünde tespit edebileceğiniz gibi Data Report penceresinde, başlangıçta içeriği boş olan 5 ayrı kısma sahiptir. En üstte raporun başlığı Report Header ve an altta ise Report Footer kısmı bulunmaktadır. Projeye Data Report nesnesi dahil etme işleminin Project Explorer penceresindeki aktif pencere iken ekrana Propetties penceresini getirip Data Report nesnesine istediğiniz adı verebilirsiniz. 556 Şekil 9.k-5 Diğer yandan üzerinde çalıştığımız projeye bir Data Report penceresini dahil etmeniz halinde ToolBox’ta değişiklik olmakta ve ToolBox’a 6 düğme dahil edilmektedir (Şekil 9.k-6). Şekil 9.k-6 Data Report penceresi aktif pencere iken DataReport adı altında bir araya getirilen düğmeler kullanılamaz. Tam bu sırada formlardan birini seçerseniz General adı altında gruplaşan düğmeler kullanabilir duruma gelir (Şekil 9.k-7). Şekil 9.k-7 Şekil 9.k-8 Şimdi ilk olarak raporun başlığını hazırlayalım. Bu amaçla ToolBox’ta RptLabel kontrolünü temsil eden düğmeyi seçelim. Yukarıda belirtildiği gibi Data Report penceresi altif pencere iken ToolBox’ta Data Report nesnesinin üzerine yerleştirile bilinen düğmeler olmaktadır (Şekil 9.k-8). ToolBox’ta RptLabel düğmesi seçili durumda iken fare işaretini Data Report penceresine götürülürse fare işareti 557 şekil değişikliğine uğrar. Bu sırada sürükleme pozisyonunda raporun başlık kısmına istediğiniz boyutta RptLabel nesnesi yerleştirebilirsiniz. Rapor başlığına yerleştirilen ilk RptLabel nesnesinin başlığı başlangıçta “Label1” olarak seçilir (Şekil 9.k-9). Şekil 9.k-9 Data Report nesnesi ile ilgili kontrolleri kullanmak için ToolBox’taki düğmelere başvurmak zorunda değilsiniz. Raporun hangi kısmına kontrol yerleştirmek istiyorsanız, raporun o kısmına ait kısayol menüsünü açmanız gerekir. Şekil 9.k-10’da verilen ekran görüntüsü raporun, rapor başlığı olarak kullanılan kısmın üzerinde farenin sağ tuşu ile tıklama yapıldıktan sonra alınmıştır. Şekil 9.k-10 Farenin sağ tuşu ile rapor başlığının (Report Header) üzerinde tıklama yapınca ekrana kısayol menüsü gelir. Rapora kontrollerden herhangi birini yerleştirmek istiyorsanız kısayol menüsünden Insert Control komutu verildiği zaman ekrana gelen alt menüdeki komutlardan yararlanmanız gerekir (Şekil 9.k-10). Rapor başlığı olarak kullanmak üzere raporun Report Header kısmına yerleştirdiğimiz RptLabel nesnesinin özelliklerini değiştirmek için ekrana Properties penceresini getirelim ve Caption özelliğinde değişiklik yapalım (Şekil 9.k-11). 558 Şekil 9.k-11 Properties penceresinde RptLabel nesnesinin Caption özelliğinde yapılan değişiklik anında DataReport penceresine yansır. Şekil 9.k-11’de ekran görüntüsü verilen RptLabel nesnesinin Font özelliklerinde değişiklik yapılarak elde edilmiştir. Rapora yerleştirmiş olduğunuz RptLabel nesnesinin yerini ve boyutlarını fare ile belirlemekte zorlanıyorsanız Properties penceresinde Label nesnesinin Height ve Width özelliklerine başvurabilirsiniz (Şekil 9.k-12). Şekil 9.k-12 Raporun başlığından başka, raporun her sayfasında kullanmak üzere sayfa başlığı hazırlamak istiyorsanız raporun Page Header kısmına RptLabel kontrolü yerleştirebilirsiniz. Benzer şekilde her sayfanın alt kısmına Page Fooder konulmak üzere rapor alt başlığı hazırlayabilirsiniz. Şekil 9.k-13’te verilen ekran görüntüsü raporun sayfa başlığı olarak kullanmak üzere Page Header kısmına 5 adet RptLabel nesnesi yerleştirildikten sonra alınmıştır. 559 Şekil 9.k-13 Şimdi örnek olması için Page Footer kısmına sayfa numarası yerleştirelim. Page Footer kısmına sayfa numarası yerleştirmek için kısayol menüsünden Insert Control-Current Page Number komutunu vermelisiniz (Şekil 9.k-14). Şekil 9.k-14 Raporun Page Fppter kısmının neresine sayfa numarası yerleştirmek istiyorsanız farenin sağ tuşu ile oraya tıklama yaparak kısayol menüsünü açmanız gerekir (Şekil 9.k-15). 560 Şekil 9.k-15 Bu hazırlıklardan sonra sıra raporun Detail adı verilen kısmına yazılacak bilgileri belirlemeye gelir. Detail kısmında satırlar halinde listelenecek bilgiler veri tabanı dosyalarından alınacağı için daha önceden bazı hazırlıkların yapılması gerekir. Şekil 9.k-16 Veri tabanı dosyalarından bilgi alırken Data Environment nesnesinden yararlanmak istiyorsak Project menüsünden komut vererek üzerinde çalıştığımız projeye bir Data Environment nesnesi dahil edelim (Şekil 9.k-16). Daha önce Data Environment nesnesi hakkında bilgi verilen bölümden bildiğiniz gibi Data Environment nesnesi ile ilgili olarak en başta Connection nesnesi ile erişim sağlanacak veri tabanı dosyası belirlenmektedir. Bu amaçla Connection nesnesine ait kısayol menüsünden Properties komutu verilerek ekrana Data Link Properties diyalog kutusu getirilir (Şekil 9.k-17) 561 Şekil 9.k-17 DataReport nesnesi için Data Environment nesnesi ile veri tabanı dosyalarına erişim sağlarken Microsoft Jet’i kullanmak istediğimiz için Data Link Properties diyalog kutusunda Provider sekmesinde Microsoft Jet’i seçip Connection sekmesine geçelim. Connection sekmesinde erişim sağlamak istenen veri tabanı dosyası belirlenmektedir (Şekil 9.k-18). Şekil 9.k-18 İçerdiği kayıtları Data Report nesnesi içinde listelemek istediğimiz “KAYITLAR” tablosu “EM_PERS.mdb” dosyasında olduğu için bu dosyanın adını ve bulunduğu klasörü Select or enter a database name metin kutusuna yazalım. Bu şekilde erişim sağlanmak istenen veri tabanı dosyası belirlendikten sonra Advanced sekmesine geçip dosya üzerinde istenen işlemler belirlenir (Şekil 9.k-19). 562 Şekil 9.k-19 Söz konusu dosyadan yalnızca okuma yapmak istediğimiz için Advanced diyalog kutusunda Read onay kutusunu seçtiktan sonra Tamam düğmesi ile Data Link Properties diyalog kutusunu kapatalım. Anlatılan şekilde Connection nesnesinin özelliklerini belirledikten sonra Connection nesnesi için bir Command nesnesi hazırlamak gerekir. Bu amaçla Connection nesnesine ait kısayol menüsünü açalım (Şekil 9.k-20). Şekil 9.k-20 Connection nesnesine ait kısayol menüsünden Add Command komutunu verirseniz Data Environment penceresinde bir Command nesnesi hazırlanır (Şekil 9.k-21). 563 Şekil 9.k-21 Anlatılan şekilde Connection nesnesine bağlı olarak işlev görecek bir Command nesnesi hazırladıktan sonra bu nesneye ait kısayol menüsü farenin sağ tuşu ile açılıp kısayol menüsünden Properties komutunu verelim. Connection nesnesi sayesinde erişim sağlanan veri tabanı dosyasındaki hangi tablo üzerinde işlem yapılacağı Command nesnesi ile belirlenmektedir. Bu amaçla Command nesnesine ait kısayol menüsündeki Properties komutu ile ekrana getirilen diyalog kutusunda önce Database Object liste kutusunda Table seçeneği seçilir ardından Object Name liste kutusunda tablo seçimi yapılır (Şekil 9.k-22). Şekil 9.k-22 Bu seçim ve ayarlamalardan sonra seçilen tablodaki alanlar Command nesnesine bağlı olarak Data Environment penceresi içinde listelenir (Şekil 9.k-23). 564 Şekil 9.k-23 Data Environment nesnesi ile ilgili olarak yapılan bu işlemlerden sonra DataReport nesnesi içinde tablodaki hangi alana yer verilmek isteniyorsa o alan fare ile Data Environment penceresinden alınıp DataReport nesnesinin Detail kısmına bırakılabilir (Şekil 9.k-24). Şekil 9.k-24 Raporun Detail kısmına alanları Data Environment penceresinden almış olmamıza rağmen henüz rapora Data Environment nesnesinin kaynaklık edeceği belli değildir. Çünkü üzerinde çalışılan projede birden fazla Data Environment nesnesi olabilir. Data Report nesnesi için Data Environment seçimi yapmak için Properties penceresinde DataReport nesnesinin özellikleri listelenirken DataSourse özelliğine, raporda listelenecek bilgilere kaynaklık edecek Data Environment nesnesinin adı aktarılır (Şekil 9.k-25). 565 Şekil 9.k-25 Data Report nesnesi için DataSource seçimi yapıldıktan sonra ayrıce DataMember özelliği ile Command nesnesi seçimi yapılmalıdır. Çünkü aynı Data Environment nesnesi içinde birden fazla Command nesnesi olabilir. Rapor için Data Environment seçimi yapılmadan Command nesnesi seçimi yapılamaz. Şekil 9.k-26’da verilen ekran görüntüsünde üzerinde çalıştığımız projedeki Data Environment nesnesindeki yalnızca bir Command nesnesi vardı. Şekil 9.k-26 Bütün bu işlemlerden sonra raporu ekranda görüntüleyebilir veya yazıcıda yazdırabilirsiniz. Private Sub Görüntüle_Click DataReport1.Show End Sub 566 Çalışma anında “Görüntüle” başlıklı düğmede tıklama yapılıp bu yordam işletilirse rapor ayrı bir pencere içinde ekranda görüntülenir. Şekil 9.k-27’te verilen ekran görüntüsünde tespit edebileceğiniz gibi satırlar halinde rapor penceresinde listelenen her kayda ayrılan yükseklik miktarı oldukça fazladır. Şekil 9.k-27 Bunun önüne geçmek için Data Report penceresinde raporun Detail kısmının yüksekliğini azaltmak gerekir. Detail kısmının yüksekliğini fare ile göz kararı ayarlamak yerine Properties penceresinden yararlanabilirsiniz (Şekil 9.k-28). Şekil 9.k-28 567 Şekil 9.k-29 Bu penceredeki Zoom liste kutusundan yararlanarak raporun değişik ölçeklerde büyütülüp/ Küçültülüp görüntülenmesini sağlayabilirsiniz. Ayrıca rapor penceresinde üzerinde yazıcı resmi olan düğmede tıklama yaparak raporu yazıcıya gönderebilirsiniz. Eğer raporu bu şekilde ekrana getirmeden, başka bir deyişle program kodu yazarak yazıcıya göndermek istiyorsanız PrintReport metodunu kullanabilirsiniz. Private Sub Yazdır_Click DataReport1.PrintReport End Sub Eğer hazırladığınız rapor birden fazla sayfaya sahipse ve bütün sayfaları yazdırmak istemiyorsanız, PrintReport metodunun yanına yazdırılacak ilk ve son sayfanın numarasını yazabilirsiniz. Private Sub Yazdır_Click DataReport1.PrintReport, 2, 4 End Sub Eğer hazırladığınız raporu hard diskte bir dosyada yazmak istiyorsanız ExportReport metodundan yararlanabilirsiniz. Şimdi örnek olması için hazırlamış olduğumuz raporu hard diske HTLM formatında bir dosyaya yazalım. Bu amaçla formun üzerine bir düğme yerleştirip bu düğmenin Click yordamına aşağıdaki program kodunu yazmamız gerekir. Private Sub Yazdır_Click DataReport1.ExportReport, “C:\Hediye.htm”, True, False End Sub 568 Şekil 9.j-69 Kayıt seçme işlemini ikinci bir alana göre de yapmak için New sekmesinde tıklama yapmak gerekir. New sekmesinde tıklama yapınca alan seçimi yapılan Choose Field diyalog kutusu ekrana gelmektedir. Şekil 9.j-60 Adı alanından başka “Soyadı” alanına göre kayıt seçmek istediğimiz için işlem alanını seçip OK. düğmesinde tıklama yapınca Select Records Expert diyalog kutusu aşağıdaki verilen şekle dönüşür. 569 Şekil 9.j-61 9.l. Yazıcıyı Kullanmak Windows, ClipBoard nesnesinden başka Windows uyumlu uygulamalar için Printer nesnesini de hazırlamaktadır. Bunun için Windows uyumlu herhangi bir programda yazıcıyı kullanmak için ayrıca Printer nesnesini tanımlamaya gerek yoktur. Printer nesnesi bütün Windows uyumlu uygulamalara açık olduğu için diğer uygulama geliştirme programları gibi Visual Basic’te Printer nesnesi üzerinde işlem yapmada kullanılan birkaç metot veya deyim bulunmaktadır. Bu metotların dışında program kodu yazarak Printer nesnesine gönderilecek bilgiler üzerinde etkili olacak Font ve punto bilgileri printer nesnesine ait FontName ve FontSize değişkeninde saklanır. Yazma işleminde veya Printer nesnesine bilgi göndermede etkili olacak Fontun adı Printer nesnesinin FontName değişkenine daha önceden aktarılmalıdır. Bütün yazıcılar aynı özelliklere sahip olmadıkları için Windows’un bilgisayara bağlı yazıcı hakkında bilgilendirilmesi gerekir. Bu işlem sürücü dosyaları ile yapılmaktadır. Bu nedenle Visual Basic ve Visual Basic uygulamalarından bağımsız olarak kullanılan bilgisayara bağlı olan yazıcıya ait yazıcı sürücü dosyasının Windows’a tanıtılması gerekir. Aşağıda verilen program satırları ile Ad ve Soyad değişkenlerinin içerikleri yazıcıya, başka bir deyişle Windows tarafından hazırlanan Printer nesnesine yazılır. Private Sub form_Click() Ad = “Hasan” Soyad = “DURGUT” Printer.FontName = “Arial” 570 Printer.FontSize = 20 Printer.Print Ad Printer.Print Soyad End Sub Çalışma anında Form1 adlı formda tıklama yapılması halinde işletilecek bu yordamda yazma işlemi öncesinde font ve punto seçimi yapılır. Ardından Print metodu ile “Ad” ve “Sıyad” değişkenlerin içerikleri Printer nesnesine gönderilir. Printer nesnesine bilgi gönderme işlemi ile birlikte Yazdırma Yöneticisi aktive olur. Eğer kullanılan yazıcı Laser bir yazıcı ise bu örnekle yazıcıdan hemen çıkış alınmaz. Çünkü Laser yazıcılar yazma işlemini sayfa bazında yaparlar. Yazıcıya gönderilen bilgi bir sayfayı doldurmadığı sürece yazıcıdan hemen çıkış alınmaz. Gönderilen bilginin miktarına bağlı kalmadan Laser yazıcıdan hemen çıkış almak için EndDoc metodundan yararlanılır. Printer.EndDoc Bu program satırı yukarıda verilen örneğe eklenirse Laser yazıcı hemen yazmaya başlar. Bunun dışında bazen yazdırma işlemine sayfa başı yapıldıktan sonra başlatılmak istenebilir. Yazıcıya sayfa başı yaptırmak için NewPage metodundan yararlanılır. Printer nesnesinin bir de Page adında bir değişkeni bulunmaktadır. Başlangıçta içeriği 1 olan bu değişkenin içeriği NewPage ile yeni bir sayfaya geçilmesi ile birlikte 1 arttırılır. İstenirse bu değişkenin içeriği çıkış alma işlemi sırasında her sayfanın başına veya sonuna yazdırılabilir. Printer.Print Printer.Page Print deyimi ile Printer nesnesine bilgi gönderirken aynen Formlara bilgi yazılırken gibi her Print deyimi ile yazma işlemine yeni bir satırdan başlanır. Eğer aynı satıra birden fazla değişkenin içeriği veya sabit bilgi yazılmak isteniyorsa, ya aynı Print deyimi ile birden fazla değişkenin içeriği yazılır ya da Print deyiminin satır başı yapması önlenilir. Print deyiminin satır başı yapmasını önlemek için virgül (;) karekterinden yararlanılır. Private Sub form_Click() Ad = “Hasan” Soyad = “DURGUT” Printer.FontName = “Arial” Printer.FontSize = 20 Printer.Print Printer.Print Ad, Soyad Printer.Print Ad; Soyad Printer.Print Ad Printer.Print Soyad Printer.EndDoc End Sub 571 Print deyimi ile bir seferde birden fazla değişkenin içeriği yazıcıya gönderilirken, değişkenin adlarının aralarına virgül(,) veya noktalı virgül (;) konulabilir. Ancak değişkenler birbirinden virgül ile ayrıldıklarında yazıcıdan alınan çıkışta değişken içeriklerinin arasında boşluklar oluşur. Aynı durum Print deyimi ile ekrana bilgi yazarken de geçerlidir (Şekil 9.l-1). Private Sub Click_Load() Ad = "Hasan" Soyad = "DURGUT" FontName = "Arial" FontSize = 20 Print Ad; Soyad Print Ad, Soyad End Sub Şekil 9.l-1 Satır genişliği Twip cinsinde printer nesnesine ait Width adlı değişkende saklanır. Programcı çalışma anında kullanılan bilgisayardaki yazıcıya bağlı olarak Width değişkeninin içeriğine bakar ve ona göre davranır. Printer nesnesine ait Width değişkeninin içeriği Visual Basic projeleri dahilinde değiştirilemez. Width özelliğinin içeriği seçili durumda olan yazıcının markasına, modeline ve seçilen kağıdın boyutlarına göre değişmektedir. Yazıcılar penceresinde Dosya menüsündeki Özellikler komutu verilince, seçili durumdaki yazıcının özelliklerinin listelendiği bir diyalog kutusu ekrana gelmektedir. Bu diyalog kutusunda yazıcı ile ilgili her türlü ayarlama ve seçim yapılabilir. 572 Şekil 9.l-2 Printer nesnesine ait Width değişkenin içeriği bu diyalog kutusunda seçili olan kağıt genişliğine bağlıdır. a. Örnek / Yazıcı Test Option Explicit Private Sub Form_Load() Width = Screen.Width * 0.8 Height = Screen.Height * 0.8 Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2 End Sub Private Sub Form_Resize() TxtText.Move 0, 0, ScaleWidth, ScaleHeight End Sub 573 Private Sub mnuExit_Click() Unload Me End Sub Private Sub mnuPrint_Click() Dim wrdwrp As New CWordWrap Dim Buff As String Then If MsgBox("Print text?", vbYesNo Or vbQuestion) = vbYes Printer.Print " "; Printer.Font.Name = "Times New Roman" Printer.Font.Size = 10 wrdwrp.HeaderText = "Word-Wrap Demo" If txtText.SelLength > 0 Then Buff = txtText.SelText Else Buff = txtText End If wrdwrp.PrintText Buff End If End Sub Class Modules Option Explicit Private Const MARGIN_LEFT = 720 Private Const MARGIN_RIGHT = 720 Private Const MARGIN_TOP = 1440 Private Const MARGIN_BOTTOM = 1440 Private m_HeaderText As String Private m_MarginLeft As Single Private m_MarginTop As Single Private m_MarginRight As Single Private m_MarginBottom As Single Public Property Let HeaderText(sText As String) m_HeaderText = sText End Property Public Property Get HeaderText() As String HeaderText = m_HeaderText End Property Public Property Let MarginLeft(nMargin As Single) m_MarginLeft = nMargin End Property Public Property Get MarginLeft() As Single MarginLeft = m_MarginLeft End Property 574 Public Property Let MarginTop(nMargin As Single) m_MarginTop = nMargin End Property Public Property Get MarginTop() As Single MarginTop = m_MarginTop End Property Public Property Let MarginRight(nMargin As Single) m_MarginRight = nMargin End Property Public Property Get MarginRight() As Single MarginRight = m_MarginRight End Property Public Property Let MarginBottom(nMargin As Single) m_MarginBottom = nMargin End Property Public Property Get MarginBottom() As Single MarginBottom = m_MarginBottom End Property Public Sub PrintText(sText As String) Dim i As Integer, j As Integer, sCurrWord As String Screen.MousePointer = vbHourglass DoNewPage False i = 1 Do Until i > Len(sText) sCurrWord = "" Do Until i > Len(sText) Or Mid$(sText, i, 1) <= " " sCurrWord = sCurrWord & Mid$(sText, i, 1) i = i + 1 Loop If (Printer.CurrentX + Printer.TextWidth(sCurrWord)) > (Printer.ScaleWidth - m_MarginRight) Then Printer.Print If Printer.CurrentY > (Printer.ScaleHeight m_MarginBottom) Then DoNewPage Else Printer.CurrentX = m_MarginLeft End If End If Printer.Print sCurrWord; Do Until i > Len(sText) Or Mid$(sText, i, 1) > " " Select Case Mid$(sText, i, 1) Case " " Printer.Print " "; 575 Case Chr$(10) Printer.Print If Printer.CurrentY > (Printer.ScaleHeight - m_MarginBottom) Then DoNewPage Else Printer.CurrentX = m_MarginLeft End If Case Chr$(9) j = (Printer.CurrentX - MARGIN_LEFT) / Printer.TextWidth("0") j = j + (10 - (j Mod 10)) Printer.CurrentX = MARGIN_LEFT + (j * Printer.TextWidth("0")) Case Else End Select i = i + 1 Loop Loop Printer.EndDoc Screen.MousePointer = vbDefault End Sub Private Sub Class_Initialize() m_MarginLeft = MARGIN_LEFT m_MarginRight = MARGIN_RIGHT m_MarginTop = MARGIN_TOP m_MarginBottom = MARGIN_BOTTOM m_HeaderText = "CWordWrap Class" End Sub b. Örnek / Yazdırma Const satır_uzun = 40 Private Sub Afbreken(wat$, waar%) Dim lcounter%, deel1$, lteller% lcounter = 1 Do While lcounter < Len(wat$) deel1 = Mid$(wat$, lcounter, satır_uzun) If lcounter + Len(deel1) < Len(wat$) Then For lteller = Len(deel1) To 1 Step -1 If Mid$(deel1, lteller, 1) = Chr(32) Then Printer.Print Tab(waar%); Printer.Print Mid$(wat$, lcounter, lteller) lcounter = lcounter + lteller lteller = 1 576 End If Next lteller Else Printer.Print Tab(waar%); Printer.Print deel1 lcounter = Len(wat$) End If Printer.Print Tab(waar%); Loop End Sub Private Command1_Clıck Call Afbreken(text1.text,10) End Sub c. Örnek / Tab, satır ayarı Option Explicit Dim Girinti As Integer Dim SatırUzun As Integer Private Sub Command1_Click() Printer.ScaleMode = vbMillimeters Printer.Scale (0, 0)-(210, 290) Call PrintExample Printer.EndDoc 577 End Sub Private Sub Form_Load() Dim Katar As String Katar = "En güzel anları unutmamak için ?" & vbCrLf Katar = Katar + "fotoğraf makinası almayı unutmayın." Text1.Text = Katar Text2(0).Text = "15" Text2(1).Text = "20" End Sub Private Sub PrintExample() Girinti = CInt(Text2(0).Text) '15 SatırUzun = CInt(Text2(1).Text) '20 Printer.CurrentX = Girinti Call CheckLine(Text1.Text) End Sub Public Sub Wrap(source As String) Dim Say As Integer Dim strPart As String Dim intTeller As Integer Say = 1 Do While Say < Len(source) strPart = Mid$(source, Say, SatırUzun) If Say + Len(strPart) < Len(source) Then For intTeller = Len(strPart) To 1 Step -1 If Mid$(strPart, intTeller, 1) = Chr(32) Then Printer.CurrentX = Girinti Printer.Print Mid$(source, Say, intTeller) Say = Say + intTeller intTeller = 1 End If Next intTeller Else Printer.CurrentX = Girinti Printer.Print strPart Say = Len(source) End If Printer.CurrentX = Girinti Loop End Sub Public Sub CheckLine(source As String) 578 Dim positie Dim soldan As Integer Dim Say As Integer Dim Katar As String soldan = Len(source) ' 69 unutmamak için..) Katar = source Source(En güzel anları For Say = 1 To soldan If Mid$(Katar, Say, 1) = Chr(10) Then If Len(Mid$(Katar, 1, Say - 2)) > SatırUzun Then Call Wrap(Mid$(Katar, 1, Say - 2)) Else Printer.CurrentX = Girinti Printer.Print Mid$(Katar, 1, Say - 2) End If Katar = Right$(Katar, soldan - Say) Say = 1 soldan = Len(Katar) End If Next Say If Len(Katar) > SatırUzun Then Call Wrap(Katar) Else Printer.CurrentX = Girinti Printer.Print Katar End If End Sub 579
© Copyright 2024 Paperzz