Misafir Board  
| Reklam Alanı |

Üyelerimiz görüşlerini önceden onay olmadan anında yazabilmektedir, bu yazılardan dolayı doğabilecek her türlü sorumluluk yazan kullanıcılara aittir, (Bütün kullanıcıların IP adresleri tutulmaktadır) misafir.net yöneticileri itina ile icerik kontrolleri yapmaktadır, yine de misafir.net'te yasalara aykırı unsurlar bulursanız MSN: Private@misafir.net adresinden bizlere ulaşabilirsiniz, gereği yapılacaktır.

MODERATÖR BAŞVURU FORMU


PROGRAM & DONANIM & İŞLETİM SİSTEMLERİ

Visual Basic Ile Ilgili Herseyi Bulabilirsiniz

Katagorisinde ve  Programlama Forumunda Bulunan  Visual Basic Ile Ilgili Herseyi Bulabilirsiniz Konusunu Görüntülemektesiniz.=>1. VISUAL BASIC 5 İLE PROGRAMLAMAYA GENEL BİR BAKIŞ 1.1. Visual Basic 5 İle Yazılım Geliştirme Visual Basic 5 ilk açıldığında görülen New Project penceresi Visual Basic 5 ile neler ...

Geri git   Misafir Board >
PROGRAM & DONANIM & İŞLETİM SİSTEMLERİ
> Programlama
Anasayfa Kimler Online Bugünki Mesajlar Bütün Forumları okunmuş kabul et

Programlama C,C++,Visual C, Flash vb. programlama ile ilgili herşey..

Tags
basic, bulabilirsiniz, herseyi, ile, ilgili, visual


Konu Bilgileri
Konu Başlığı
Visual Basic Ile Ilgili Herseyi Bulabilirsiniz
Konudaki Cevap Sayısı
29
Şuan Bu Konuyu Görüntüleyenler
 
Görüntülenme Sayısı
2492

Cevapla
 
LinkBack Seçenekler
Alt 05-02-2006, 07:58   #11 (permalink)
aLkoLSüZ!!!
 
Privacy - ait Kullanıcı Resmi (Avatar)
 
Privacy
Kullanıcı No: 5
Konu Sayısı: 4711
Mesaj Sayısı: 17,386
Üyelik tarihi: Apr 2005
Nerden: FENERBAHCE CUMHURİYETİ
Teşekkür & Tepki Teşekkür: 4
Tepki:0
Karizma
REP Gücü : 100
REP Puanı : 704162779
REP Seviyesi : Privacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond repute
İletişim
Reklam Alanı
Standart




1. VISUAL BASIC 5 İLE PROGRAMLAMAYA GENEL BİR BAKIŞ

1.1. Visual Basic 5 İle Yazılım Geliştirme

Visual Basic 5 ilk açıldığında görülen New Project penceresi Visual Basic 5 ile neler yapılabileceğinin bir özeti gibidir.

Standart EXE:
Normal bir uygulama yazılımı geliştirmek için kullanılır. Buna örnek olarak, bir kütüphane otomasyonu sistemi, adres etiket programı gibi yazılımlar verilebilir.

ActiveX EXE:
Başka programların kendi verilerine erişebilmesine olanak tanıyan programlar geliştirmek için kullanılır. Bu programlar işlem dışı sunucular olarak da adlandırılırlar, çünkü bu programların kendi işlem kesimleri vardır. Activex EXE programlar kendi işlevlerinden yararlanan programlardan ayrı bir program olarak çalışırlar.

ActiveX DLL:
Başka programlar tarafından kullanılabilen fonksiyon ve yordam kümelerini içeren kütüphanelerdir. DLL dosyaları işlem içi sunucular olarak da adlandırılırlar. ActiveX DLL dosyalar kendi işlevlerinden yararlanan programlarla aynı bellek alanında işlem görürler. ActiveX EXE programlardaki gibi ayrı bir program olarak çalıştırılmazlar.

ActiveX Control:
Bir programa eklemek için kullanıcının ihtiyaç duyduğu kontrol nesnelerini kendisinin tasarlayıp gerçekleştirmesi için kullanılır. Visual Basic programlama sisteminde iki tür kontrol nesnesi bulunur. Bunlar içsel kontrol nesneleri ve ActiveX kontrol nesneleridir. İçsel kontrol nesneleri Visual Basic açıldığında araç kutusunda görülen nesnelerdir. ActiveX control nesneleri araç kutusuna eklenebilen kullanıcıya özel kontrol nesneleridir.

ActiveX Document DLL:
Web sayfalarında kullanılmak üzere doküman hazırlamak için kullanılır. Bu dokümanlar bir web browser kullanılarak gösterildiğinde içerdiği işlevlerin yer aldığı bir kütüphaneye ihtiyaç duyarlar. İhtiyaç duyulan bu işlevler ActiveX Document DLL kütüphanelerinde bulunur. Bu kütüphanelerdeki işlevler işlevi kullanan dokümanla aynı bellek alanında çalıştığı için bunlar işlem içi bileşenlerdir.

ActiveX Document EXE:
ActiveX Document DLL ile aynıdır. Farklı olan kesim, içerdiği işlevlerin işlem dışı olarak çalışmasıdır. İşlem içi bileşenler daha hızlı çalışma özelliğine sahiptir.

ADD IN:
Visual Basic ortamına bazı işlemlerin otomatikleştirilmesi için eklenebilen bir bileşen yaratmak için kullanılır.



VB Application Wizard:
Programın bir kısmını otomatik olarak üretmek için kullanılan bir bileşendir. Bir çok seçeneği sayesinde programın kullanıcı arabiriminin çoğunu otomatik olarak üretir.

Visual Basic ile yapılabilecekler kısaca yukarıda belirtildiği gibidir.

Bir uygulama geliştirirken önce geliştirilecek olan uygulamanın bunlardan hangisi ile yapılabileceğine bakmak gerekir. Uygulama yazılımları genellikle Standart EXE türündedir.

Şimdi Visual Basic ile Uygulama Yazılımı geliştirmeyi, kullanıcı arayüzü tasarımını, kod yazmayı, girilen verilerin doğruluğunu kontrol etmeyi ve hataları ele almayı tekrar gözden geçirmek için bir örnek tanımlayalım.


Örnek: Wordpad programına benzeyen fakat çoklu doküman arayüzüne sahip bir metin yazma programı gerçekleştirelim.


1. Kullanıcı Arayüzü Gerçekleştirimi

Yeni bir proje yaratın ve Project menüsünden bir MDI form ekleyin. MDI form kullanmak bize birden fazla dosyayı aynı anda açabilmeyi sağlayacak. MDI formu programın temel penceresi, diğer formlar da açılan dosyaların gösterildiği pencereler olacaktır. Burada dosyaların gösterildiği formlardan sadece biri yaratılacak, diğerleri kodun içinden gerektikçe yaratılacaktır. Formların isimlerini ve Caption özelliklerini şu şekilde değiştirin:

Bileşen
Özellik Değer
MDIForm Name frmANA
Caption MetinYaz
Form1 Name frmDok
Caption isimsiz
MDIChild True

FrmDok üzerine bir metin kutusu yerleştirin:

Bileşen
Özellik Değer
TextBox Name txtDok
Text
Multiline True
ScrollBars 2-vertical




Başlangıç olarak aşağıdaki kodu frmAna formunun kod kesimine ekleyin:

Option Explicit

Dim frmMetin As New frmDok

Private Sub MDIForm_Load()
frmMetin.Show
End Sub

Startup Object: frmAna
Project Name: metinyaz

Programı çalıştırdığınızda aşağıdaki ekran görüntüsü çıkacaktır.

Şekil 1.1. Metinyaz-ilk çalıştırma

Formların icon özelliklerini aşağıdaki gibi düzeltin:

frmAna: note03.ico
frmDok note07.ico

Bir formun icon özelliği formun köşesinde yer alan simgeyi belirler.
Çalışma esnasında gerekli olabilecek form sayısı önceden belli olmadığı için yeni dokümanlar için çalışma esnasında form yaratmak gerekir. Bunun için yukarıdaki kodu frmAna formundan silip yerine aşağıdaki kodu ekleyin.

Option Explicit

Private Sub MDIForm_Load()
FormEkle
End Sub

Private Function FormEkle() As Form
Set FormEkle = New frmDok
FormEkle.Show vbModeless
End Function

Böylece istenilen sayıda form eklemek mümkün hale geldi. Bir form eklemek için FormEkle fonksiyonunu çağırmak yeterlidir.
Program çalıştırılıp metin penceresi büyütüldüğünde içindeki metin kutusunun birlikte büyümediği görülür. Metin kutusunun da form ile beraber büyümesini sağlamak için formun Resize olayına aşağıdaki kodu yazmak gerekir.

Private Sub Form_Resize()
Me.txtDok.Top = 0
Me.txtDok.Left = 0
Me.txtDok.Width = Me.ScaleWidth
Me.txtDok.Height = Me.ScaleHeight
End Sub

Program çalıştığında ekranı ortalaması ve belirli bir büyüklükte çıkması için aşağıdaki kodu MDIForm_Load olay yordamının başına ekleyin.

Me.Height = Screen.Height * 0.75
Me.Width = Screen.Width * 0.75
Me.Move (Screen.Height - Me.Height) / 2, _(Screen.Width - Me.Width) / 2

Şimdi program çalıştırıldığında daha güzel bir ekran görünümüne sahip olduğu görülecektir.


2. Menü Ekleme, Dosya Menüsü:

Programın genel iskeletini oluşturduktan sonra, biraz işlerlik kazandıralım. Bunun için önce bir menü eklemek gerekir. Menüler kullanım kolaylığı açısından program geliştirirken sık başvurulan öğelerdir.

Aşağıdaki menüyü frmAna formuna ekleyin.

Eklenecek Menüler:

Dosya
(mnuDosya)
&Yeni (mnuYeni) Ctrl+Y
&Aç (mnuAc) Ctrl+A
&Kapat (mnuKapat) Gri
- (mnuDosyaCiz1)
Kayde&t (mnuKaydet) Gri
Ye&ni Adla Kaydet (mnuYeniAd) Ctrl+N Gri
- (mnuDosyaCiz2)
Yazdirma Aya&ri (mnuYAyar)
Ya&zdir (mnuYazdir) Ctrl+Z Gri
- (mnuDosyaCiz3)
Cikis (mnuDosyaCikis)
Düzen (mnuDuzen)
&Kes (mnuKes) Ctrl+X Gri
K&opyala (mnuKopyala) Ctrl+C Gri
&Yapistir (mnuYapistir) Ctrl+V Gri
&Sil (mnuSil) Del Gri
- (mnuDuzenCiz1)
&Tümünü Seç (mnuTumunuSec) Gri
Zaman/&Tarih (mnuTarih) F5 Gri
Yardim (mnuYardim)
MetinYaz Hakkinda (mnuMetinYazH)


Dosya menüsü için aşağıdaki kodu frmAna formuna ekleyin.

Public Sub MenuGunle()
Dim bulundu As Boolean
Dim i As Integer
For i = 0 To Forms.Count - 1
If Forms(i).Name = "frmDok" Then
If Forms(i).kapat = False Then
bulundu = True
Exit For
End If
End If
Next i
mnuKapat.Enabled = bulundu
mnuKaydet.Enabled = bulundu
mnuYeniAd.Enabled = bulundu
mnuYazdir.Enabled = bulundu
End Sub

Private Sub mnuCikis_Click()
Unload Me
End Sub

Private Sub mnuKapat_Click()
Unload frmAna.ActiveForm
End Sub

Private Sub mnuYeni_Click()
FormEkle
End Sub

Burada MenuGunle yordamı menülerin gri yapılmasını veya aktif hale getirilmesini sağlar. Bunun için önce açık döküman olup olmadığını kontrol eder. Eğer dokümanlardan en az bir tane varsa ve kapatılmak üzere değilse açık dokümanların bulunduğunu menü elemanlarını aktif hale getirerek belirler.

Menüyü geçerli kılmak ve dokümanların değişip değişmediğini kontrol etmek dolayısıyla kapatma işleminin yapılabileceğine karar vermek için için aşağıdaki kodu frmDok formuna ekleyin.


Dim degisti As Boolean
Public kapat As Boolean

Private Sub Form_Load()
frmAna.MenuGunle
End Sub

