7. ACTIVEX KOD BİLEŞENLERİNİ YARATMA
7.1. GİRİŞ
Bir ActiveX bileşeni, çalıştırılabilir bir kod birimidir. Bu bir .exe, .dll veya .ocx dosyası olabilir. Bu dosyalar ActiveX nesnelerini ve bu nesnelerin belirtimlerini içerir.
ActiveX bileşenleri çok farklı amaçlar için kullanılabilir. Bu amaçlar sayısal analiz araçları, kullanıcı arayüzü elemanları v.b. olabilir. ActiveX bileşeni geliştirme işlemi nesneye yönelik programlamadan (OOP) yararlanarak yapılır. Nesneye yönelik programlama, nesne tabanlı bileşen yaratmada kullanılırken, ActiveX ise bu farklı biçimlerde ve ortamlarda yaratılmış nesnelerin birarada çalışmasını sağlar.
ActiveX bileşeni yaratmak için özellikler
ActiveX kod bileşenleri
Kod bileşenleri, nesne kütüphaneleri gibidir. Herhangi bir uygulama, kod bileşeninde tanımlı bir nesne sınıfından bir nesne tanımlayarak bu nesnenin özellik metot ve olaylarını kullanabilir. Bunlar OLE Otomasyon sunucuları olarak da adlandırılırlar.
Visual Basic kullanılarak üretilen kod bileşenleri iki biçimde olabilir. Bunlar iç-bileşen ve dış bileşen olarak adlandırılır. İç-bileşenler daha hızlıdır ve uygulama ile aynı bellek alanında işlem yaparlar. Dış-bileşenlerin işlem yaptıkları kendi bellek alanları vardır.
Kod bileşenleri kullanılarak bir çok dialog kutusu sunan bir kütüphane yapılabilir.
Ancak genellikle kod bileşenlerinin ayrı bir kullanıcı arabirimi yoktur.
Kod bileşenleri yukarıda da belirtildiği gibi iki farklı şekilde olabilir. Bunlar iç-bileşen veya dış-bileşenlerdir.
İç bileşenler
Bir iç bileşen, diğer bir deyişle ActiveX DLL, başka bir uygulamanın içinde, onun bir parçası olarak çalışır.
Avantajları:
Dezavantajları:
Dış bileşenler
Bir dış bileşen, diğer bir deyişle ActiveX EXE, tek başına kendi bellek alanında çalışır ve diğer uygulamalrın kendi nesnelerini kullanmasına izin verir.
Avantajları:
Dezavantajları:
7.2. VISUAL BASIC İLE NESNE YARATMA
Visual Basic ile bir nesne yaratmak için önce bir Class Module yaratılır. Class Module yapısı nesne sınıfları yaratmak için önemli kolaylıklar ve yollar sağlar. Şimdi bir nesnenin nasıl yaratılabileceğini ve kullanılabileceğini aşamalar halinde görelim.
1. Standart EXE türünde yeni bir proje başlatın ve adını Kredi olarak değiştirin.
2. Form1 formunun ismini frmKredi ve başlığını da KREDI ODEMELERI olarak değiştirin.
3. Projeye bir Class Module ekleyin ve ismini clsKredi olarak değiştirin.
4. Bu sınıf modülünün içine aşağıdaki kodu ekleyin.
Public Miktar As Currency
Public YillikFaiz As Single
Private Ay1 As Integer
Private Ba() As Currency
Property Let Aylar(ay)Ay1 = ay
End Property
Property Get Aylar()
Aylar = Ay1
End Property
Property Let Yillar(Y)
Ay1 = Y * 12
End Property
Property Get Yillar()
Yillar = Ay1 / 12
End Property
Property Get Odeme()
Dim AylikFaiz As Single
'Verify that all properties are loaded
If Miktar = 0 Or YillikFaiz = 0 Or Ay1 = 0 Then
Odeme = 0
Else
AylikFaiz = YillikFaiz / 1200
Odeme = (-AylikFaiz * Miktar) / _
((AylikFaiz + 1) ^ (-Ay1) - 1)
End If
End Property
Public Sub OdemeHesapla()
Dim i
Dim bakiye As Currency
Dim Odenen As Currency
ReDim Ba(0)
Ba(0) = Miktar
Odenen = CCur(Odeme / 100) * 100
Do Until Ba(i) <= 0
i = i + 1
ReDim Preserve Ba(i)
Ba(i) = Ba(i - 1) * (1 + YillikFaiz / 1200)
Ba(i) = Ba(i) - Odenen
Ba(i) = CCur(Ba(i) / 100) * 100
Loop
End Sub
Property Get bakiye(N)
If N > UBound(Ba) Or N < 1 Then
bakiye = 0
Else
bakiye = Ba(N)
End If
End Property
5. Bu sınıf tanımında kredi nesnesi için özellikler ve metotlar tanımlanmıştır. Bunu kullanmak için frmKredi formunun Form_Click olayına aşağıdaki kodu ekleyin.
Private Sub Form_Click()
Dim KrediTest As New clsKredi
Dim ay As Integer
Dim bakiye As Currency
'Set loan parameters
Me.Cls
KrediTest.Miktar = 180000000
KrediTest.Aylar = 12
KrediTest.YillikFaiz = 100
'Display parameters used
Print "Miktar: ", , Format(KrediTest.Miktar, "Currency")
Print "Ay sayisi: ", , KrediTest.Aylar
Print "Faiz: %", , Format(KrediTest.YillikFaiz _
/ 100, "Percent")
Print "Aylik Odeme: ", Format(KrediTest.Odeme, "Currency")
KrediTest.OdemeHesapla
Do
ay = ay + 1
bakiye = KrediTest.bakiye(ay)
If bakiye <= 0 Then Exit Do
Print "Ay: "; ay,
Print "Bakiye: "; Format(bakiye, "Currency")
Loop
End Sub
6. Eklenen bu kod ile formun üstüne mouse ile tıklandığında kredi geri ödemlerinin bir liste halinde form üzerinde gözükmesi sağlanır. Programın çalışması aşağıdaki gibidir.
Bu program alınan bir kredi için %100 faiz uygulayarak, 1 yıllık sabit ödeme miktarını ve bu ödeme biçiyle devam ederken kalan borç miktarını hesapmaktadır. Bunun için bir Kredi nesnesi kullanılmaktadır. Kredi nesnesinin OdemeHesapla metodu 12 aylık bakiye miktarlarını hesaplayıp bir dizi içine atmaktadır. Daha sonra kredi nesnesinin bakiye özelliği kullanılarak tüm aylar için bakiyeler hesaplanmakta ve form üzerine yazılmaktadır.
Bir nesne yaratılırken dikkat edilmesi gereken önemli
bir nokta da sahip olacağı özellik ve metotların belirlenmesidir. Çünkü nesneyi
kolay kullanılır ve verimli hale getiren sahip olduğu özellikler ve metotlardır.
7.3 ACTIVEX KOD BİLEŞENİ PROJELERİNİN TASARLANMASI VE GERÇEKLEŞTİRİMİ
7.3.1. DIŞ-BİLEŞENLER
ActiveX kod bileşenlerinden ayrı bir bellek alanında çalışan ve nesnelerini başka uygulamaların kullanmasına izin veren bileşenlere dış-bileşen denir. Bir uygulama, bir dış-bileşen nesnesinden bir iş yapmasını istediğinde ondan cevap beklemek zorunda değildir. İş bildirimi aktarılır ve uygulama kendi işine devam eder. Bu işleme zamanuyumsuz bildirim denir.
Şimdi bir ActiveX EXE projesinin gerçekleştirilmesini adımlar halinde gerçekleştirelim. Bu projede BIBLIO veritabanının PUBLISHERS tablosuna erişim için bir nesne oluşturulacak ve bu nesneyi başka uygulamaların kullanmasına olanak tanınacak.
Option Explicit
Private db As Database
Private rs As Recordset
Private yno As Long
Private yad As String
Private sad As String
Private adres As String
Private sehir As String
Private eyalet As String
Private pkodu As String
Private tel As String
Private faks As String
Private yorum As String
Public Enum hareket
ilk = 1
son = 2
birsonraki = 3
bironceki = 4
End Enum
Private Sub Class_Initialize()
Dim dosyaAdi As String
dosyaAdi = "d:\devstudio\vb\biblio.mdb"
Set db = DBEngine.Workspaces(0).OpenDatabase(dosyaAdi)
Set rs = db.OpenRecordset("select * from publishers" & _
" where (PubId < 100)", dbOpenDynaset, _
dbSeeChanges, dbOptimistic)
TutanakOku
End Sub
Private Sub Class_Terminate()
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
End Sub
Public Function AlanSay() As Integer
AlanSay = 10
End Function
Public Function AlanOku(alan As Integer) As Variant
Select Case alan
Case 0: AlanOku = yno
Case 1: AlanOku = yad
Case 2: AlanOku = sad
Case 3: AlanOku = adres
Case 4: AlanOku = sehir
Case 5: AlanOku = eyalet
Case 6: AlanOku = pkodu
Case 7: AlanOku = tel
Case 8: AlanOku = faks
Case 9: AlanOku = yorum
End Select
End Function
Public Property Get KutukBasi() As Boolean
KutukBasi = rs.BOF
End Property
Public Property Get KutukSonu()
KutukSonu = rs.EOF
End Property
Public Property Get TutanakSay() As Long
Dim bm As Variant
bm = rs.Bookmark
rs.MoveLast
TutanakSay = rs.RecordCount
rs.Bookmark = bm
End Property
Private Sub TutanakOku()
If Not IsNull(rs![PubId]) Then yno = rs![PubId]
If Not IsNull(rs![Name]) Then yad = rs![Name]
If Not IsNull(rs![Company Name]) Then sad = rs![Company Name]
If Not IsNull(rs![Address]) Then adres = rs![Address]
If Not IsNull(rs![City]) Then sehir = rs![City]
If Not IsNull(rs![State]) Then eyalet = rs![State]
If Not IsNull(rs![Zip]) Then pkodu = rs![Zip]
If Not IsNull(rs![Telephone]) Then tel = rs![Telephone]
If Not IsNull(rs![Fax]) Then faks = rs![Fax]
If Not IsNull(rs![Comments]) Then yorum = rs![Comments]
End Sub
Public Sub git(htur As hareket)
Select Case htur
Case ilk: rs.MoveFirst
Case son: rs.MoveLast
Case birsonraki: rs.MoveNext
Case bironceki: rs.MovePrevious
End Select
If Not (rs.EOF Or rs.BOF) Then TutanakOku
End Sub
Sub Main()
End Sub
Bu sınıf, BIBLIO.MDB veritabanının PUBLISHERS tablosunun ilk 100 tutanağını bir Recorset yapısına alıp, başka programların bu bilgilere erişmeleri için nesne tanımı yapmalarına olanak tanır.
Sub yayinevi()
Dim AlanSay As Long
Dim objYayinevi As Object
Set objYayinevi = CreateObject("yayinevi.clsYayinevi")
Dim i As Integer
Dim j As Integer
AlanSay = objYayinevi.AlanSay
Sheets.Add
ActiveSheet.Cells(1, 1).Select
Selection.FormulaR1C1 = "Yayinevi No"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 12
ActiveSheet.Cells(1, 2).Select
Selection.FormulaR1C1 = "Yayinevi Adi"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 30
ActiveSheet.Cells(1, 3).Select
Selection.FormulaR1C1 = "Sirketi"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 30
ActiveSheet.Cells(1, 4).Select
Selection.FormulaR1C1 = "Adresi"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 30
ActiveSheet.Cells(1, 5).Select
Selection.FormulaR1C1 = "Sehir"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 10
ActiveSheet.Cells(1, 6).Select
Selection.FormulaR1C1 = "Eyalet"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 7
ActiveSheet.Cells(1, 7).Select
Selection.FormulaR1C1 = "Posta Kodu"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 12
ActiveSheet.Cells(1, 8).Select
Selection.FormulaR1C1 = "Telefon"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 12
ActiveSheet.Cells(1, 9).Select
Selection.FormulaR1C1 = "Faks"
Selection.Font.FontStyle = "Bold"
Selection.HorizontalAlignment = xlCenter
Selection.ColumnWidth = 12
i = 0
objYayinevi.git (1)
Do While Not objYayinevi.KutukSonu
i = i + 1
For j = 0 To AlanSay - 2
ActiveSheet.Cells(i + 1, j + 1).Select
ActiveCell.FormulaR1C1 = objYayinevi.AlanOku(j)
Next j
objYayinevi.git (3)
Loop
ActiveSheet.Cells(1, 1).Select
Set objYayinevi = Nothing
End Sub
Bu makro içinde yapılan, bir kere çalıştırılıp windows için kaydı yapıldıktan sonra, ActiveX otomasyonunu destekleyen herhangi bir uygulama içinde kullanılabilir duruma gelen Yayınevi nesnesinin kullanımıdır.
Önce Alan isimleri Excel tablosunun birinci satırına yazılmaktadır.
Daha sonra bir döngü içinde yaratılan Yayınevi nesnesinin tüm tutanakları bu tablonun içine alanlarına göre yazılmaktadır.
7.3.2. İÇ-BİLEŞENLER
İç bileşenler, kullanıldıkları uygulama ile aynı bellek alanında çalışan nesneleri içeren kütüphanelerdir. İç bileşenler ActiveX DLL olarak adlandırılır.
Yukarıda verilen örneği bir iç bileşen olarak da gerçekleştirmek mümkündür.
Visual Basic ile ActiveX DLL oluşturmak, değişken tanımlamak veya yordam yazmak kadar kolaydır.
ActiveX DLL ile normal bir DLL arasındaki fark, ActiveX DLL kullanırken içindeki fonksiyonların tanımını yapma yerine içerdiği nesneleri ve fonksiyonları doğrudan kullanabilme olanağı sağlamasıdır.
Şimdi ActiveX DLL yaratma işlemini adımlar halinde bir örnek içinde açıklayalım.
Bu örnekte kesirli matematik işlemlerini yapan bir nesne sınıfının tanımı yapılacak ve bu nesnenin kullanımı açıklanacaktır.
Option Explicit
Public pay
Public payda
Public Sub ekle(pay1, payda1)
pay = pay * payda1 + payda * pay1
payda = payda * payda1
Indirge
End Sub
Public Sub Cikar(pay1, payda1)
pay = pay * payda1 - payda * pay1
payda = payda * payda1
Indirge
End Sub
Public Sub Carp(pay1, payda1)
pay = pay * pay1
payda = payda * payda1
Indirge
End Sub
Public Sub Carp(pay1, payda1)
pay = pay * payda1
payda = payda * pay1
Indirge
End Sub
Private Sub Indirge()
Dim s, t, u
s = Abs(pay)
t = Abs(payda)
If t = 0 Then Exit Sub
Do
u = (s \ t) * t
u = s - u
s = t
t = u
Loop While u > 0
pay = pay \ s
payda = payda \ s
If payda < 0 Then
pay = -pay
payda = -payda
End If
End Sub
Bu örnek kesirli sayılarla dört işlem yapmak için bir nesne sınıfı tanımlamakta ve bu nesne sınıfı ActiveX otomasyonunu destekleyen uygulamalar tarafından kullanılabilir.
Bu örneği test etmek için Standart EXE türünde yeni bir proje yaratın.
| Form | Name | frmKesir |
| TextBox | Name | Text1 ControlArray(0-5) |
| CommandButton | Name | Command1 ControlArray(0-3) |
Option Explicit
Public Kesir As New clsKesir
Private Sub Command1_Click(Index As Integer)
Cls
CurrentX = 1300
CurrentY = 350
FontSize = 30
Kesir.pay = Text1(0)
Kesir.payda = Text1(1)
Select Case Index
Case 0
Kesir.ekle Text1(2), Text1(3)
Print "+"
Case 1
Kesir.Cikar Text1(2), Text1(3)
Print "-"
Case 2
Kesir.Carp Text1(2), Text1(3)
CurrentY = CurrentY + 50
CurrentX = CurrentX + 50
FontSize = 25
Print "x"
Case 3
Kesir.Bol Text1(2), Text1(3)
CurrentY = CurrentY + 100
CurrentX = CurrentX + 100
FontSize = 25
Print "/"
Case Else
End Select
Text1(4) = Kesir.pay
Text1(5) = Kesir.payda
End Sub
Program çalıştırıldığında aşağıdaki form görüntüsü belirecektir. Burada iki kesiri yazın ve aşağıda sıralanmış işlem butonlarından birine basın. İşlem sonucu en sağdaki kesir içinde gözükecektir.
7.4. ACTIVEX KOD BİLEŞENLERİNİN TEST EDİLMESİ
ActiveX kod bileşenlerini test etmek için veya hatalarını ayıklamak için iki yol vardır.
Bu yollardan birincisi yukarıdaki ActiveX EXE ve ActiveX DLL örneklerinde yapılan işlemin aynıdır. Yukarıdaki projeler test aşamasında iken, örneğin ActiveX EXE programı, bu projeler kapatılmadan ve çalışır durumda bırakılarak içindeki nesneleri kullanmak mümkündür. Bu işlem, bileşenlerin windows için kaydı yapılmamışken yapılır. Böylece bileşenin doğru çalıştığından emin olunduktan windows kaydı yapılır.
ActiveX bileşenlerinin çalışıp çalışmadığını test etmek için şu ana kadar kullanılan yöntem birinci yöntemdir.
Şimdi yeni bir ActiveX bileşeni yaratalım ve ikinci yöntemi kullanarak bu bileşeni nasıl test edeceğimizi görelim.
Örneğin başkalarının da kullanabileceği, herhangi bir sisteme giriş için veya bir uygulamayı kullanan kullanıcıların denetlenmesi sırasında kullanılabilecek bir PASSWORD dialog kutusu tasarlayalım. Bu dialog kutusunun Kullanıcı Adı ve Kullanıcı Password’u adlı iki tane metin kutusu ve Tamam ve İptal adlı iki tane butonu olsun.
Şimdi bu projenin oluşturulmasını adımlar halinde gösterelim.
Buradaki nesnelerin
özelliklerini aşağıdaki gibi değiştirin.
| Form | Name | frmPass |
| TextBox | Name | txtKAd |
| TextBox | Name | txtPass |
| Passwordchar | * | |
| C.Button | Name | cmdTamam |
| Default | True | |
| C.Button | Name | cmdIptal |
| Cancel | True |
Property Get kullaniciAd()
kullaniciAd = frmPass.txtKAd
End Property
Property Get passWord()
passWord = frmPass.txtPass
End Property
Sub Gizle()
frmPass.Hide
End Sub
Sub Goster(sol As Long, ust As Long)
frmPass.Move sol, ust
frmPass.Show vbModal
End Sub
Private Sub Class_Initialize()
Load frmPass
End Sub
Private Sub Class_Terminate()
Unload frmPass
End Sub
Option Explicit
Private Sub cmdTamam_Click()
Hide Me
End Sub
Private Sub Iptal_Click()
txtKAd=""
txtPass=""
Hide Me
End Sub
Option Explicit
Dim objPass As New pass.passWord
Private Sub cmdPasswordAl_Click()
Dim kAd As String
Dim pass As String
Cls
CurrentX = 0
CurrentY = 2000
FontSize = 14
objPass.Goster frmPassTest.Left, frmPassTest.Top
kAd = "Kullanıcı Adı : " & objPass.kullaniciAd
Print kAd
pass = "Password : " & objPass.passWord
Print pass
End Sub
Bu dialog kutusundan da görüldüğü üzere yeni yaratılan ActiveX bileşeninin windows kaydı yapılmıştır. Artık ActiveX otomasyonunu destekleyen herhangi bir uygulama içinde bu bileşeni kullanmak mümkündür.
7.5. BİLEŞENLERİN İÇİNDE OLAY KULLANIMI.
ActiveX bileşenleri içinde tıpkı normal nesnelerde olduğu gibi olay tanımlamak mümkündür. Bunu örneklemek için kesir işlemleri için kullanılan daha önceki örnek üzerinde bir kısmı değişiklikler yapalım. KesirIslem.vbp projesini açın.
Public Event SIFIRABolme()
If payda = 0 Then RaiseEvent SIFIRABolme
Public WithEvents Kesir As clsKesir
Private Sub Form_Load()
Set Kesir = New clsKesir
End Sub
Private Sub Kesir_SIFIRABolme()
MsgBox "SIFIRA BOLME GERCEKLESTI", vbExclamation
End Sub
7.5. NESNELER İÇİN ARAYÜZ TANIMLAMA.
Visual Basic ile genel amaçlı yordam kütüphaneleri, yordamları sınıfın metotları olarak yazmakla gerçekleştirilebilir. Bunun için, Class Module özelliklerinden Instancing özelliği Private veya PublicNotCreatable değerleri dışında bir değer almalıdır.
Instancing özelliği için GlobalMultiUse değerini alırsa sınıf için bir nesne yaratmaya gerek kalmadan metotlarını kullanmak mümkündür.
Bunu kod ile örneklersek:
Instancing=MultiUse
Public Kesir As New clsKesir
Private Sub Topla()
Kesir.pay=10
Kesir.payda=20
Kesir.ekle(7,8)
End Sub
Bu kullanımda nesnenin yaratılması, metot ve özelliklerinin nesne değişkeni ile beraber kullanılması şarttır.
Instancing=GlobalMultiUse
Private Sub Topla()
pay=10
payda=20
ekle(7,8)
End Sub
Bu kullanımda ise, nesne özellikleri ve metotları doğrudan kullanılabilmektedir. Nesne özelliklerine ve metotlarına erişim olduğunda gizli bir nesne yaratılır. Bu nesne üzerinde işlemler gerçekleştirilir.
Global Nesne Arayüzleri ile ilgili öneriler ve sınırlamalar
Nesneler için arayüz tanımlanırken dikkat edilmesi gereken bir nokta da veri gizleme olanağının kullanılmasıdır. Nesne özelliklerini Public tanımlar kullanarak tanımlamaktansa Property Get ve Property Let yordamları yapmak daha kullanışlıdır. Bu şekilde nesne özelliklerinin alabileceği değerleri kontrol etmek, bazı özelliklerinin sadece yazılabilir olmasını sağlamak ve bazı özelliklerin sadece okunabilir olmasını sağlamak mümkündür.
Nesnelerin içsel olarak kullandıkları yordamlar Private olarak tanımlanmalıdır.
Arayüzler için şu kurallara uyulmalıdır:
Bir sınıfın metotları, özellikleri ve olayları için seçilen adlar sınıftan yaratılacak nesne için arayüz oluşturur. Bu arayüzler tanımlanırken aşağıdaki kurallara uyulmalıdır.
7.6. KOD BİLEŞENLERİNİN DİĞER ÖZELLİKLERİ.
Friend Property Let Demo(NewDemo As udtDemo)
mDemo = NewDemo
End Property
Friend Sub SetDemoParts(ByVal A As Integer, _
ByVal B As Long, ByVal C As String)
mDemo.intA = A
mDemo.lngB = B
mDemo.strC = C
End Sub