Private Sub Form_Unload(Cancel As Integer)
If degisti Then
Select Case MsgBox(Me.Caption & " 'deki metin degisti" _ & vbCr & vbCr & " degisiklikler kaydedilsin mi", _ vbExclamation Or vbYesNoCancel, frmAna.Caption)
Case vbYes 'kaydetme işlemleri
Case vbNo 'kapatma işlemine devam et
Case vbCancel
Cancel = True
End Select
End If
kapat = Not Cancel
frmAna.MenuGunle
End Sub

Private Sub txtDok_Change()
degisti = True
End Sub

Burada form kapatılırken dokümanın değişip değişmediği kontrol edilir. Eğer değişiklik varsa kapatılmasına izin vermek için onay istenir. Bu işlem bir mesaj kutusu aracılığıyla yapılır.


3. Düzen Menüsü, Yardım Menüsü ve Pencere Menüsü:

Düzen menüsündeki öğeleri aktif hale getirmek veya gri yapmak için MenuGunle fonksiyonuna aşağıdaki kod eklenmelidir.

mnuTumunuSec.Enabled = bulundu
mnuTarih.Enabled = bulundu
If bulundu = False Then
mnuKopyala.Enabled = False
mnuKes.Enabled = False
mnuSil.Enabled = False
mnuYapistir.Enabled = False
Else
If frmAna.ActiveForm.txtDok.SelLe ngth > 0 Then
mnuKopyala.Enabled = True
mnuKes.Enabled = True
mnuSil.Enabled = True
Else
mnuKopyala.Enabled = False
mnuKes.Enabled = False
mnuSil.Enabled = False
End If
If Clipboard.GetFormat(vbCFText) Then
mnuYapistir.Enabled = True
Else
mnuYapistir.Enabled = True
End If
End If

Daha sonra frmDok formunun aşağıdaki olay yordamlarından MenuGunle yordamı çağrılmalıdır.

Private Sub Form_Activate()
FrmAna.MenuGunle
End Sub

Private Sub txtDok_KeyUp(KeyCode As Integer, Shift As Integer)
FrmAna.MenuGunle
End Sub

Private Sub txtDok_MouseUp(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
FrmAna.MenuGunle
End Sub

FrmDok için menu gunleme işlemi Form_Load olay yordamından kaldırılmalıdır. Menü elemanlarını işler hale getirmek için aşağıdaki kodu frmAna formuna ekleyin

Private Sub mnuKes_Click()
Clipboard.SetText frmAna.ActiveForm.txtDok.SelTe xt
Sil
MenuGunle
End Sub

Private Sub mnuKopyala_Click()
Clipboard.SetText frmAna.ActiveForm.txtDok.SelTe xt
MenuGunle
End Sub

Private Sub mnuYapistir_Click()
Dim metin As String
Dim clipboardMetni As String
Dim selStart As Long
If Clipboard.GetFormat(vbCFText) Then
If frmAna.ActiveForm.txtDok.selLe ngth > 0 Then Sil
metin = frmAna.ActiveForm.txtDok.Text
selStart = frmAna.ActiveForm.txtDok.selSt art
clipboardMetni = Clipboard.GetText
frmAna.ActiveForm.txtDok.Text = Left(metin, selStart) & _
clipboardMetni & Right(metin, Len(metin) - selStart)
frmAna.ActiveForm.txtDok.selSt art = selStart
Else
MenuGunle
End If
End Sub

Private Sub mnuSil_Click()
Sil
MenuGunle
End Sub

Private Sub mnuTumunuSec_Click()
frmAna.ActiveForm.txtDok.selSt art = 0
frmAna.ActiveForm.txtDok.selLe ngth = _
Len(frmAna.ActiveForm.txtDok.T ext)
MenuGunle
End Sub

Private Sub mnuTarih_Click()
Dim metin As String
Dim selStart As Long
If frmAna.ActiveForm.txtDok.selLe ngth > 0 Then Sil
metin = frmAna.ActiveForm.txtDok.Text
selStart = frmAna.ActiveForm.txtDok.selSt art
frmAna.ActiveForm.txtDok.Text = Left(metin, selStart) & _
Now & Right(metin, Len(metin) - selStart)
frmAna.ActiveForm.txtDok.selSt art = selStart
MenuGunle
End Sub

Yardım menüsündeki MetinYaz Hakkında seçeneği için de aşağıdaki formu yaratın.

Bu formu gostermek için ilgili menü seçeneğine aşağıdaki kodu ekleyin.

Private Sub mnuMetinYazH_Click()
frmMetinYazH.Show vbModal
End Sub

Şimdi frmAna formuna aşağıda belirtildiği gibi bir pencere menüsü ekleyin.

Pencere
(mnuPencere) WindowList
Yer&lestir (mnuYerlestir)
&Yatay Yerlestir (mnuYatay)
&Dikey Yerlestir (mnuDikey)
Dü&zenle (mnuDuzenle)

Bu menü oğeleri için aşağıdaki kodu frmAna formuna ekleyin.

Private Sub mnuYerlestir_Click()
frmAna.Arrange vbCascade
End Sub

Private Sub mnuDikey_Click()
frmAna.Arrange vbTileVertical
End Sub

Private Sub mnuYatay_Click()
frmAna.Arrange vbTileHorizontal
End Sub

Private Sub mnuDuzenle_Click()
frmAna.Arrange vbArrangeIcons
End Sub


4. Nesneye Yönelik Yaklaşım:

Bu noktaya kadar MetinYazma programının kullanıcı arayüzü tamamlanmış bulunmaktadır.

Programın etkinliğini artırmak için Nesneye Yönelik bir yaklaşım kullanmak daha doğru olacaktır. Programın şu andaki haline bakılırsa doküman pencerelerini birbirinden ayırmak mümkün değildir. Programı Nesneye Yönelik yaklaşımla yeniden yazacak olursak, önce bir döküman sınıfı yaratmak gerekecektir. Adımları sırayla yazacak olursak:

4.1.Dokümanlar için dokKume adlı bir küme (Collection) yaratın. Bunun için frmAna formunun başına aşağıdaki kodu ekleyin.

Public dokKume As New Collection
Public kumeIndeksi As Integer

Bu kümeyi yok etmek için ise frmAna formunun MDIForm_Terminate olay yordamına aşağodaki satırı ekleyin.

Set dokKume = Nothing

4.2. Programa yeni bir sınıf ekleyip adını clsDok olarak değiştirin. Bu sınıfın kod kesimine aşağıdaki kodu ekleyin

Private mtndegisti As Boolean
Public kapat As Boolean
Public dokIsim As String
Public dokForm As frmDok
4.3. clsDok sınıfı için degisti adlı bir Property yaratıp aşağıdaki kodu ekleyin.

Public Property Get degisti() As Variant
degisti = mtndegisti
End Property

Public Property Let degisti(ByVal vNewValue As Variant)
mtndegisti = vNewValue
If mtndegisti Then
If Right(dokForm.Caption, 2) <> " *" Then
dokForm.Caption = dokIsim & " *"
End If
Else
If Right(dokForm.Caption, 2) = " *" Then
dokForm.Caption = dokIsim
End If
End If
End Property

4.4. FrmDok formundaki degisti ve kapat değişken tanımlarını kaldırın ve yerine aşağıdaki kodu yazın.

Public objDok as new clsDok
Dim kumeNo As Integer

Private Sub Form_Load()
frmAna.dokKume.Add objDok, CStr(frmAna.kumeIndeksi)
kumeNo = frmAna.kumeIndeksi
frmAna.kumeIndeksi = frmAna.kumeIndeksi + 1
Me.Caption = Me.Caption & CStr(frmAna.kumeIndeksi)
Set objDok.dokForm = Me
objDok.dokIsim = Me.Caption
End Sub

4.5. Daha sonra degisti ve kapat değişkenlerine yapılan tüm erişimleri objDok.degisti veya objDok.kapat olarak değiştirin.

4.6. frmDok formunun Form_Unload olay yordamının sonuna aşağıdaki kodu ekleyin:

If Cancel = False Then
frmAna.dokKume.Remove CStr(kumeNo)
Set objDok = Nothing
End If

4.7. Doküman içinde bir metni aramak için frmAna formunda Duzen menüsüne aşağıdaki menü seçeneğini ekleyin.

-
(mnuDuzenCiz2)
&Bul (mnuBul) Ctrl+B Gri

Daha sonra bu seçeneğin aktif veya gri yapılmasını denetlemek için frmAna formundaki MenuGunle yordamının Düzen menüsü için yapılan işlemler kısmına aşağıdaki satırı ekleyin.

mnuBul = bulundu

Arama işlemi için aşağıdaki elemanları içeren ve görünüşü verilmiş olan formu hazırlayın.


Bileşen
Özellik Değer
Form Name frmBul
Borderstyle 3-Fixed Dialog
ControlBox False
Label Name lblBul
TextBox Name txtBul
CommandButton Name cmdBul
Default True
CommandButton Name cmdIptal
Cancel True



Bu formu göstermek için frmAna formundaki mnuBul_Click olay yordamına aşağıdaki satırı ekleyin.

frmBul.Show vbModal

Ayrıca frmBul formuna aşağıdaki kodu ekleyin.

Private Sub cmdBul_Click()
Dim dokObj As clsDok
Dim sonuc As Integer
For Each dokObj In frmAna.dokKume
sonuc = InStr(dokObj.dokForm.txtDok.Te xt, txtBul.Text)
If sonuc > 0 Then
dokObj.dokForm.ZOrder
dokObj.dokForm.txtDok.selStart = sonuc - 1
dokObj.dokForm.txtDok.selLengt h = Len(txtBul.Text)
Exit For
End If
Next dokObj
Unload Me
End Sub
Private Sub cmdIptal_Click()
Unload Me
End Sub


5. Microsoft Common Dialog Control nesnelerinin kullanılması, araç çubuğu ve geri kalan menü oğeleri.

Bu kısımda Dosya menüsünde eksik kalmış olan doküman açma ve kaydetme işlemleri, Duzen menüsüne eklenecek olan Font ve Renk seçenekleri ile bir araç çubuğu MetinYaz programına dahil edilecektir.

Şimdi yapılacak işlemleri adımlar halinde gerçekleştirelim.

5.1. frmDok doküman formundaki metin kutusunu RICHTEXTBOX ile değiştirin. Bunu yapmaktaki amaç, metin kutusunun getirdiği kısıtlamaları ortadan kaldırmaktır. Eklenen RICHTEXTBOX metin kutusunun aşağıda belirtilen özelliklerini belirtildiği gibi değiştirin.

Name txtDok
Apperance 0-Flat
BorderStyle 0-No Border

5.2. frmAna formuna bir CommonDialog nesnesi yerleştirin.

5.3. Dosya menüsünün Aç seçeneği için aşağıdaki kodu frmAna formuna ekleyin.

Private Sub mnuAc_Click()
Dim Cancel As Boolean
On Error GoTo hata
Cancel = False
CommonDialog1.Filter = "Metin dosyalari|*.txt|" & _
"Tum dosyalar|*.*|Rich Text dosyalari|*.rtf"
CommonDialog1.CancelError = True
CommonDialog1.Flags = cdlOFNHideReadOnly Or _
cdlOFNFileMustExist
CommonDialog1.ShowOpen
If Not Cancel Then
If UCase(Right(CommonDialog1.file name, 3) )= "RTF" Then
frmAna.ActiveForm.txtDok.LoadF ile _
CommonDialog1.filename, rtfRTF
Else
frmAna.ActiveForm.txtDok.LoadF ile _
CommonDialog1.filename, rtfText
End If
frmAna.ActiveForm.txtDok.dokIs im = _
CommonDialog1.filename
frmAna.ActiveForm.txtDok.degis ti = False
End If
Exit Sub

hata:
Select Case Err.Number
Case cdlCancel: Cancel = True
Case rtfInvalidFileFormat:
Cancel = MsgBox("Dosya açma hatasi", vbExclamation _
Or vbOKOnly, "Dosya Açma")
Resume Next
End Select
End Sub

Burada önce windows’un dosya açma diyalog kutusu kullanılarak bir dosya adı belirleniyor, belirlenen dosya türüne göre RICHTEXTBOX nesnesinin bir metodu olan LOADFILE kullanılarak dosya içeriği metin kutusuna yazılır.

5.4. Dosya menüsünün Kaydet seçeneği için aşağıdaki kodu ekleyin.

Private Sub mnuKaydet_Click()
With frmAna.ActiveForm
If .objDok.dokIsim = "isimsiz" Then
mnuYeniAd_Click
Else
If UCase(Right(.objDok.dokIsim, 3)) = "RTF" Then
.txtDok.SaveFile .objDok.dokIsim, rtfRTF
Else
.txtDok.SaveFile .objDok.dokIsim, rtfText
End If
.objDok.degisti = False
End If
End With
End Sub

Burada eğer doküman yeni yazılmış bir doküman ise bir isim verileceğinden Yeni Adla Kaydet menü seçeneği çağrılmaktadır.

5.5. Dosya menüsünün Yeni Adla Kaydet menü seçeneği için aşağıdaki kodu ekleyin.

Private Sub mnuYeniAd_Click()
Dim Cancel As Boolean
On Error GoTo hata
Cancel = False
CommonDialog1.DefaultExt = ".rtf"
CommonDialog1.Filter = "Metin dosyalari|*.txt|" & _
"Tum dosyalar|*.*|Rich Text dosyalari|*.rtf"
CommonDialog1.CancelError = True
CommonDialog1.Flags = cdlOFNHideReadOnly Or _
cdlOFNOverwritePrompt
CommonDialog1.ShowSave
If Not Cancel Then
If UCase(Right(CommonDialog1.file name, 3)) = "RTF" Then
frmAna.ActiveForm.txtDok.SaveF ile _
CommonDialog1.filename, rtfRTF
Else
frmAna.ActiveForm.txtDok.SaveF ile _
CommonDialog1.filename, rtfText
End If
frmAna.ActiveForm.objDok.dokIs im = _
CommonDialog1.filename
frmAna.ActiveForm.objDok.degis ti = False
End If
Exit Sub
hata:
If Err.Number = cdlCancel Then
Cancel = True
Resume Next
End If
End Sub

5.6. Düzen menüsüne aşağıdaki menü seçeneklerini ekleyin.

-
(mnuDuzenCiz3)
&Font (mnuFont)
&Renk (mnuRenk)

Daha sonra bu seçeneklerin aktif veya gri yapılmasını denetlemek için frmAna formundaki MenuGunle yordamının Düzen menüsü için yapılan işlemler kısmına aşağıdaki satırları ekleyin.

mnuFont = bulundu
mnuRenk = bulundu

5.7. Düzen menüsü Font ve Renk seçenekleri için aşağıdaki kodu ekleyin.

Private Sub mnuFont_Click()
On Error GoTo fonthata
CommonDialog1.Flags = cdlCFBoth Or cdlCFEffects
CommonDialog1.ShowFont
With frmAna.ActiveForm.txtDok
.SelFontName = CommonDialog1.FontName
.SelFontSize = CommonDialog1.FontSize
.SelBold = CommonDialog1.FontBold
.SelItalic = CommonDialog1.FontItalic
.SelStrikeThru = CommonDialog1.FontStrikethru
.SelUnderline = CommonDialog1.FontUnderline
.SelColor = CommonDialog1.Color
End With
fonthata:
End Sub
Private Sub mnuRenk_Click()
On Error GoTo renkhata
CommonDialog1.Flags = cdlCCFullOpen
CommonDialog1.ShowColor
frmAna.ActiveForm.txtDok.SelCo lor = CommonDialog1.Color
renkhata:
End Sub

5.8. frmAna formuna bir araç çubuğu (ToolBar) ve bir ImageList ekleyin. ImageList resim listesine aşağıda görülen resimleri GRAPHICS\BITMAPS\TLBR_95 dizini içinden ekleyin ve sırasıyla araç çubuğuna yerleştirin.

Yukarıda belirtilen araç çubuğu düğmelerinin anahtar (Key) değerlerini sırasıyla “Yeni”, “Ac” ve “Kaydet” olarak değiştirin.

Kaydet düğmesini aktif hale getirmek veya gri yapmak için aşağıdaki satırı MenuGunle yordamının dosya menüsü ile ilgili kısmına ekleyin.

Toolbar1.Buttons(“Kaydet”).Ena bled = bulundu

Daha sonra aşağıdaki kodu frmAna formuna ekleyin.

Private Sub Toolbar1_ButtonClick(ByVal Dugme As Button)
Select Case Dugme.Key
Case "Yeni": mnuYeni_Click
Case "Ac": mnuAc_Click
Case "Kaydet": mnuKaydet_Click
End Select
End Sub


5.9. frmAna formuna bir Durum Çubuğu (StatusBar) ekleyin. Bu durum çubuğuna aşağıda belirtilen özelliklere sahip 7 tane kesim ekleyin.

Index Key Alignment Style Bevel AutoSize
1 Metin 0 - Left 0 - Text 1 - Inset 1 - Spring
2 Caps 1 - Center 1 - CAPS 1 - Inset 2 - Content
3 NumLock 1 - Center 2 - NUM LOCK 1-Inset 2 - Content
4 Ins 1 - Center 3 - INS 1 - Inset 2 - Content
5 Scroll 1 - Center 4 - SCROLL 1 - Inset 2 - Content
6 Time 1 - Center 5 - Time 1 - Inset 2 - Content
7 Date 1 – Center 6 - Date 1 - Inset 2 - Content

Aşağıdaki kodu frmAna formuna ekleyin.

Public Sub SatirNo()
Dim sNo As Integer
With frmAna.ActiveForm.txtDok
If .selStart > 0 Then
sNo = .GetLineFromChar(.selStart)
End If
frmAna.StatusBar1.Panels("Meti n").Text = "SATIR: " _
& CStr(sNo + 1)
End With
End Sub

Daha sonra bu yordamı frmDok formunun aşağıdaki yordamlarından çağırın.

Private Sub Form_Activate()
frmAna.MenuGunle
frmAna.SatirNo
End Sub
Private Sub txtDok_SelChange()
frmAna.SatirNo
End Sub

Bunlara ek olarak aşağıdaki satırı frmDok formunun Form_Unload yordamının sonundaki If koşul deyiminin içine de satır numarasını temizlemek için aşağıdaki satırı yazın.

frmAna.StatusBar1.Panels("Meti n").Text = ""


6. Yazdırma ayarları ve Yazdırma:

Programın eksik kalan kısmı yazdığımız metnin yazıcıdan çıkarılmasıdır. Şimdi programın bu kısmını adımlar halinde gerçekleştirelim.

6.1. Dosya menüsü Yazdırma Ayarı seçeneği için aşağıdaki kodu frmAna formuna ekleyin.

Private Sub mnuYAyar_Click()
CommonDialog1.Flags = cdlPDPrintSetup
CommonDialog1.PrinterDefault = True
CommonDialog1.ShowPrinter
End Sub

6.2. Dosya Menüsünün Yazdır seçeneği için aşağıdaki kodu frmAna formuna ekleyin.

Private Sub mnuYazdir_Click()
Dim cancel As Boolean
Dim kopya As Integer
On Error GoTo yazhata
cancel = False
CommonDialog1.CancelError = True
CommonDialog1.PrinterDefault = True
CommonDialog1.Copies = 1
CommonDialog1.ShowPrinter
If cancel = False Then
For kopya = 1 To CommonDialog1.Copies
Printer.Print frmAna.ActiveForm.txtDok.Text
Printer.EndDoc
Next kopya
End If
Exit Sub
yazhata:
If Err.Number = cdlCancel Then
cancel = True
Resume Next
End If
End Sub

Programın çalışır haldeki son durumu aşağıdaki gibi olacaktır.




2. DATA CONTROL NESNESİNİN KULLANIMI

2.1. Visual Basic 5 İle Yazılım Geliştirme

Bütün uygulamalar, çok değişik türlerdeki yapısal bilgilere ihtiyaç duyar. Bu uygulamalar, muhasebe uygulamaları, bilimsel hesaplamalar yapan programlar, müşteri bilgilerine erişen programlar v.b. olabilir. Microsoft Visual Basic içindeki Data Access kullanıcılara uygulamada kullanılan verileri yönetebilmek için kullanılması gereken yapısal veritabanı sistemlerini, uygulamaların içinden yaratmak ve kullanmak için gerekli araçları sağlar.

Bu araçlar şunlardır:

1. Microsoft Jet Database Engine (Jet veritabanı motoru)
2. Data Control (Veri Tabanı kontrol nesnesi)
3. Data Access Object (DAO) –veri erişim nesnesi- programlama arabirimi.

Veri erişim nesneleri kullanarak, veritabanı yaratan veya var olan bir veri tabanlarına değişik biçimlerde erişimi sağlayan programlar yapmak mümkündür. Aşağıdaki veri tabanı biçimlerine veri erişim nesneleriyle erişmek mümkündür;

Microsoft Access
Mtrieve
dBASE
Microsoft FoxPro
Paradox
Open Database Connectivity (ODBC) client/server veritabanları (örneğin Microsoft SQL server veritabanı)

Yapısal veri tabanı sistemlerini yaratabilme ve bunlara erişebilme olanağı kullanıcıya programlama yaparken birçok kolaylık ve avantaj sağlar. Bu avantajlar şunlardır:

• Var olan veritabanı sistemlerine erişen programlar yazmak
• Uygulamanın verilerini diğer programlarla paylaşmasını sağlamak
• Programı basitleştirmek ( Alt düzey kütük işlemleriyle uğraşmak zorunda olmamak)

Visual Basic’de Jet veri tabanı motoruyla iletişim kurmak için iki tane yöntem vardır: Data Control nesnesi ve veri irişim nesneleri. Data Control nesnesi veritabanına programlamaya gerek duymadan sınırlı bir erişim sağlar. DAO modeli ise veri tabanı üzerinde tam bir kontrol sağlamaya yardımcı olan bir programlama arabirimi sağlar. Bu iki yöntem birbirini dışlamaz. Yani bir uygulamada her iki yöntemin de kullanılması gereken durumlar oluşabilir.

DAO modeli ilişkisel veri tabanı sistemlerinin yapısını modelleyen bir nesne kümesinden oluşur. Bu nesneler, veritabanı yaratma, tablo tanımlama, alan ve indeks tanımlama, tablolar arasında ilişki tanımlama ve veritabanını sorgulama vb. gibi işlemleri gerçekleştirmey, sağlayan birçok özellik ve metot sağlar.

Jet veri tabanı motoru, yukarıda belirtilen işlemleri veri tabanı dosyaları üzerinde fiziksel işlemlere dönüştürür ve ayrıca desteklenen veritabanları ile iletişimi sağlar.

Visual Basic ile veritabanı programlama yapılırken veri erişim nesnelerinin yaratılması ön plana çıkar. Bu nesneler Database, TableDef, Fiels ve Index gibi nesneleridir. Bu nesnelerin özellik ve metotları kullanılarak veritabanı üzerinde işlemler yapılır. İşlemlerin sonuçlarını Visual Basic formları üzerinde görmek için de sınırlandırılmış (bound) ve sınırlandırılmamış(unbound) kontrol nesneleri kullanılır.

Bu yaklaşım kod yazmayı basitleştirir ve uygulamayı veritabanının içsel yapısından ve verilerin getirilme mekanizmalarından soyutlar. Böylece uygulamayı geliştiren kişiye büyük bir esneklik sağlanmış olur. Ayrıca veritabanının türü değiştiğinde bile yazılan kodun bunu destelemesi için çok küçük değişiklikler yapmak yeterli olacağından sağlanan esnekliğin boyutunun daha da büyük olduğu görülmektedir. Veri erişim nesneleri kullanarak farklı türden veri tabanlarından tabloların birleştirilmesi mümkündür.

Visual Basic tarafından DAO ve Jet veritabanı motoru kullanılarak erişim yapılabilen üç veritabanı kategorisi vardır:

1. Visual Basic veri tabanları: Bunlar Microsoft Access veritabanı ile aynı biçimi kullanır. Bu veritabanlarına erişim ve üzerinde yapılacak işlemler Jet veritabanı motoru aracılığıyla doğrudan yapılabilir. Jet veritabanı motoru bu veritabanları üzerinde önemli derecede bir esneklik sağlar.

2. Dış veri tabanları (External Databases): ISAM (Indexed Sequential Access Method) biçiminde olan veri tabanları üzerinde Visual Basic ile işlem yapmak mümkündür. Bu veritabanı biçimleri şunlardır: Btrieve, dBASE III, dBASE IV, Microsoft FoxPro 2.0 ve 2.5, Paradox 3.x ve 4.0, Microsoft Excel, Lotus 1-2-3.

3. ODBC veritabanları: Bunlar ODBC standardına uyan client/server yapısındaki veritabanlarıdır. Bu tür veritabanlarına bir örnek olarak Microsoft SQL Server verilebilir. Visual Basic ile client/server uygulamaları yaratmak için veri erişim nesnesinin ODBCDirect modunu kullanmak gerekir. Böylece komutlar doğrudan dış sunucuya (server) iletilir ve orada çalıştırılır. Yani Jet veritabanı motoru devreden çıkarılır.


2.2. Data Control Nesnesi Kullanarak Veritabanına Erişim.

Data Control nesnesi kullanarak, değişik türdeki çoğu veritabanındaki bilgileri görüntülemek, değiştirmek ve bu veritabanlarına yeni bilgiler eklemek mümkündür. Data Control nesnesi kullanılarak üzerinde işlem yapılabilen veri tabanları şunlardır: Microsoft Access, Btrieve, dBASE, Microsoft FoxPro®, ve Paradox. Bunların dışında Microsoft Excel, Lotus 1-2-3, ve standart ASCII metin kütüklerine de Data Control nesnesi kullanılarak erişmek mümkündür. Ayrıca Data Control nesnesi Microsoft SQL server veya Oracle gibi ODBC veritabanlarının verilerine uzak (remote) erişimi de sağlamaktadır.

Data Control nesnesi veri erişimini Jet veritabanı motoru kullanarak gerçekleştirir. Bu veritabanı motoru Microsoft Access ile eşdeğer bir veritabanı yönetimi sağlar. Data Control nesnesi kullanarak fazladan bir kod yazmaya gerek duymaksızın veritabanı erişimi mümkündür. Şimdi Data Control nesnesi kullanımını örneklerle açıklayalım.



Örnek: Data Control nesnesi kullanımı.

Bu örnekte hazır bir veri tabanına Data Control nesnesi kullanılarak nasıl erişim sağlandığı gösterilecektir. Şimdi bu işlemi adımlar halinde gösterelim.

ADIM 1:Visual Basic ile beraber gelen BIBLIO.MDB veritabanındaki Authors tablosunu kullanalım. Authors tablosunun alanları aşağıdaki gibidir.


Sütun
Veri Türü Tanımı
Au_ID Long Integer Asıl Anahtar
Author Text Yazarın Adı
Year Born Integer Yazarın Doğum yıl


ADIM 2 : Standart EXE türünden yeni bir proje yaratın. Formun alt kısmına bir Data Control nesnesi yerleştirin ve aşağıdaki özelliklere belirtilen değerleri verin.

Nesne
Özellik Değer
Form Caption Yazarlar Tablosu
Data Control Align 2-Align Bottom
Name datYazar

Data Control nesnesinin Connect özelliği data control nesnesinin kullanacağı veritabanının türünü belirler. Properties penceresinden bu özellik değiştirilmeye çalışıldığında bir uyumlu veritabanı listesi çıkar, bu listeden bağlanacak veritabanının türü seçilebilir. Bu örnek için Connect değerini Access olarak değiştirin (zaten başlangıç değeri de budur).

Data Control nesnesinin DatabaseName özelliği kullanılacak veritabanının fiziksel dosya ismini belirler. Bu özelliği değiştirmek için yanındaki düğmeye basın. Visual Basic ana dizininden BIBLIO.MDB veritabanı dosyasını seçin.

Data Control nesnesinin RecordSet özelliği kullanılacak veritabanının kayıtları birarada ne şekilde tuttuğunu belirler. Bu değer;

-Table, sadece bir tabloya dayanan kayıt türü
-Dynaset, birden fazla tabloyu kullanan sorgular
-Snapshot, birden fazla tabloyu kullanan sorgular(kayıtlar değiştirilemez)

Bu örnek için RecordSet değerini 0-Table olarak değiştirin.

RecordSource özelliği : kullanılacak tabloyu belirler. Bu özelliği Authors olarak seçin.

BOFAction özelliği : En baştaki tutanağa gelinmişse bundan sonra ne yapılacağını belirler. Alabileceği değerler şunlardır:

MoveFirst : Data Control nesnesinin en başta kalmasını sağlar.

BOF : Data Control nesnesinin en başta kalmasını, geri tuşunun kullanımını iptal etmesini ve Validation adlı olay yordamının çağrılmasını sağlar. (Burada bu özelliğin değerini MoveFirst olarak değiştirin.)

EOFAction özelliği: Eğer en sondaki tutanağa gelinmişse bundan sonra ne yapılacağını belirler. Alabileceği değerler şunlardır.

MoveLast : Data Control nesnesinin en sonda kalmasını sağlar.

EOF : Data Control nesnesinin en sonda kalmasını, ileri tuşunun kullanımını iptal etmesini ve Validation adlı olay yordamının çağrılmasını sağlar.

AddNew : Tabloya yeni bir tutanak ekler. Bu değer kullanılırken dikkatli olunmalıdır.Çünkü farkında olmadan bir çok boş tutanak eklemeye neden olabilir.(Burada bu özelliği MoveLast olarak değiştirin.)

ReadOnly özelliği : True olduğunda tabloda değişiklik yapılması engellenmiş olur. Eğer RecordType özelliği Snapshot seçilmişse bu özellik değiştirilemez.


ADIM 3 : Data Control nesnesi tarafından yaratılan kayıt kümesi herhangi bir kod yazmaya gerek duyulmadan dolaşılabilir. Bu işlem Data Control nesnesinin üzerindeki düğmelerle gerçekleştirilir.

Program çalıştırıldığında belirtilen tutanak kümesi (RecordSet) üzerinde dolaşılabilir, fakat sonuçları herhangi bir şekilde form üzerinde gösterilmediğinden bu kullanıcı tarafından fark edilmez.

ADIM 4 : Herhangi bir anda aktif olan tutanağı form üzerinde göstermek için formun üzerine verileri göstermek için kullanılacak olan nesnelerin konması gerekir. Form üzerinde veritabanı ile ilişkilendirilebilecek standart Visual Basic nesneleri şunlardır.

• TextBox
• ListBok
• CheckBox
• ImageControl
• Label
• PictureBox

Formun üzerine aşağıdaki gibi üç tane TextBox ve üç tane de Label yerleştirin.



Bu formdaki elemanların özelliklerini de aşağıdaki tabloya göre düzenleyin.

Nesne
Özellik Değer
TextBox DataSource datYazar
DataField Au_ID
Name txtYNo
TextBox DataSource datYazar
DataField Author
Name txtYAd
TextBox DataSource datYazar
DataField Year Born
Name txtDYil
Label Caption Yazar No
Name lblYNo
Label Caption Yazar ADI
Name lblYAd
Label Caption Dogum YILI
Name lblDyil

ADIM 5: Programı çalıştırın. Ekranda Yukarıdaki form görüntüsü çıkacaktır. Formda Görüleceği gibi tablonun ilk tutanağı ekrana gelmiştir. Şimdi Data Control nesnesi üzerindeki düğmelerle veritabanı tablosu üzerinde dolaşmak mümkündür.


2.3. Data Control Nesnesinin Olaylarını ve Metotlarını Kullanma

Data Control nesnesinin de tüm nesneler gibi olay yordamları, metotları ve özellikleri vardır. Bunlar veri tabanı üzerinde işlem yapan uygulama yazılımları geliştirmeyi kolaylaştırır. Data kontrol nesnesinin olay yordamlarının ve metotlarının kullanımı için aşağıdaki örneği gerçekleştirelim.

Örnek: Data Control Nesnesi kullanarak veritabanı üzerinde ekleme, silme, arama ve değiştirme işlemlerinin yapılması.

Bu örnekte önce VB Aplication Wizard (uygulama sihirbazı) kullanarak bir şablon uygulama yaratalım. Bunun için yine BIBLIO.MDB veritabanının bu sefer Publishers tablosunu kullanalım. İşlemler aşağıda adımlar halinde sıralanmıştır.

1. Add-Ins menüsünden Application Wizard seçeneğini seçerek sihirbazı çalıştırın.
2. SDI seçeneğini seçin.
3. Clear All düğmesine basarak menüleri kaldırın.
4. Resource File kullanılmadığını belirtin.
5. Internet erişimi istenmediğini belirtin.
6. Standart formların hiçbirini istemediğinizi belirtin.
7. Bu aşamada Yes, create forms from my database seçeneğini seçip veritabanı türünü ve kullanacağınız veritabanı türünü belirleyin. Bu örnekte, veritabanı biçimi, Access ve veritabanı dosyası ise Visual Basic dizinindeki BIBLIO.MDB olarak belirlenmelidir.
8. Listelenen tablolardan Publishers tablosunu seçin.
9. Projenin ismini de YAYINEVI olarak değiştirin.
10. Şimdi yeni yaratılmış olan projeden frmPublishers formu dışındaki formları silin.
11. FrmPublishers formundan Grid butonunu ve bu düğmeye ait cmdGrid_Click kodunu silin.
12. Project menüsünden Properties seçeneğini seçip başlangıç formu olarak frmPublishers formunu seçin. Üretilen kodu inceleyelim.

Ekleme:

Private Sub cmdAdd_Click()
Data1.Recordset.AddNew
End Sub

AddNew metodu veritabanına tüm alanları boş bir tutanak ekler. Veri eklemek için kontrolün en baştaki metin kutusuna geçmesini sağlamak için aşağıdaki satır bu yordamın sonuna eklenmelidir.

txtFields(0).SetFocus

Silme:

Private Sub cmdDelete_Click()
With Data1.Recordset
.Delete
.MoveNext
If .EOF Then .MoveLast
End With
End Sub

Delete metodu tutanağı tablodan siler. Eğer silinen tutanak tek tutanak ise bir hata oluşur. Bu hata oluştuğunda Data1 nesnesinin Data1_Error olayı çağrılır. Bu olay aşağıdadır.

Private Sub Data1_Error(DataErr As Integer, Response As Integer)
MsgBox "Data error event hit err:" & Error$(DataErr)
Response = 0
End Sub

Veri erişimi sırasında bir hata oluştuğunda bu olay çağrılır.

Refresh:

Private Sub cmdRefresh_Click()
'sadece çok kullanıcılı uygulamalarda gereklidir
Data1.Refresh
End Sub

Bu metod da aktif olan tutanağın yeniden oluşturulmasını sağlar.

Değiştirme:

Private Sub cmdUpdate_Click()
Data1.UpdateRecord
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
End Sub

UpdateRecord metodu aktif olan tutanağın bilgilerini kaydeder. Yukarıda görülen koddaki ikinci satır aktif tutanağın değişen tutanak olmasını sağlar. Bu satır yazılmazsa aktif tutanak tablonun ilk tutanağı olur.

Bulma:

Bulma işleminin yukarıdaki gibi hazır bir metodu yoktur. Bu yüzden bu kodu kendimiz yazmalıyız. Önce formu aşağı doğru bir miktar uzatın ve forma aşağıdaki nesneleri ekleyin.

TextBox Name txtFind
CommanButton Caption &Find
Name cmdFind

Bu nesnelerden txtFind, aranacak olan yayınevinin ismini girmek için kullanılacak ve cmdFind butonu da arama işlemini gerçekleştirmek için kullanılacaktır. Arama işlemini gerçekleştirmek için aşağıdaki kodu cmdFind_Click olayına girin.

Private Sub cmdFind_Click()
Data1.Recordset.FindFirst "Name = '" & txtFind & "'"
End Sub

Burada Data1 nesnesinin metotlarından olan FindFirst arama için kullanılmıştır. Bu kod bize tablodaki ilk tutanağı bulur. Aynı şekilde son tutanağı bulmak için FindLast, birsonraki tutanağı bulmak için FindNext, bir önceki tutanağı bulmak için FindPrevious metotlarını kullanmak mümkündür.

Yukarıdaki kodda FindFirst metoduna parametre olarak verilen kısmı arama kriterini belirler. Eğer arama kriteri adının içinde “Microsoft” geçen yayınevini bul gibi olursa bu aşağıdaki gibi belirtilmelidir.

Data1.Recordset.FindFirst “Name LIKE '*" & txtFind & "*'

Aranan nitelikte bir tutanak bulunmadığı takdirde Data1.Recordset.NoMatch adlı özellik True değerini alır.

Data Control Nesnesinin diğer olayları:

Private Sub Data1_Reposition()
Screen.MousePointer = vbDefault
On Error Resume Next
Data1.Caption = "Record: " & CInt( (Data1.Recordset.RecordCount * _ (Data1.Recordset.PercentPositi on * 0.01)) + 1)
End Sub

Bu olay aktif olan tutanak değiştiğinde çağrılır. Bu yordamdaki son satır Data1 nesnesinin başlığını o andaki tutanağın numarasını gösterecek şekilde değiştirir.

Private Sub Data1_Validate(Action As Integer, Save As Integer)
Select Case Action
Case vbDataActionMoveFirst
Case vbDataActionMovePrevious
Case vbDataActionMoveNext
Case vbDataActionMoveLast
Case vbDataActionAddNew
Case vbDataActionUpdate
Case vbDataActionDelete
Case vbDataActionFind
Case vbDataActionBookmark
Case vbDataActionClose
Screen.MousePointer = vbDefault
End Select
Screen.MousePointer = vbHourglass
End Sub

Bu olay kodun içindeki Select deyiminde belirtilen veritabanı işlemlerinden sonra çağrılır. Parametre olarak verilen Action değeri hangi işlemden sonra çağrıldığını belirtir. Save parametresi de verinin değişip değişmediğini belirtir.

Programın çalışır haldeki son durumu aşağıdaki gibidir.

2.4. Activex Data Bound Kontrol Nesnelerini Kullanma
Visual Basic içinde veritabanı ile bağlanabilen birçok kontrol nesnesi bulunmaktadır. Bunların yanısıra birçok ActiveX kontrol nesnesi de mevcuttur. Veritabanı ile ilişkilendirilebilen içsel kontroller daha önce de sözkonusu edilen;

• Check box
• Image
• Label
• Picture box
• Text box
• List box
• Combo box

kontrolleridir.



ActiveX kontrol nesneleri ise

• Data-bound list box
• Data-bound combo box
• MSFlexGrid
• Apex Data-Bound Grid (DBGrid)
• MaskedEdit

kontrol nesneleridir.

Karmaşık kullanıcı arabirimlerinde, bu ActiveX kontrol nesneleri veritabanı kullanımını daha da fonksiyonelleştirir. Böylece kullanıcının, karmaşık bir veritabanı ile çalışırken daha kolay ve hatasız işlem yapması sağlanır. Sağlanan kolaylıklar, tutanak kümelerinin tümüne liste halinde erişim, verilerin gruplanması gibi veritabanının işlevselliğini arttırıcı işlemlerdir.

ActiveX kontrollerini kullanmadan önce form üzerine Data Control nesnesinin yerleştirilmiş ve Project menüsünün References seçeneği kullanılarak ihtiyaç duyulan ActiveX kontrollerinin seçilmesi ve ayrıca Data Access Object (DAO) kütüphanesinin de seçili olmasını sağlamak gerekir.

Bu genel açıklamalardan sonra, ActiveX kontrol nesnelerinin kullanımına örnekler verelim.

Data Bound ListBox ve Data Bound ComboBox kullanımı basittir. Daha önce kullanılan TextBox kullanımı ile benzerdir. ListBox ve ComboBox nesneleri ilişkilendirildikleri tablo alanı ile otomatik olarak doldurulur.

Örnek: Bir Data Bound ComboBox nesnesinin sorgu sonuçlarıyla doldurulması.
Yeni bir proje yaratın, forma aşağıdaki nesneleri ekleyin.

Form
Caption YAYINEVLERI
Name frmYEvi
DataControl Name datYEvi
Connect Access
Databasename BIBLIO.MDB
RecordsetType 2-Snopshot
Recordsource Select Name from Publishers
Visible False
DBCombo Name dbcYEvi
Style 2-Dropdown List
RowSource datYEvi
ListField Name



Yukarıda görüleceği gibi DataControl nesnesinin RecordSource özelliğine Select Name from Publishers ifadesi yazılmıştır. Bu ifade bir SQL sorgusudur. Bu ifadeyle Publisher Tablosundan Yayınevi adları alanı seçilir ve bir liste oluşturulur.

DBCombo kontrol nesnesinin RowSource özelliği ilişkilendirileceği Data Control nesnesini belirler. ListField özelliği ise listelenecek olan alanı belirler.
__________________
...FazLamız ERZURUM'LU oLmamız...


...Bir Yar Sevdim...
Bin Sekiz Yüz eLLi boyLu!!!
...Bir Yar Sevdim...
PALANDÖKEN huyLu!!!


Privacy Çevrimdışı
İP: 88.226.105.36  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 05-02-2006, 07:59   #12 (permalink)
aLkoLSüZ!!!
 
Privacy - ait Kullanıcı Resmi (Avatar)
 
Privacy
Kullanıcı No: 5
Konu Sayısı: 4711
Mesaj Sayısı: 17,386
Üyelik tarihi: Apr 2005
Nerden: FENERBAHCE CUMHURİYETİ
Teşekkür & Tepki Teşekkür: 4
Tepki:0
Karizma
REP Gücü : 100
REP Puanı : 704162779
REP Seviyesi : Privacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond reputePrivacy has a reputation beyond repute
İletişim
Reklam Alanı
Standart

Program çalıştırıldığında aşağıdaki ekran görüntüsü belirecektir.



DBCombo nesnesinin üç farklı biçimi vardır. Bunlar;

Dropdown combo Metin kutusu ve listeden oluşur. Metin kutusuna listede olmayan elemanlar girilebilir. Yandaki ok düğmesine basıldığında aşağı doğru bir liste açılır.

Simple combo Listesi aşağı doğru açılan türden değildir. Listede olmayan elemanlar girilebilir.

Dropdown list Aşağı doğru açılan bir listesi vardır. Listede olmayan elemanlar metin kutusuna girilemez.

Örnek : İki Data Control nesnesinin aynı anda kullanımı ve DBCombo kontrol nesnesinin önemi.

DBCombo nesnesinin önemi birden fazla tablo ile işlem yapmak gerektiğinde daha da açık bir şekilde kendisini gösterecektir. Bir veritabanında iki ayrı tablo olduğunu düşünelim. Bunlardan 1. Tablodaki bir alan 2. Tablodaki bir alanı referans olarak gösteriyorsa, 1. Tabloya veri girileceği zaman referans gösteren alana girilecek veri 2. Tabloda olmak zorundadır. Bu bilginin var olup olmadığının kontrol edilmesi veya var olan bir bilginin girilmesi için bir listeye ihtiyaç duyulur.

Bu durumu örneklemek için daha önce de kullandığımız BIBLIO.MDB veritabanındaki iki tabloyu göz önüne alalım. Bu tablolar, Titles (kitaplar) ve Publishers (Yayıncılar) tablolarıdır. Kitap bilgilerinin tutulduğu Titles tablosunda yayıncılar tablosu olan Publishers tablosuna referans gösteren PubId (Yayıncı numarası) adlı bir alan mevcuttur. Bu alana girilecek olan değer var olmayan bir yayıncının numarası olamayacağından önce varlığı kontrol edilmelidir.

Bu durumu daha açık hale getirmek için yeni bir proje başlatın ve aşağıdaki nesneleri projeye ekleyin. Formun genel görünümü ileride verilmiştir. Nesnelerin yerleşim planı için ilerideki form görünümünü kullanın.

Form
Caption Kitap Adları
Name frmKitaplar
DataControl Name datYEvi
Connect Access
Databasename BIBLIO.MDB
RecordsetType 2-Snopshot
Recordsource Select PubID,Name
From Publishers Visible False
CommandButton Name cmdKapat
Caption &Kapat
CommandButton Name cmdDegistir
Caption &Değiştir
CommandButton Name cmdYenile
Caption &Yenile
CommandButton Name cmdSil
Caption &Sil
CommandButton Name cmdEkle
Caption &Ekle
DataControl Name datKitap
Align 2- AlignBottom
Connect Access
Databasename BIBLIO.MDB
Readonly False
RecordsetType 1-Dynaset
RecordSource Titles
DBCombo Name dbcYEvi
DataField PubID
DataSource datKitap
ListField Name
BoundColumn PubID
Text Yayinevleri
RowSource datYEvi
Style 2- Dropdown list
TextBox Name txtKAd
DataField Title
DataSource datKitap
TextBox Name txtYil
DataField Year Published
DataSource datKitap
TextBox Name txtISBN
DataField ISBN
DataSource datKitap
TextBox
Name txtTanim
DataField De******ion
DataSource datKitap
TextBox Name txtNotlar
DataField Notes
DataSource datKitap
TextBox Name txtKonu
DataField Subject
DataSource datKitap
TextBox Name txtYorumlar
DataField Comments
DataSource datKitap
Multiline 1-True
ScrollBar 2-Vertical

Bunlardan başka 8 tane de Label yerleştirin ve başlıklarını ileride verilecek olan form görüntüsünden yararlanarak değiştirin.

Şimdi aşağıdaki kodu frmKitaplar formuna ekleyin.

Private Sub cmdDegistir_Click()
datKitap.UpdateRecord
datKitap.Recordset.Bookmark = datKitap.Recordset.LastModifie d
End Sub

Private Sub cmdEkle_Click()
datKitap.Recordset.AddNew
End Sub

Private Sub cmdKapat_Click()
Unload Me
End Sub

Private Sub cmdSil_Click()
datKitap.Recordset.Delete
datKitap.Recordset.MoveNext
End Sub

Private Sub cmdYenile_Click()
datKitap.Refresh
End Sub

Private Sub datKitap_Error(DataErr As Integer, Response As Integer)
MsgBox "Hata: " & Error$(DataErr)
Response = 0
End Sub

Private Sub datKitap_Reposition()
Screen.MousePointer = vbDefault
On Error Resume Next
datKitap.Caption = (datKitap.Recordset.AbsolutePo sition + 1) _
& ". TUTANAK"
End Sub

Programı çalıştırın. Aşağıdaki ekran görüntüsü çıkacaktır.

Şimdi, DBCombo kontrol nesnesinin özelliklerini tekrar inceleyelim

DBCombo
Name dbcYEvi
DataField PubID
DataSource datKitap
ListField Name
BoundColumn PubID
Text Yayinevleri
RowSource datYEvi
Style 2- Dropdown list

DataSource özelliği Varlığı kontrol edilecek verilerin alınacağı DataControl nesnesini belirler. Burada Kitaplar tablosu.

RowSource özelliği Listeye konacak olan verilerin alınacağı DataControl nesnesini belirler. Burada Yayıcılar tablosundan seçilen kısım.

ListField özelliği Listelenecek alanı belirler. Burada Yaınevinin adı.

BoundColumn özelliği Referans gösterilen tablo alanını belirler. Burada Yayıncılar tablosundan Yayıncı numarası.

DataField özelliği Karşılaştırılacak olan alanı belirler. Burada Kitaplar tablosundan Yayıncı numarası.

Tablolardan görüleceği gibi, Kitaplar tablosunda Yayıncı adı alanı bulunmamaktadır. Yayıncı adına erişmek için buradaki, Yayıncı numarası (PubID) alanından faydalanılmaktadır. Bu numaranın Yayıncılar tablosunda gösterdiği yayıncının adı alınıp listeye konmaktadır. Yeni bir kayıt eklenirken Yayıncı adını listeden seçmek, eklenecek olan kayda yayıncı numarası vermekle eşdeğerdir. Yayıncı numarası otomatik olarak kayda eklenecektir.

Örnek : Data Bound Grid kontrol nesnesinin kullanımı.

Data Bound Grid kontrol nesnesi, verilerin çizelgeler halinde gösterilebilmesini ve değiştirilebilmesini sağlar. Data Control nesnesi ile doğrudan bağlanabilir. Bu özellik tablo içeriğinin doğrudan çizelgeye aktarılmasını sağlar. Kullanımı en basit Data Bound Control nesnelerinden biridir. Çalışır duruma gelmesi için sadece yapılması gereken DataSource özelliğinin değiştirilmesi yeterlidir.

ADIM 1 : Yeni bir proje yaratın. Aşağıdaki nesneleri formun üzerine ekleyin.

Form
Caption Data Bound Grid
Name frmGrid
DataControl Connect Access
Databasename BIBLIO.MDB
Name datKitap
RecordSetType 1-Dynaset
RecordSource Titles
Visible False
Data Bound Grid DataSource datKitap
Name dbgKitap



ADIM 2 : Bir önceki örnekte kullanılan CommandButton nesnelerinin aynısını tekrar formun üzerine yerleştirin ve bunlara ait kodları da bir önceki örnekteki gibi yazın. Bu kodun yanısıra aşağıdaki kodu da forma ekleyin.

Private Sub datKitap_Error(DataErr As Integer, Response As Integer)
MsgBox "Hata: " & Error$(DataErr)
Response = 0
End Sub

Private Sub dbgKitap_HeadClick(ByVal ColIndex As Integer)
datKitap.RecordSource = "Select * From Titles Order By [" & _
dbgKitap.Columns(ColIndex).Dat aField & "]"
datKitap.Refresh
End Sub

Burada ilk yordam herhangi bir hata oluştuğunda hatanın pas geçilmesini, ikinci yordam ise çizelgedeki sütunlardan birine basıldığında çizelge içeriğinin o sütuna göre sıralı olmasını sağlar. Bunun için bir SQL sorgusu kullanılmaktadır. Sıralamayı sağlayan kısım SQL sorgusundaki Order By ile başlayan kısımdır.

Programın çalışması aşağıdaki gibi olacaktır.


Buradaki çizelge Kitap ismine göre sıralıdır. Bu Kitap adı(Title) yazan yere mouse ile basılarak sağlanmıştır.

Örnek : MSFlexGrid Control nesnesinin kullanımı.

Bu kontrol nesnesi Data Bound Grid nesnesinin sağladığı özelliklerin hepsini sağlar. Farklı bir özelliği, üzerinde değişiklik yapılamamasıdır. Bu nesne verilerin gösterilmesinde, gruplanmasında ve yönetiminde çok büyük avantajlar sağlar. Bu örnekte MsFlexGrid nesnesinin bazı özelliklerinin ve metotlarının kullanımı konu edilecektir.

Yeni bir proje çalıştırın. Aşağıdaki nesneleri bu projedeki formun üstüne yerleştirin. Nesneleri yerleştirirken ileride verilecek olan form görüntüsünü referans olarak kullanabilirsiniz.

Form
Caption Flex Grid
Name frmFlexGrid
DataControl Connect Access
Databasename BIBLIO.MDB
Name datYazar
RecordSource Authors
Visible False
MsFlexGrid Name MsFlexGrid1
DataSource datAuthors
AllowBigSelection False
GridLines 0-flexGridNone
GridLinesFixed 0-flexGridNone
AllowUserResizing 1-flexResultsColumns

Bunlardan başka 5 tane de CommandButton yerleştirin ve Caption özelliklerini sırasıyla; Grid Lines, Grid Lines Fixed, ForeColor, Font ve BackColor olarak değiştirin. Aşağıdaki kodu frmFlexGrid formuna ekleyin.

Private Sub Command1_Click()
If MSFlexGrid1.GridLines < flexGridRaised Then
MSFlexGrid1.GridLines = MSFlexGrid1.GridLines + 1
Else
MSFlexGrid1.GridLines = flexGridFlat
End If
End Sub

Private Sub Command2_Click()
If MSFlexGrid1.GridLinesFixed < flexGridRaised Then
MSFlexGrid1.GridLinesFixed = MSFlexGrid1.GridLinesFixed + 1
Else
MSFlexGrid1.GridLinesFixed = flexGridFlat
End If
End Sub

Private Sub Command3_Click()
Static iClicks As Integer
Select Case iClicks
Case 0: MSFlexGrid1.CellForeColor = &HFF&
Case 1: MSFlexGrid1.CellForeColor = &HFF00&
Case 2: MSFlexGrid1.CellForeColor = &HFF0000
Case 3: MSFlexGrid1.CellForeColor = 1: iClicks = -1
End Select
iClicks = iClicks + 1
End Sub

Private Sub Command4_Click()
Static iClicks As Integer
Select Case iClicks
Case 0: MSFlexGrid1.CellFontBold = 1
Case 1: MSFlexGrid1.CellFontItalic = 1
Case 2: MSFlexGrid1.CellFontBold = 0
Case 3: MSFlexGrid1.CellFontItalic = 0: iClicks = -1
End Select
iClicks = iClicks + 1
End Sub

Private Sub Command5_Click()
Static iClicks As Integer
Select Case iClicks
Case 0: MSFlexGrid1.CellBackColor = &HFF&
Case 1: MSFlexGrid1.CellBackColor = &HFF00&
Case 2: MSFlexGrid1.CellBackColor = &HFF0000
Case 3: MSFlexGrid1.CellBackColor = &HFFFFFF: iClicks = -1
End Select
iClicks = iClicks + 1
End Sub


Burada ilk iki yordam çizgi biçimini basıldıkça döngü halinde değiştirir. Diğer yordamlar da sırasıyla aktif olan hücrenin yazı rengini, font biçimini ve geri plan rengini yine döngü halinde değiştirir.

Programın çalışma sırasındaki görünüş örneği aşağıdadır.



Örnek: Şimdi yukarıdaki örnek üzerinde biraz değişiklik yapıp MSFlexGrid kontrol nesnesinin bir özelliğini daha görelim.

ADIM 1 : Yukarıdaki formu sağa doğru biraz genişletip ileride gösterilen biçime getirin. Bu forma bir CheckBox yerleştirin ve Caption özelliğini Merge Cells olarak değiştirin. Bu hücreleri birleştirmek için kullanılacak olan işaret kutusudur.

ADIM 2 : datYazar Data Control nesnesinin aşağıdaki özelliklerini değiştirin.

Name
datTKitap
RecordSource All Titles

ADIM 3 : Aşağıdaki kodu frmFlexGrid formunun sonuna ekleyin.

Private Sub Init()
Dim i As Integer
MSFlexGrid1.Row = 0
For i = 0 To MSFlexGrid1.Cols - 1
MSFlexGrid1.Col = i
MSFlexGrid1.CellFontSize = 8
MSFlexGrid1.CellAlignment = 1
MSFlexGrid1.MergeCol(i) = True
Next i
MSFlexGrid1.MergeCells = 0
End Sub

Private Sub Check1_Click()
MSFlexGrid1.MergeCells = Check1
End Sub


Burada init diye adlandırılan yordam MSFlexGrid nesnesinin sütunlarının birleşmeye uygun hale getirilmesini ve görünümünün düzgün olmasını sağlar. Bu yordam Form_Load olay yordamında çağrılmalıdır.

Programın bu yeni haliyle çalışması aşağıdaki gibidir. Görüleceği gibi aynı olan değerler birleştirilmiş ve tek bir hücre haline getirilmiştir.

Bu özelliklerinden başka MSFlexGrid yapısında hücrelere resim yerleştirmek de mümkündür.

MSFlexGrid yapısı DataControl nesnesi kullanılmadan da kullanılabilir. Bu durumda hücreleri doldurmak için AddItem metodu kullanılır.



3. VERİ ERİŞİM NESNELERİNİN KULLANIMI

3.1. Giriş

Bu bölümde Microsoft Jet veritabanı motoru ve onun programlama modeli olan DAO (Data Access Objects – Veri Erişim Nesneleri) konu edilecektir. Bunun için ilişkisel veritabanı tasarımı, yaratılması, bakımı ve değiştirilmesi konu edilecektir.

Bu bölümde DAO metotları kullanılarak;

• Veritabanı tanımlama
• Alan tanımlama
• İndeks (Dizin) tanımlama
• Tablolar arasında ilişki tanımlama
• Veritabanlarının yapısında değişiklik yapma
• Var olan bir veritabanı üzerinde işlem yapma

konularına açıklık getirilecektir.

Microsoft Jet Veritabanı Motoru

Visual Basic programlama dilindeki veri erişim olanağı, Microsoft Access yazılımının da temel olarak kullandığı Microsoft Jet veritabanı motoruna dayanmaktadır. Jet motoru, verilerin saklanması, geri getirilmesi ve değiştirilmesi için bir mekanizmanın yanısıra güçlü DAO nesne tabanlı arabirimini de kullanıcıya sağlar.

Bir veri tabanı uygulaması üç kesimden oluşur. Bunlar;

• Kullanıcı arabirimi
• Veritabanı motoru
• Verilerin tutulduğu fiziksel ortam kesimleridir.

Veritabanı motoru, yazılım ile fiziksel veritabanı dosyaları arasında iletişimi sağlar. Bu kullanıcıyı veritabanı dosyalarından soyutlar ve hareket serbestliği sağlar. Kullanıcı artık veritabanının türü ile ilgilenmek durumunda değildir. Bütün veritabanı biçimleri için aynı tür erişimler veritabanı motoru tarafından sağlanmaktadır.

Kullanıcı arabirimi, kullanıcının karşı karşıya kaldığı programın dış yüzüdür. Bu kesim, kullanıcının verileri görmesine, değiştirmesine ve veri eklemesine yardımcı olan, formlardan oluşan kesimdir. Bu formların yaptığı işlerle ilgilenen kesim ise uygulama yazılımının kodudur. Bu kod kullanıcının görsel olarak belirttiği işlemleri veritabanı motoruna iletmekle yükümlüdür.

Jet veritabanı motoru bir takım DLL kütüphaneleri halinde Visual Basic aracılığıyla kullanılır. Jet motoru veritabanı üzerindeki işlemler dışında ayrıca bir sorgu işleyici de barındırır. Bu sorgu işleyici SQL sorgularını veritabanı üzerinde çalıştırır ve sorgu sonuçlarını döndürür.

Veritabanı fiziksel ortamda dosyalar halinde tutulur. Bu dosyalar sadece verileri tutmakla yükümlüdür. Uygulama yazılımları bu dosyaların sadece adı ile muhatap olur. Bu dosyalarda verilerin nasıl tutulduğu veritabanı motorunu ilgilendirir.

Burada bahsedilen üç kesim değişik biçimlerde bölünebilir. Bu üç kesimin bir bilgisayar üzerinde tek bir kullanıcı tarafından kullanılması sözkonusu olabileceği gibi, birbirine ağ yapısı ile bağlı farklı bilgisayarlar üzerinde de bulunmaları mümkündür. Örneğin veritabanı bir ana bilgisayarın üzerinde bulunabilir, kullanıcılar ise bu veritabanına bir ağ üzerinden ulaşabilirler.

Kullanıcının veritabanından uzak (farklı bir bilgisayarda) olduğu durumda iki ayrı yapı sözkonusudur.

• Uzak veri tabanı sistemi (Remote Database)
• İstemci/Sunucu veritabanı sistemi (Client/Server Database)

Bunlardan birincisinde veritabanı motoru kullanıcı ile aynı bilgisayarda, ikincisinde ise veritabanı motoru veritabanı ile aynı bilgisayar üzerinde bulunur. Veritabanı motoru aynı anda birden fazla kullanıcıdan istek alır ve istedikleri kayıtları veritabanı üzerinde işlem yaparak geri döndürür.

Jet veritabanı motoru Client/Server bir yapıya sahip değildir. Yerel bir veritabanı motorudur. Uygulama ile aynı bilgisayarda bulunur. İşlevleri bir DLL halinde bulunur. Eğer bir uygulama programının farklı bilgisayarlar üzerinde kopyaları varsa herbirinin kendi Jet veritabanı motoru DLL dosyalarına sahip olması gerekir.

Visual Basic kullanarak Client/Server veritabanları ile çalışmak da mümkündür. Bunun için ODBC standardı kullanılarak sorgular doğrudan ODBC server olarak adlandırılan veritabanı sunucusuna gönderilebilir.

Veri erişim nesnesi modeli Jet veritabanı motorunun veritabanı motorudur. Bu model aşağıdaki çizimdeki sıradüzensel yapı ile ifade edilmektedir.


Bu yapıdaki elemanların herbiri aslında bir sınıfı temsil etmektedir. Bu sınıfın bir nesnesini yaratmak için ise, örneğin;

Dim MyWs as Workspace

gibi bir komut kullanmak gerekir. Yukarıdaki şemada DBEngine dışındaki elemanlar hem küme(Collection) hem de nesne olarak kullanılabilirler. Kümelerin elemanlarına sıfırdan başlayan bir dizinli yapı ile erişmek mümkündür. Bu erişim için aşağıdaki gösterim bir örnek olarak verilebilir.

DBEngine.Workspaces(0).Databas es(0).TableDefs(0).Fields("Müş teriNo")
Şu ana kadar veritabanı kavramlarına genel bir giriş yapılmış oldu. Veritabanları üzerinde işlem yapılırken iki tür dilden bahsedilir. Bunlar;

• DDL (Data Definition Language – Veri tanımlama dili)
• DML (Data Manipulation Language – Veri işleme dili)

Bu sözkonusu olan farklı iki dil olduğu anlamına gelmez. Bu sadece verilerle işlem yapılırken kullanılırken yapılan bir gruplamadır.

Veri Tanımlama(DDL), bir veritabanının tanımlaması ve yaratılması için gerekli özellikleri ve metotları içerir. Veritabanının yaratılması bir defaya mahsus yapılan bir işlemdir. Bir defa veritabanı yaratıldıktan sonra, onu açmak tüm yapısına erişmek anlamına gelir.

Veri İşleme(DML), varolan veritabanlarına erişebilen ve onların üzerinde işlem yapabilen uygulama yazılımları yazmak için gerekli özellikleri ve metotları içerir. Bu veritabanını sorgulama, tabloları üzerinde dolaşma, tutanaklar üzerinde değişiklik, ekleme, silme gibi işlemler yapmayı içerir.

Var olan veritabanlarını kullanmak için sadece DML yeterlidir. Fakat DDL metotlarını ve özelliklerini anlamak veritabanının yapısını daha iyi kavrama ve veritabanı üzerinde daha rahat işlem yapabilme olanağı sağlar.


3.2. Recordset Yapısı İle Çalışmak

Recordset yapısı veritabanına erişimi sağlayan bir nesne yapısıdır. Bir Recordset nesnesi, bir tablodaki tutanakları veya bir sorgunun sonucunda döndürülen tutanak kümelerini temsil eder. Beş farklı Recordset nesnesi vardır. Bunların herbiri farklı özellikler gösterir. Bunlar, Table , Dynaset , Snapshot , Dynamic ve Forward-only nesneleridir.

Table (Tablo) Kullanılan veritabanı üzerindeki bir tabloyu belirtir. Bu türden bir Recordset yaratıldığında, veritabanı motoru veritabanındaki bir tabloyu açar ve işlemler onun üzerinde gerçekleştirilir. Bir tablo türündeki Recordset ilişkilendirildiği veritabanı tablosunun indeks yapısını kullanabilir. Bu durum, hızlı arama yapabilme olanağı sağlar.

Dynaset Kullanılan veritabanı üzerinde yerel olarak var olan veya bu veritabanına bağlı olan tablolar ile bir sorgu sonucunda oluşturulan tabloları da temsil edebilir. Genelde bir veya birden fazla tablonun tutanaklarına referans kümeleri içerir. Bu yapı veritabanı üzerinde çok esnek bir erişim sağlar, farklı türden veritabanları üzerinde aynı Recordset yapısı kullanarak işlem yapmaya olanak sağlar. Bu avantajının yanısıra birden fazla tabloya çok sayıda bağ içerdiğinden dolayı çalışma esnasında yavaş olduğu görülür.

Snapshot Yaratıldığı anda ilişkilendirildiği verilerin sabit bir kopyasını barındırır. Jet veritabanı motoru tarafından kullanılan snapshot yapısında değişiklik yapılamaz. Ancak ODBC veritabanları sunucunun olanaklarına göre snapshot yapısı kullanarak değişiklik yapmaya izin verebilir. Snapshot işlem miktarını azalttığı için daha hızlı bir yapıdır. Bir sorgu sonucu bu yapı ile çok hızlı bir şekilde elde edilebilir.

Forward-only Forward-scrolling snapshot veya forward-only snapshot olarak adlandırıldığı da olur. Snapshot yapısının sağladığı olanakların bir alt kümesini sunar. En az işlevselliği olan Recordset yapısıdır, bu yüzden en hızlı işlem yapan yapıdır. Bu yapıda da snapshot yapısında olduğu gibi değiştirme yapılamaz. Bunun yanısıra bir kısıtlama daha vardır, bu da sadece ileriye doğru hareket edebilme özelliğidir.

Dynamic Bir veya birden fazla tabloyu içeren bir sorgu sonucunu tutmak için kullanılır. Bu yapıda ekleme, silme değiştirme gibi özellikler de sağlanır. Kullanıldığı sırada tablolardaki değişiklik de hemen bu yapıya yansır. Bu yapı ODBC veritabanılarındaki Dynamic Cursor yapısını temsil eder.

Recordset türleri kullanılırken dikkat edilmesi gereken bir unsur, Snapshot yapısı kullanılırken verilerin tümünün bir kopyasının alındığıdır. Bu haliyle bazen bir Dynaset yapısı, Snapshot yapısından daha hızlı olabilir.

Genel olarak eğer Table türü bir Recordset kullanmak mümkünse öncelikli olarak bu yapı tercih edilmelidir.

Veritabanına erişim için Recordset yapısının kullanımını örneklemeden önce veritabanının nasıl tasarlandığını ve yaratıldığını bir örnekle açıklayalım.

3.2.1 Veritabanı Tasarımı ve Yaratılması

Veritabanı tasarlama ve yaratma konusu işlenirken bir veritabanının tasarlanması şarttır. Bunun için aşağıdaki kısıtlı olarak tasarlanmış PERSONEL veritabanını kullanalım. Bu veritabanı bir kurumda çalışan personel ile ilgili birtakım bilgileri saklamak için kullanılıyor varsayalım.

PERSONEL veritabanı

Bu veritabanında aşağıdaki tabloların bulunduğunu düşünelim.

1. PERSONEL_BIL(SICNO, AD_SOYAD, DTAR, DYER)
SICNO: Sicil numarası, anahtar
AD_SOYAD: Personelin adı ve soyadı
DTAR: Doğum tarihi
DYER: Doğum yeri

2. PERSONEL_GOREV(SICNO, CYIL, GNO, DERECE, MNO)
SICNO: Sicil numarası, anahtar
CYIL: Kurumda çalıştığı yıl sayısı
GNO: Görev numarası
DERECE: Personelin kadro derecesi
MNO: Meslek numarası

3. MESLEKLER(MNO, MADI, ACIKLAMA)
MNO: Meslek numarası, anahtar
MADI: Meslek adı
ACIKLAMA: Meslekle ilgili açıklama

4. GOREVLER(GNO, GADI)
GNO: Görev numarası
GADI: Görev numarası


Bu veritabanını yaratmak için Standart EXE türünde bir proje yaratın. Üzerine iki tane CommandButton yerleştirin. Caption özelliklerini sırasıyla Yarat ve CIKIŞ olarak değiştirin ve aşağıdaki kodu forma ekleyin.

Option Explicit
Private Sub Command1_Click()
Dim ws As Workspace
Dim db As Database
Dim tdf As TableDef
Dim fld As Field
Set ws = DBEngine.Workspaces(0)
Set db = ws.CreateDatabase(App.Path & _
"\PERSONEL.MDB", dbLangTurkish)
'PERSONEL_BIL tablosu
Set tdf = db.CreateTableDef("personel_bi l")
Set fld = tdf.CreateField("sicno", dbText, 10)
tdf.Fields.Append fld
Set fld = tdf.CreateField("ad_soyad", dbText, 30)
tdf.Fields.Append fld
Set fld = tdf.CreateField("dtar", dbDate)
tdf.Fields.Append fld
Set fld = tdf.CreateField("dyer", dbText, 15)
tdf.Fields.Append fld
db.TableDefs.Append tdf
'PERSONEL_GOREV tablosu
Set tdf = db.CreateTableDef("personel_go rev")
Set fld = tdf.CreateField("sicno", dbText, 10)
tdf.Fields.Append fld
Set fld = tdf.CreateField("CYIL", dbInteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("gno", dbInteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("derece", dbInteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("mno", dbInteger)
tdf.Fields.Append fld
db.TableDefs.Append tdf
'MESLEKLER tablosu
Set tdf = db.CreateTableDef("gorevler")
Set fld = tdf.CreateField("mno", dbInteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("MADI", dbText, 40)
tdf.Fields.Append fld
db.TableDefs.Append tdf
'GOREVLER tablosu
Set tdf = db.CreateTableDef("meslekler")
Set fld = tdf.CreateField("gno", dbInteger)
tdf.Fields.Append fld
Set fld = tdf.CreateField("GADI", dbText, 40)
tdf.Fields.Append fld
db.TableDefs.Append tdf
db.Close
Label1.Caption = "PERSONEL VERİTABANI YARATILDI"
Command1.Enabled = False
End Sub
Private Sub Command2_Click()
End
End Sub

Program çalıştırıldıktan sonra aşağıdaki form görüntüsü ekrana çıkar, fakat üstteki yazı yoktur. Yarat düğmesine basıldıktan sonra üstteki yazı belirir. Daha sonra yapılması gereken ÇIKIŞ düğmesine basarak programdan çıkmaktır.

Programdan çıktıktan sonra programla aynı dizinde PERSONEL.MDB adlı bir veritabanı kütüğü yaratılmış olur. Bu veritabanının alanlarını görmek için Visual Basic dizinindeki Visdata.exe programı kullanılabilir.



İndeks Yaratma. Veritabanını yarattıktan sonra sıra indeks ekleme işlemine geldi.

İndeksler veritabanı üzerinde arama yapılırken hızlı ve kolay erişim sağlayan veritabanı öğeleridir.

Yukarıdaki projenin Command1_Click olay yordamını kaldırın ve form üzerindeki Yarat butonunun Caption özelliğini İndex Yarat olarak değiştirin ve aşağıdaki kodu Command1_Click olayına ekleyin.


Private Sub Command1_Click()
Dim ws As Workspace
Dim db As Database
Dim tdf As TableDef
Dim fld As Field
Dim idx As Index
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(App.Path & "\PERSONEL.MDB")
'PERSONEL_BIL tablosu için indeks yaratma
Set tdf = db.TableDefs("personel_bil")
Set idx = tdf.CreateIndex("ind_sicno")
Set fld = idx.CreateField("sicno")
idx.Fields.Append fld
Set fld = Nothing
idx.Primary = True
idx.Unique = True
tdf.Indexes.Append idx
'PERSONLE_GOREV tablosu için indeks yaratma
Set tdf = db.TableDefs("personel_gorev")
Set idx = tdf.CreateIndex("ind_sicno")
Set fld = idx.CreateField("sicno")
idx.Fields.Append fld
Set fld = Nothing
idx.Primary = True
idx.Unique = True
tdf.Indexes.Append idx
'MESLEKLER tablosu için indeks yaratma
Set tdf = db.TableDefs("meslekler")
Set idx = tdf.CreateIndex("ind_mno")
Set fld = idx.CreateField("mno")
idx.Fields.Append fld
Set fld = Nothing
idx.Primary = True
idx.Unique = True
tdf.Indexes.Append idx
'GOREVLER tablosu için indeks yaratma
Set tdf = db.TableDefs("gorevler")
Set idx = tdf.CreateIndex("ind_gno")
Set fld = idx.CreateField("gno")
idx.Fields.Append fld
Set fld = Nothing
idx.Primary = True
idx.Unique = True
tdf.Indexes.Append idx
db.Close
Label1.Caption = "TABLO İNDEKSLERİ YARATILDI"
Command1.Enabled = False
End Sub

Program çalıştırıldıktan sonra aşağıdaki form görüntüsü ekrana çıkar, fakat üstteki yazı yoktur. İndeks yarat düğmesine basıldıktan sonra üstteki yazı belirir. Daha sonra yapılması gereken ÇIKIŞ düğmesine basarak programdan çıkmaktır.

Programdan çıktıktan sonra Visual Basic dizinindeki Visdata.exe programı kullanılarak indekslerin yaratılıp yaratılmadığı kontrol edilebilir.

İlişki Yaratma. İki farklı tabloda aynı olan alanların tutarlılığını denetlemek için bu tablolar arasında bağ kurma işlemine ilişki yaratma denir.

Yukarıdaki veritabanı için konuşacak olursak, PERSONEL_BIL tablosunda olmayan bir personel, PERSONEL_GOREV tablosunda da olmamalıdır. Bunu sağlamak için iki tablo arasında bir ilişki tanımlamak şarttır.

Jet veritabanı motoru ilişki tanımlamak için Relation diye bir nesne sağlar.

Bir veritabanına ilişki eklemek için:

1. Database nesnesinin CreateRelation metodunu kullanarak bir ilişki nesnesi yaratın.
2. İlişkinin dayandığı alanları belirlemek için Relation nesnesinin CreateField metodunu kullanarak bir alan yaratın.
3. Yaratılan bu alanı yaratılmış 1. Adımda yaratılan ilişki nesnesine ekleyin. Sonra bu ilişkiyi veritabanına ekleyin.

Bu adımların uygulanmış hali olan aşağıdaki kodu, yukarıdaki formun Command1_Click olay yordamını silerek yerine yazın.

Private Sub Command1_Click()
Dim ws As Workspace
Dim db As Database
Dim fld As Field
Dim rel As Relation
Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(App.Path & "\PERSONEL.MDB")
'PERSONEL_BIL ile PERSONEL_GOREV tablosu arasında
'p_gorevi (personelin görevi) ilişkisi yaratma
Set tdf = db.CreateRelation("p_gorevi")
rel.Table = "personel_bil"
rel.ForeignTable = "personel_gorev"
Set fld = rel.CreateField("sicno")
fld.ForeignName = "sicno"
rel.Fields.Append fld
db.Relations.Append rel
'PERSONEL_GOREV ile GOREVLER tablosu arasında
'g_ad (görev adı) ilişkisi yaratma
Set tdf = db.CreateRelation("g_ad")
rel.Table = "gorevler"
rel.ForeignTable = "personel_gorev"
Set fld = rel.CreateField("gno")
fld.ForeignName = "gno"
rel.Fields.Append fld
db.Relations.Append rel
'PERSONEL_GOREV ile MESLEKLER tablosu arasında
'm_ad (meslek adı) ilişkisi yaratma
Set tdf = db.CreateRelation("m_ad")
rel.Table = "meslekler"
rel.ForeignTable = "personel_gorev"
Set fld = rel.CreateField("mno")
fld.ForeignName = "mno"
rel.Fields.Append fld
db.Relations.Append rel
db.Close
Label1.Caption = "İLİŞKİLER YARATILDI"
Command1.Enabled = False
End Sub

Program yine yukarıdakilere benzer bir biçimde çalışacak ve belirtilen üç ilişkiyi yaratacaktır. Bu ilişkilerin veritabanına eklendiği yine VISDATA programı kullanılarak test edilebilir. Bu ilişkiler şunlardır.

1.PERSONEL_GOREV ile GOREVLER tablosu arasında g_ad (görev adı) ilişkisi.
2.PERSONEL_GOREV ile GOREVLER tablosu arasında 'g_ad (görev adı) ilişkisi.
3.PERSONEL_GOREV ile MESLEKLER tablosu arasında m_ad (meslek adı)
ilişkisi.

VISDATA ile bakıldığında bu ilişkilerin PERSONEL_GOREV tablosuna birer indeks olarak eklendiği görülecektir.
Bu ilişkiler veritabanının tutarlılığını devam ettirmesine yardımcı olur. Örneğin bir personelin GOREVLER tablosunda olmayan bir görevi olamaz.


3.2.2. Veritabanına Erişim

Veritabanı üzerinde DataControl nesnesi kullanmadan da dolaşmak mümkündür. Bunun için veritabanı ile kontrol nesneleri arasındaki ilişki elle kurulmalıdır. Bunu örneklemek için aşağıdaki proje verilebilir.

1. Formun üstüne aşağıdaki nesneleri ileride verilecek olan form nesnesini referans alarak yerleştirin.

Form
Name frmDolas
Caption Veritabanini Dolasma
CommandButton Name Command1 (Control dizisi, 4 elemanlı, Caption özellikleri: |<, <, >, >|
TextBox Name Text1 (Control dizisi, 4 elemanlı)
CommandButton Name cmdKaydet
Caption &Kaydet

2. Projeye bir Class Module ekleyin ve clsDolas.bas olarak kaydedin. Daha sonra aşağıdaki kodu bu Class Module içine ekleyin.

Private db As Database
Private rs As Recordset
Private degisti As Boolean
Private mmad As String
Private myil As String
Private mISBN As String
Private mbno As String
Public Enum hareket
ilk = 1
son = 2
birsonraki = 3
bironceki = 4
End Enum
Public Enum hata
yhareket = vbObjectError + 1000 + 11
tutanakyok = vbObjectError + 1000 + 12
End Enum
Private Sub class_Initialize()
Dim dosyaAdi As String
dosyaAdi = "c:\devstudio\vb\biblio.md b"
Set db = DBEngine.Workspaces(0).OpenDat abase(dosyaAdi)
Set rs = db.OpenRecordset("Title", dbOpenDynaset, _
dbSeeChanges, dbOptimistic)
If rs.BOF Then HataVer yhareket
TutanakOku
End Sub
Private Sub Class_Terminate()
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub
Private Sub HataVer(hatano As hata)
Dim tanim As String
Dim aciklama As String
Select Case hatano
Case yhareket: tanim = "YANLIS HAREKET"
Case tutanakyok: tanim = "TUTANAK kitaplar tablosunda yok"
Case Else: tanim = "TANIMSIZ HATA"
End Select
aciklama = App.EXEName & ".clsDolas"
End Sub
Private Sub TutanakOku()
mISBN = rs![ISBN] & " "
mad = rs![Title] & " "
myil = rs![Year Published] & " "
mbno = rs![PubID] & " "
End Sub
Private Sub TutanakGunle()
On Error GoTo pHata
rs.Edit
rs![ISBN] = mISBN
rs![Title] = mad
rs![Year Published] = myil
rs![PubID] = mbno
rs.Update
degisti = False
Exit Sub
pHata:
rs.MovePrevious
rs.MoveNext
Err.Raise Err.Number, Err.Source, Err.De******ion, _
Err.HelpFile, Err.HelpContext
End Sub
Public Property Get ad() As String
ad = mad
End Property
Public Property Let ad(sad As String)
mad = sad
degisti = True
End Property
Public Property Get yil() As String
yil = myil
End Property
Public Property Let yil(syil As String)
myil = syil
degisti = True
End Property
Public Property Get ISBN() As String
ISBN = mISBN
End Property
Public Property Let ISBN(sISBN As String)
mISBN = sISBN
degisti = True
End Property
Public Property Get bno() As String
bno = mbno
End Property
Public Property Let bno(sbno As String)
mbno = sbno
degisti = True
End Property
Public Property Get degistimi() As Boolean
degistimi = degisti
End Property

Public Sub git(htur As hareket)
On Error GoTo phata:
Select Case htur
Case ilk: rs.MoveFirst
Case son: rs.MoveLast
Case birsonraki: rs.MoveNext
Case bironceki: rs.MovePrevious
Case Else: HataVer yhareket
End Select
TutanakOku
phata: If rs.EOF Or rs.BOF Then HataVer yhareket
End Sub
Public Sub kaydet()
If degisti Then TutanakGunle
End Sub

Bu kodu biraz inceleyecek olursak, Class_Initialize olayında veritabanı açılıyor, Class_Terminate olayında ise veritabanı kapatılıyor. Daha sonra tutanak okuma, günleme yordamları yer almaktadır. Burada kullanılan veritabanı BIBLIO.MDB veritabanıdır. Recordset olarak da bu veritabanının Titles (Kitaplar) tablosu kullanılmaktadır.

Kodun geri kalan kesiminde Recordset yapısının her bir alanı için bir Property tanımlandığı görülebilir. Property Let yordamlarında aktif tutanakta değişiklik yapıldığını belirten degisti adlı bir değişkene True değeri aktarılmaktadır.
degistimi adlı Property aktif tutanakta değişiklik yapılıp yapılmadığı bilgisini döndüren sadece okunabilir bir özeliktir.

Yukarıdaki kodda görülebileceği gibi veritabanına erişimi destekleyen yordamların yanısıra hata durumlarını ele alan ve hatalı bir duruma girildiğinde hata veren yordamlar da bulunmaktadır. Bu yordamlar kendi hata mesajlarımızı yazmak ve hatalı durumalara gelindiğinde bu mesajları kullanmak amacıyla yazılmıştır.

Bu erişim sınıfını tanımladıktan sonra, şimdi de frmDolas formunda yapılması gereken işlemlere dönelim. Aşağıdaki kodu frmDolas formuna ekleyin.

Private Kitaplar As clsDolas
Private okunuyor As Boolean
Private Sub Form_Load()
On Error GoTo phata
Set Kitaplar = New clsDolas
VeriAl
pcik: Exit Sub
phata:
MsgBox Err.De******ion, vbExclamation
Unload Me
Resume pcik
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error GoTo phata
Kitaplar.kaydet

pcik: Exit Sub

phata:
If MsgBox("Olusan hata:" & vbCrLf & Err.De******ion & vbCrLf & _
"devam ederseniz, yaptiginiz degisiklikler kaybolur" & vbCrLf & _
"Devam etmek istiyor musunuz?", vbQuestion Or vbYesNo Or _
vbDefaultButton2) = vbNo Then Cancel = True
Resume pcik
End Sub

Private Sub cmdKaydet_Click()
On Error GoTo phata
Kitaplar.kaydet
VeriAl

pcik: Exit Sub

phata:
MsgBox Err.De******ion, vbExclamation
Resume pcik
End Sub

Private Sub Command1_Click(Index As Integer)
On Error GoTo phata
Kitaplar.kaydet
Select Case Index
Case 0: Kitaplar.git ilk
Case 1: Kitaplar.git bironceki
Case 2: Kitaplar.git birsonraki
Case 3: Kitaplar.git son
End Select

pcik: Exit Sub
phata:
MsgBox Err.De******ion, vbExclamation
Resume pcik
End Sub

Private Sub Text1_Change(Index As Integer)
On Error GoTo phata
If Not okunuyor Then
Select Case Index
Case 0: Kitaplar.ad = Text1(Index).Text
Case 1: Kitaplar.yil = Text1(Index).Text
Case 2: Kitaplar.bno = Text1(Index).Text
Case 3: Kitaplar.ISBN = Text1(Index).Text
End Select
End If
pcik: Exit Sub
phata:
MsgBox Err.De******ion, vbExclamation
Resume pcik
End Sub

Private Sub VeriAl()
okunuyor = True
Text1(0).Text = Kitaplar.ad
Text1(1).Text = Kitaplar.yil
Text1(2).Text = Kitaplar.bno
Text1(3).Text = Kitaplar.ISBN
okunuyor = False
End Sub

Burada görüleceği gibi veritabanı üzerinde doğrudan hiç bir işlem yapılmamaktadır. Veritabanı erişimleri formun kodu içinde yapmaktansa sınıfın içinde yapıp bunu formun kodundan saklamak kod yazımında önemli bir kolaylık ve esneklik sağlamaktadır. Bu nesneye yönelik yaklaşımın sağladığı avantajlara bir örnek olarak verilebilir. Formun kodunda yapılan işlemleri sırayla açıklayacak olursak;
• Form yüklenirken clsDolas sınıfından bir nesne yaratılmakta ve içine veriler okunmaktadır.
• Daha sonra form bellekten silinirken değişiklikler kaydedilmekte ve hata durumunda ne yapılacağı bilgisi kullanıcıya bırakılmaktadır.
__________________
...FazLamız ERZURUM'LU oLmamız...


...Bir Yar Sevdim...
Bin Sekiz Yüz eLLi boyLu!!!
...Bir Yar Sevdim...
PALANDÖKEN huyLu!!!


Privacy Çevrimdışı
İP: 88.226.105.36  
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Alıntı ile Cevapla
Alt 05-02-2006, 08:00   #13 (permalink)
aLkoLSüZ!!!
 
Privacy - ait Kullanıcı Resmi (Avatar)
 
Privacy
Kullanıcı No: 5
Konu Sayısı: 4711
Mesaj Sayısı: 17,386