8. ACTIVEX KONTROL NESNESİ YARATMA
Bu bölümde adımlar halinde ActiveX koontrol nesnelerinin nasıl yaratıldığı işlenecektir.
ActiveX kontrol nesneleri Visual Basic araç kutusuna yerleştirilebilen ve Visual Basic programının bir parçası olmayan, uygulama geliştirirken uygulamalar içinde kullanılabilen nesnelerdir.
Bir ActiveX kontrol nesnesini diğer kontrol nesneleri gibi kullanmak mümkündür. Daha önce kullanmış olduğumuz ActiveX Data Bound kontrol nesneleri buna bir örnek olarak verilebilir.
ActiveX Kontrol nesneleri programların daha kolay yapılabilmesini, daha esnek olmasını ve daha işlevsel olmasını sağlar. Bu kontrol nesnelerinin özellikleri, metotları ve olayları kendi belirlediğimiz durumları karşılayacak şekilde tasarlandığı için programın bize özgü yapı taşları görevini görürler.
Bir ActiveX kontrol nesnesi UserControl nesnesi ve bunun içine konacak olan birtakım kontrol nesnesinden oluşur.
Visual Basic kullanarak ActiveX kontrol nesnesi yaratmak için üç yol vardır.
Bu yollardan ikincisi en basit olanıdır. Tek yapılması gereken var olan konrol nesnesini UserControl üzerine yerleştirip buna bazı işlevsellikler eklemektir. İlkinde kontrol nesnesinin çizimi de dahil, tasarımı, olayları, metotları kullanıcı tarafından gerçekleştirilir.
ActiveX control nesnesinin yaratılması
Visual Basic Add-Ins menüsünden kullanılabilecek olan ActiveX Control Interface Wizard sihirbazı var olan kontrol nesnelerine dayanan yeni kontrol nesneleri yaratmaya olanak tanır. Fakat başlangıç için bu sihirbazın yarattığı kodu incelemek biraz zor ve karmaşık gelebilir. Bu yüzden önce bir ActiveX kontrol nesnesinin nasıl yaratıldığını görelim.
ActiveX kontrol nesnesi yaratmanın adımları:
Örnek: ActiveX kontrol nesnesi yaratma.
Yukarıda genel olarak adımlar halinde belirtilen işlemi yine adımlar halinde gerçekleştirelim.
Bir ActiveX nesnesinin tasarım aşamasında tetiklenen olayları, çalışan bir kesimi vardır. Bu olaylardan biri de Resize olayıdır. Tasarım sırasında kontrol nesnesinin boyutları değiştiğinde bu olay tetiklenir. Bunu denemek için:
Private Sub UserControl_Resize()
Static i As Integer
i = i + 1
Debug.Print "Boyutlandırma" & i
End Sub
Şimdi yeni butonun üç boyutlu görünümünü gerçekleştirmek için aşağıdaki işlemleri gerçekleştirin.
| Line | Name | Line1 |
| BorderColor | &H00808080& | |
| BorderWidth | 2 | |
| X1 | 1560 | |
| X2 | 1560 | |
| Y1 | 60 | |
| Y2 | 400 | |
| Line | Name | Line2 |
| BorderColor | &H00E0E0E0& | |
| BorderWidth | 2 | |
| X1 | 20 | |
| X2 | 20 | |
| Y1 | 0 | |
| Y2 | 400 | |
| Line | Name | Line2 |
| BorderColor | &H00808080& | |
| BorderWidth | 2 | |
| X1 | 40 | |
| X2 | 1560 | |
| Y1 | 405 | |
| Y2 | 405 | |
| Line | Name | Line4 |
| BorderColor | &H00E0E0E0& | |
| BorderWidth | 2 | |
| X1 | 0 | |
| X2 | 1560 | |
| Y1 | 20 | |
| Y2 | 20 |
Bir UserControl nesnesinin temel olayları
Bir UserControl nesnesinin yaşamı bir form üzerine yerleştirlmesiyle başlar ve formdan silinince yok olur. Bu yaşamı boyunca oluşan olayların ne zaman oluştuğunu bilmek önemlidir. Bu olayları görmek için:
Private Sub UserControl_Initialize()
Debug.Print "Initialize"
End Sub
Private Sub UserControl_InitProperties()
Debug.Print "Init properties"
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Debug.Print "Read Properties"
End Sub
Private Sub UserControl_Terminate()
Debug.Print "Terminate"
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Debug.Print "Write Properties"
End Sub
Initialize
Read Properties
Boyutlandırma1
Update User Control seçeneği form üzerindeki kontrol nesnesini siler ve yerine aynı boyutlarda yeni bir tane yaratır. Bu yazılar kontrol nesnesinin yaratılması sırasında oluşan olayları belirtmektedir.
Write Properties
Terminate
Initialize
Read Properties
Boyutlandırma1
Şimdi bütün bu olayların ne zaman oluştuğunu özetleyelim.
Initialize: Kontrol nesnesi her yaratıldığında(tasarım veya çalışma zamanında) oluşan ilk olaydır.
InitProperties: Bir kontrol nesnesi yaratıldığında, bazı özelliklerine ilk değer atamak için kullanılır.
Read Properties: Kontrol nesnesinin bir olgusu yaratıldığında oluşur.
Resize: Kontrol nesnesi yeniden boyutlandırıldığında oluşur.
Paint: Kontrol nesnesi form üzerinde kendisini gösterdiğinde oluşur.
Write Properties: Tasarım zamanı nesnesi silindiğinde oluşur. Özelliklerdeki değişimleri kaydetmek için kullanılır.
Yukarıda da belirtildiği gibi kontrol nesnesi yeniden boyutlandırıldığında çizgilerin ortada kaldığı görünmektedir. Bunu önlemek için Resize olayının kodunu aşağıdaki gibi değiştirin.
Private Sub UserControl_Resize()
Line1.X1 = scalewidht - 20
Line1.X2 = ScaleWidth - 20
Line1.Y2 = ScaleHeight
Line2.Y2 = ScaleHeight
Line3.X2 = ScaleWidth - 40
Line3.Y1 = ScaleHeight - 20
Line3.Y2 = ScaleHeight - 20
Line4.X2 = ScaleWidth - 40
End Sub
Yani durumuyla, yeniden boyutlandırma sırasında herhangi bir sorun olmadığı, üç boyutlu görünüşün devam ettiği görülür.
Kontrol Nesnesine bir Caption özelliği ekleme
Kontrol nesnesine Caption özelliği eklemek için bir etiket eklemek gerekir. Etiketin özellikleri dikkatli belirlenmelidir. Çünkü tasarımın güzel olması bu özelliklerin uygun olarak seçilmesine bağlıdır. Şimdi aşağıdaki adımları izleyerek bir Caption özelliğinin nasıl eklendiğini görelim.
| Label | Name | lblCaption |
| Alignment | Center | |
| Autosize | True | |
| Font | Times New Roman-10-Tur. | |
| ForeColor | White | |
| BackStyle | Transparent | |
| Caption | ||
| WordWrap | True |
Public Property Get Caption() As String
Caption = lblCaption.Caption
End Property
Public Property Let Caption(vNewValue As String)
lblCaption.Caption = vNewValue
End Property
Tasarım zamanındaki özelliklerin çalışma zamanına aktarılması için UserControl nesnesinin iki olayı kullanılır. Bunlar ReadProperties ve WriteProperties olaylarıdır. Kod penceresini açın ve tüm Debug.Print deyimlerini kaldırın. Aşağıdaki kodu ekleyin.
Private Sub UserControl_InitProperties()
Caption = Extender.Name
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Caption = PropBag.ReadProperty("Caption", Extender.Name)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Caption", Caption, Extender.Name
End Sub
Buradaki ilk yordamda Caption özelliğine ilkdeğer atama işlemi yapılmaktadır. Diğer yordamlar ise özelliklerin PropBag adı verilen ve özelliklerin değerini tutan özel bir veri yapısı içine özellik değerlerinin yazılması ve oradan özellik değerlerinin okunması için kullanılmaktadır.
UserControl nesnesine yapılması gereken bir diğer ek ise Caption değerinin nesne üzerinde ortalı görünmesini sağlamak olmalıdır. Bunun için aşağıdaki satırı Resize olayına ekleyin.
lblCaption.Move (ScaleWidth - lblCaption.Width) / 2, _
(ScaleHeight - lblCaption.Height) / 2
Proje bu haliyle çalıştırıldığında Caption özelliğinin artık doğru çalıştığı görülecektir.
Burada kullanılan Extender nesnesi UserControl nesnesinin ilk yaratıldığı anda sahip olduğu özellikleri, olayları ve metotları içerir. Bu nesne UserControl nesnesinin ilkel halidir. Tanımlı olan bir başka nesne ise Ambient nesnesidir. Bu nesne ise kontrol nesnesinin içine konduğu formu belirtir.
UserControl nesnesinin olayları
Usercontrol nesnesi için tanımlanmış bir çok olay vardır. Bu olayların yaratılacak kontrol nesnesi için geçerli olabilmesi için bir biçimde dışarıya gönderilmesi gerekir. Bu işleme olay tanımlama denir.
Şimdi UserControl nesnesinin olaylarının nasıl kullanılacağını görelim. Bunun için butona basıldığını belirten içe göçme işlemini gerçekleştirelim.
Aşağıdaki kodu UserControl kod kesimine ekleyin.
Private ArkaRenk As Long
Const ISIKLI = &HE0E0E0
Const GOLGELI = &H808080
Private Sub BASILI()
ArkaRenk = BackColor
Line1.BorderColor = ISIKLI
Line2.BorderColor = GOLGELI
Line3.BorderColor = ISIKLI
Line4.BorderColor = GOLGELI
BackColor = &HFFFFFF - BackColor
End Sub
Private Sub SERBEST()
BackColor = ArkaRenk
Line1.BorderColor = GOLGELI
Line2.BorderColor = ISIKLI
Line3.BorderColor = GOLGELI
Line4.BorderColor = ISIKLI
End Sub
Private Sub UserControl_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
BASILI
End Sub
Private Sub UserControl_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
SERBEST
End Sub
Private Sub lblCaption_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
BASILI
End Sub
Private Sub lblCaption_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
SERBEST
End Sub
Burada dikkat edilmesi gereken BASILI ve SERBEST yordamlarının hem UserControl ve hem de lblCaption için çağrıldığıdır.
Progragram çalıştırıldığında içe göçme olayının gerçekleştiği görülecektir.
UserControl nesnesi için olay tanımlama
Bir UserControl nesnesine olay eklemek çok basittir. Daha önce ActiveX DLL nesnesi içindeki olay tanımının aynıdır. Şimdi UserControl nesnesinin kod penceresini açın ve aşağıdaki tanımı Declarations kesimine ekleyin.
Public Event Click()
Şimdi yapılması gereken bu olayın ne zaman ortaya çıkacağına karar vermektir. Bu olay, UserControl nesnesinin ve lblCaption nesnesinin Click olayları oluştuğunda ortaya çıkacaktır. Bunun için aşağıdaki kodu UserControl nesnesine ekleyin.
Private Sub lblCaption_Click()
RaiseEvent Click
End Sub
Private Sub UserControl_Click()
RaiseEvent Click
End Sub
Bu olayları test etmek için UserControl tasarım penceresini kapatın. Formun kod kesimine aşağıdaki kodu ekleyin.
Private Sub yButon1_Click()
MsgBox "BASTIGINIZ IÇIN" & vbCrLf & " TESEKKURLER " & _
yButon1.Caption
End Sub
Private Sub yButon2_Click()
MsgBox "BASTIGINIZ IÇIN" & vbCrLf & " TESEKKURLER " & _
yButon2.Caption
End Sub
Program çalıştırılıp üzerine yerleştirilmiş olan butonlara basıldığında bir mesaj kutusu ile basıldığı bilgisi kullanıcıya gösterilmektedir. Böylece kullanıcıya UserControl nesnesi için olay tanımlama ve bu olayı kullanabilme olanağı tanınmış olduğu görülmektedir.
UserControl nesnesine Property Page ekleme
Property yordamları kullanarak tanımlanan özellikler, kontrol nesnesi bir form üzerine yerleştirilip seçili duruma getirildiğine Properties penceresinde görünürler. Ayrıca kendi yarattığımız kontrol nesnelerinde bu özellikleri toplu olarak, bir dialog kutusu yardımıyla değiştirebilme olanağı da vardır. Bu dialog kutularına Property Page denir. Bunlara örnek olarak, CommonDialog kontrol nesnesinin (Custom) adlı özelliğini kullanarak çıkan Property Page verilebilir. Bu dialog kutusu incelendiğinde, içinde bir çok sekme bulunan bir dialog kutusu olduğu görülür.
Kontrol nesnesine eklenen her Property Page, Property Page dilog kutusuna bir sekme olarak eklenir. Bu dialog kutusundaki Ok, Cancel, Apply butonları ve sekmeli yapı Visual Basic tarafından otomatik olarak sağlanır.
Bir kontrol nesnesine Property Page eklemek için aşağıdaki adımlar takip edilmelidir.
Şimdi bu adımları örneğimiz üzerinde adımlar halinde uygulayalım.
PropertyPage Name YBGenel Caption Genel TextBox Name txtCaption Label Name Label1 Caption Caption
Private Sub PropertyPage_ApplyChanges()
Dim obj As Variant
For Each obj In SelectedControls
obj.Caption = txtCaption
Next
End Sub
Private Sub PropertyPage_SelectionChanged()
txtCaption = SelectedControls(0).Caption
End Sub
Private Sub txtCaption_Change()
Changed = True
End Sub
Bu kodda, ilk yordam yapılan değişiklikleri uygular, ikinci yordam şu andaki Caption değerini metin kutusuna alır, son yordam isi Property Page üzerindeki Apply butonunun aktif hale gelmesini sağlar.
4. Adımda Property Page (Özellik Sayfası) ilişkilendirme işlemi yapılırken görüldüğü üzere standart bazı özellik sayfaları bulunmaktadır. Bunları eklemek için tek yapılması gereken önlerine işaret koymaktır. Bu işlem yapılmadan önce yapılması gereken standart özellik sayfalarının kullanacağı özelliklerin yaratılmasıdır.
Şimdi Arka Plan Rengini belirleyen bir özellik tanımlayıp bunun için Özellik Sayfası kullanma işlemini adımlar halinde görelim.
Public Property Get ARenk() As OLE_COLOR
ARenk = UserControl.BackColor
End Property
Public Property Let ARenk(ByVal yRenk As OLE_COLOR)
UserControl.BackColor = yRenk
PropertyChanged "ARenk"
End Property
* ARenk= RGB(192, 192, 192) (InitProperties)
* ARenk = PropBag.ReadProperty("ARenk", RGB(192, 192, 192))
* PropBag.WriteProperty "ARenk", ARenk, RGB(192, 192, 192)
Böylece artık iki tane yeni özellik ve iki tane Özellik sayfası eklenmiş oldu. Görüldüğü gibi özellik sayfaları özelliklere değer ekleme sırasında çok kullanışlı bir ortam sunmaktadır.
Control Interface Wizard kullanarak kontrol yaratma
Şu ana kadar kontrol nesnesi yaratmanın aşamaları adım adım anlatıldı. Kontrol nesnesi yaratma, özellik, metot ve olay ekleme işlemleri fazla karmaşık olmayan fakat detaylı işlemlerdir. Bu detaylardan biri unutulduğunda kontrol nesnesi doğru çalışmayabilir.
Kontrol yaratmak için kullanılan Control Interface Wizard, kontrol yaratımının herhangi bir aşamasında devreye konabilir. Örneğin yukarıda yapıldığı gibi kontrol nesnesinin genel tasarımı bittikten sonra bazı otomatikleşmiş işlemlerin yapılması için faydalı olabilir. Şimdi yukarıdaki kontrol nesnesinin iyileştirilmesi, başka özellikler eklenmesi için Control Interface Wizard kullanımı örneklenecektir.
Public Name Control Member Arenk (none) Caption (none) CiftTIK (none) Font lblCaption Font FontBoyu lblCaption FontSize ItalikFont lblCaption FontItalic KoyuFont lblCaption FontBold Orenk lblCaption ForeColor Resim UserControl Picture Secili UserControl Enabled TIK (none)
Burada Arenk, Caption, CiftTIK ve TIK isimleri hiç bir olayla veya özellikle ilişkilendirilmemiştir. Bunlar birden fazla kontrol nesnesini ilgilendirmektedir.
Option Explicit
Private ArkaRenk As Long
Const ISIKLI = &HE0E0E0
Const GOLGELI = &H808080
'Event Declarations:
Event TIK()
Event CiftTIK()
Private Sub BASILI()
ArkaRenk = BackColor
Line1.BorderColor = ISIKLI
Line2.BorderColor = GOLGELI
Line3.BorderColor = ISIKLI
Line4.BorderColor = GOLGELI
BackColor = &HFFFFFF - BackColor
End Sub
Private Sub SERBEST()
BackColor = ArkaRenk
Line1.BorderColor = GOLGELI
Line2.BorderColor = ISIKLI
Line3.BorderColor = GOLGELI
Line4.BorderColor = ISIKLI
End Sub
Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
BASILI
End Sub
Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
SERBEST
End Sub
Private Sub lblCaption_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
BASILI
End Sub
Private Sub lblCaption_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
SERBEST
End Sub
Private Sub UserControl_InitProperties()
Caption = Extender.Name
ARenk = RGB(192, 192, 192)
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Caption = PropBag.ReadProperty("Caption", Extender.Name)
ARenk = PropBag.ReadProperty("ARenk", RGB(192, 192, 192))
Secili = PropBag.ReadProperty("Secili", True)
KoyuFont = PropBag.ReadProperty("KoyuFont", 0)
ItalikFont = PropBag.ReadProperty("ItalikFont", 0)
FontADI = PropBag.ReadProperty("FontADI", "Times New Roman")
FontBoyu = PropBag.ReadProperty("FontBoyu", 10)
ORenk = PropBag.ReadProperty("ORenk", &H80000007)
Set Resim = PropBag.ReadProperty("Resim", Nothing)
Set Font = PropBag.ReadProperty("Font", lblCaption.Font)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Caption", Caption, Extender.Name
PropBag.WriteProperty "ARenk", ARenk, RGB(192, 192, 192)
PropBag.WriteProperty "Secili", Secili, True
PropBag.WriteProperty "KoyuFont", KoyuFont, 0
PropBag.WriteProperty "ItalikFont", ItalikFont, 0
PropBag.WriteProperty "FontADI", FontADI, "Times New Roman"
PropBag.WriteProperty "FontBoyu", FontBoyu, 10
PropBag.WriteProperty "ORenk", ORenk, &H80000007
PropBag.WriteProperty "Resim", Resim, Nothing
PropBag.WriteProperty "Font", Font, lblCaption.Font
End Sub
Private Sub UserControl_Resize()
Line1.X1 = ScaleWidth - 20
Line1.X2 = ScaleWidth - 20
Line1.Y2 = ScaleHeight
Line2.Y2 = ScaleHeight
Line3.X2 = ScaleWidth - 40
Line3.Y1 = ScaleHeight - 20
Line3.Y2 = ScaleHeight - 20
Line4.X2 = ScaleWidth - 40
lblCaption.Move (ScaleWidth - lblCaption.Width) / 2, _
(ScaleHeight - lblCaption.Height) / 2
End Sub
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=UserControl,UserControl,-1,Enabled
Public Property Get Secili() As Boolean
Secili = UserControl.Enabled
End Property
Public Property Let Secili(ByVal New_Secili As Boolean)
UserControl.Enabled() = New_Secili
PropertyChanged "Secili"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=lblCaption,lblCaption,-1,FontBold
Public Property Get KoyuFont() As Boolean
KoyuFont = lblCaption.FontBold
End Property
Public Property Let KoyuFont(ByVal New_KoyuFont As Boolean)
lblCaption.FontBold() = New_KoyuFont
PropertyChanged "KoyuFont"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=lblCaption,lblCaption,-1,FontItalic
Public Property Get ItalikFont() As Boolean
ItalikFont = lblCaption.FontItalic
End Property
Public Property Let ItalikFont(ByVal New_ItalikFont As Boolean)
lblCaption.FontItalic() = New_ItalikFont
PropertyChanged "ItalikFont"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=lblCaption,lblCaption,-1,FontName
Public Property Get FontADI() As String
FontADI = lblCaption.FontName
End Property
Public Property Let FontADI(ByVal New_FontADI As String)
lblCaption.FontName() = New_FontADI
PropertyChanged "FontADI"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=lblCaption,lblCaption,-1,FontSize
Public Property Get FontBoyu() As Single
FontBoyu = lblCaption.FontSize
End Property
Public Property Let FontBoyu(ByVal New_FontBoyu As Single)
lblCaption.FontSize() = New_FontBoyu
PropertyChanged "FontBoyu"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=lblCaption,lblCaption,-1,ForeColor
Public Property Get ORenk() As OLE_COLOR
ORenk = lblCaption.ForeColor
End Property
Public Property Let ORenk(ByVal New_ORenk As OLE_COLOR)
lblCaption.ForeColor() = New_ORenk
PropertyChanged "ORenk"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=UserControl,UserControl,-1,Picture
Public Property Get Resim() As Picture
Set Resim = UserControl.Picture
End Property
Public Property Set Resim(ByVal New_Resim As Picture)
Set UserControl.Picture = New_Resim
PropertyChanged "Resim"
End Property
Private Sub lblCaption_Click()
RaiseEvent TIK
End Sub
Private Sub lblCaption_DblClick()
RaiseEvent CiftTIK
End Sub
Private Sub UserControl_Click()
RaiseEvent TIK
End Sub
Private Sub UserControl_DblClick()
RaiseEvent CiftTIK
End Sub
Public Property Get ARenk() As OLE_COLOR
ARenk = ArkaRenk
End Property
Public Property Let ARenk(ByVal New_ARenk As OLE_COLOR)
ArkaRenk = New_ARenk
PropertyChanged "ARenk"
End Property
Public Property Get Caption() As String
Caption = lblCaption.Caption
End Property
Public Property Let Caption(ByVal New_Caption As String)
lblCaption.Caption = New_Caption
PropertyChanged "Caption"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=lblCaption,lblCaption,-1,Font
Public Property Get Font() As Font
Set Font = lblCaption.Font
End Property
Public Property Set Font(ByVal New_Font As Font)
Set lblCaption.Font = New_Font
PropertyChanged "Font"
End Property
Bu kodda yapılan değişiklikler, ReadProperties ve WriteProperties olay yordamları ile var olan özellik yordamlarında yapılmıştır. Koda yapılan eklemeler ise olayların yaratılması için eklenen kodlardır.
Kontrol nesnesini test etmeden önce Properties penceresinden Property Pages özelliğini kullanarak var olan tüm standart özellik sayfalarını seçin.
FrmYBtn formunu seçin. Update User Controls seçeneğini kullanarak kontrol nesnelerini günleyin. (Custom) özelliğini kullanarak özellik sayfalarını çıkarın ve özellikleri değiştirin.
Yeni butonun çalışmasının tam olduğu görülmektedir. Şimdi yapılması gereken bu butonun başka yerlere taşınmasını sağlamaktır.
Kontrol Nesnesinin derlenmesi ve dağıtılması
Kontrol nesnesini kullanıma hazır hale getirmeden önce bir kaç ekleme daha yapmak gerekmektedir.
devstudio\vb\graphics\bitmap\assorted\DIAMONDS.BMP resmini seçin.
Option Explicit
Private Sub yButon1_TIK()
CurrentY = 3000
Print "yButon1 nesnesi TIKLANDI"
End Sub
Kontrol nesnesi artık tam çalışır ve dağıtılmaya hazır durumdadır. Kontrol nesnesinin dağıtımını yapmak için Application Setup Wizard programı kullanılır. Bu sihirbazı kullanarak kontrolü ve gereksindiği dosyaları bir paket haline getirmek mümkündür.
Bir kontrol nesnesini Lisanslı yapmak için Project menüsünden Properties seçeneğini seçin. Çıkan dialog kutusundan Require Licence Key seçeneğini seçin.
Lisans özelliği eklenmiş bir kontrol nesnesi için dağıtım paketi hazırlanırken, .VBL diye bir dosya yaratılır. Bu dosya olmadan kontrol nesnesi çalışamaz duruma getirilir.
Veritabanı ile ilişkilendirilebilir kontrol nesneleri yaratma
Bu örnek için daha önce kullandığımız PERSONEL veritabanının MESLEKLER tablosuna bir kaç tane tutanak ekleyin.
Aşağıdaki adımları izleyin.
Project1 dbComboProj
UserControl dbCombo
ComboBox cmbDeger
Property objVT
Property strAlan
Property strTablo
Method Yukle
| Eleman | Veri Türü | Çalışma zamanı | Tasarım zamanı |
| objVT | Object | Write Only | Not Available |
| strAlan | String | Read/Write | Read/Write |
| strTablo | String | Read/Write | Read/Write |
Private Sub UserControl_Resize()
Height = cmbDeger.Height
cmbDeger.Top = 0
cmbDeger.Left = 0
cmbDeger.Width = ScaleWidth
End Sub
Public Property Let Text(ByVal New_Text As String)
If CanPropertyChange("Text") Then
cmbDeger.Text() = New_Text
PropertyChanged "Text"
End If
End Property
Public Property Set objVT(ByVal New_objVT As Object)
Set m_objVT = New_objVT
PropertyChanged "objVT"
If "" <> strAlan And "" <> strTablo Then Call Yukle
End Property
Bu kod eğer tablo ve alan adı belirtilmemişse yükleme işlemini yapmayı engeller.
Public Sub Yukle()
Dim strSql As String
Dim rs As Recordset
cmbDeger.Clear
strSql = "SELECT " & strAlan & " FROM " & strTablo & _
" ORDER BY " & strAlan
Set rs = objVT.OpenRecordset(strSql, _
vbRSTypeSnapShot, dbForwardOnly)
Do While Not rs.EOF
cmbDeger.AddItem "" & rs(strAlan)
rs.MoveNext
Loop
rs.Close
End Sub
Burada yazılan kod verilen alandaki tüm değerleri Combo Box içine ekler.
Private Sub Form_Load()
Data1.DatabaseName = App.Path & "\personel.mdb"
Data1.Refresh
Set dbCombo1.objVT = Data1.Database
End Sub
Bu kodda yapılan dbCombo1 nesnesinin objVT özelliğine Data1 nesnesinin Database özelliğini aktarmaktır. Bu yapıldığında dbCombo1 nesnesinin Property Set objVT özellik yordamı çalışacak ve tablodaki meslek isimleri Combo Box içine yerleştirilecektir.
Programın çalışması aşağıdaki gibi olacaktır.
Control nesnesinin tam kodu aşağıdaki gibidir.
Option Explicit
'Default Property Values:
Const m_def_strAlan = ""
Const m_def_strTablo = ""
'Property Variables:
Dim m_objVT As Object
Dim m_strAlan As String
Dim m_strTablo As String
'Event Declarations:
Event Click() 'MappingInfo=cmbDeger,cmbDeger,-1,Click
Event DblClick() 'MappingInfo=cmbDeger,cmbDeger,-1,DblClick
Event KeyDown(KeyCode As Integer, Shift As Integer) 'MappingInfo=cmbDeger,cmbDeger,-1,KeyDown
Event KeyPress(KeyAscii As Integer) 'MappingInfo=cmbDeger,cmbDeger,-1,KeyPress
Event KeyUp(KeyCode As Integer, Shift As Integer) 'MappingInfo=cmbDeger,cmbDeger,-1,KeyUp
Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseDown
Event MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseMove
Event MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseUp
Event Change() 'MappingInfo=cmbDeger,cmbDeger,-1,Change
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,BackColor
Public Property Get BackColor() As OLE_COLOR
BackColor = cmbDeger.BackColor
End Property
Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
cmbDeger.BackColor() = New_BackColor
PropertyChanged "BackColor"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,ForeColor
Public Property Get ForeColor() As OLE_COLOR
ForeColor = cmbDeger.ForeColor
End Property
Public Property Let ForeColor(ByVal New_ForeColor As OLE_COLOR)
cmbDeger.ForeColor() = New_ForeColor
PropertyChanged "ForeColor"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,Enabled
Public Property Get Enabled() As Boolean
Enabled = cmbDeger.Enabled
End Property
Public Property Let Enabled(ByVal New_Enabled As Boolean)
cmbDeger.Enabled() = New_Enabled
PropertyChanged "Enabled"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,Font
Public Property Get Font() As Font
Set Font = cmbDeger.Font
End Property
Public Property Set Font(ByVal New_Font As Font)
Set cmbDeger.Font = New_Font
PropertyChanged "Font"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=UserControl,UserControl,-1,BackStyle
Public Property Get BackStyle() As Integer
BackStyle = UserControl.BackStyle
End Property
Public Property Let BackStyle(ByVal New_BackStyle As Integer)
UserControl.BackStyle() = New_BackStyle
PropertyChanged "BackStyle"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=UserControl,UserControl,-1,BorderStyle
Public Property Get BorderStyle() As Integer
BorderStyle = UserControl.BorderStyle
End Property
Public Property Let BorderStyle(ByVal New_BorderStyle As Integer)
UserControl.BorderStyle() = New_BorderStyle
PropertyChanged "BorderStyle"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,Refresh
Public Sub Refresh()
cmbDeger.Refresh
End Sub
Private Sub cmbDeger_Click()
RaiseEvent Click
PropertyChanged "Text"
End Sub
Private Sub cmbDeger_DblClick()
RaiseEvent DblClick
End Sub
Private Sub cmbDeger_KeyDown(KeyCode As Integer, Shift As Integer)
RaiseEvent KeyDown(KeyCode, Shift)
End Sub
Private Sub cmbDeger_KeyPress(KeyAscii As Integer)
RaiseEvent KeyPress(KeyAscii)
End Sub
Private Sub cmbDeger_KeyUp(KeyCode As Integer, Shift As Integer)
RaiseEvent KeyUp(KeyCode, Shift)
End Sub
Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseDown(Button, Shift, X, Y)
End Sub
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseMove(Button, Shift, X, Y)
End Sub
Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseUp(Button, Shift, X, Y)
End Sub
Private Sub cmbDeger_Change()
PropertyChanged "Text"
End Sub
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,ListCount
Public Property Get ListCount() As Integer
ListCount = cmbDeger.ListCount
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,ListIndex
Public Property Get ListIndex() As Integer
ListIndex = cmbDeger.ListIndex
End Property
Public Property Let ListIndex(ByVal New_ListIndex As Integer)
cmbDeger.ListIndex() = New_ListIndex
PropertyChanged "ListIndex"
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,Style
Public Property Get Style() As Integer
Style = cmbDeger.Style
End Property
'DİKKAT! AŞAĞIDAKİ SATIRLARI DEĞİŞTİRMEYİN VEYA SİLMEYİN …
'MappingInfo=cmbDeger,cmbDeger,-1,Text
Public Property Get Text() As String
Text = cmbDeger.Text
End Property
Public Property Let Text(ByVal New_Text As String)
If CanPropertyChange("Text") Then
cmbDeger.Text() = New_Text
PropertyChanged "Text"
End If
End Property
Public Property Get objVT() As Object
Set objVT = m_objVT
End Property
Public Property Set objVT(ByVal New_objVT As Object)
Set m_objVT = New_objVT
PropertyChanged "objVT"
If "" <> strAlan And "" <> strTablo Then Call Yukle
End Property
Public Property Get strAlan() As String
strAlan = m_strAlan
End Property
Public Property Let strAlan(ByVal New_strAlan As String)
m_strAlan = New_strAlan
PropertyChanged "strAlan"
End Property
Public Property Get strTablo() As String
strTablo = m_strTablo
End Property
Public Property Let strTablo(ByVal New_strTablo As String)
m_strTablo = New_strTablo
PropertyChanged "strTablo"
End Property
Public Sub Yukle()
Dim strSql As String
Dim rs As Recordset
cmbDeger.Clear
strSql = "SELECT " & strAlan & " FROM " & strTablo & _
" ORDER BY " & strAlan
Set rs = objVT.OpenRecordset(strSql, _
vbRSTypeSnapShot, dbForwardOnly)
Do While Not rs.EOF
cmbDeger.AddItem "" & rs(strAlan)
rs.MoveNext
Loop
rs.Close
End Sub
'Initialize Properties for User Control
Private Sub UserControl_InitProperties()
m_strAlan = m_def_strAlan
m_strTablo = m_def_strTablo
End Sub
'Load property values from storage
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
cmbDeger.BackColor = PropBag.ReadProperty("BackColor", &H80000005)
cmbDeger.ForeColor = PropBag.ReadProperty("ForeColor", &H80000008)
cmbDeger.Enabled = PropBag.ReadProperty("Enabled", True)
Set Font = PropBag.ReadProperty("Font", Ambient.Font)
UserControl.BackStyle = PropBag.ReadProperty("BackStyle", 1)
UserControl.BorderStyle = PropBag.ReadProperty("BorderStyle", 0)
cmbDeger.ListIndex = PropBag.ReadProperty("ListIndex", -1)
cmbDeger.Text = PropBag.ReadProperty("Text", "Combo1")
Set m_objVT = PropBag.ReadProperty("objVT", Nothing)
m_strAlan = PropBag.ReadProperty("strAlan", m_def_strAlan)
m_strTablo = PropBag.ReadProperty("strTablo", m_def_strTablo)
End Sub
Private Sub UserControl_Resize()
Height = cmbDeger.Height
cmbDeger.Top = 0
cmbDeger.Left = 0
cmbDeger.Width = ScaleWidth
End Sub
'Write property values to storage
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("BackColor", cmbDeger.BackColor, &H80000005)
Call PropBag.WriteProperty("ForeColor", cmbDeger.ForeColor, &H80000008)
Call PropBag.WriteProperty("Enabled", cmbDeger.Enabled, True)
Call PropBag.WriteProperty("Font", Font, Ambient.Font)
Call PropBag.WriteProperty("BackStyle", UserControl.BackStyle, 1)
Call PropBag.WriteProperty("BorderStyle", UserControl.BorderStyle, 0)
Call PropBag.WriteProperty("ListIndex", cmbDeger.ListIndex, -1)
Call PropBag.WriteProperty("Text", cmbDeger.Text, "Combo1")
Call PropBag.WriteProperty("objVT", m_objVT, Nothing)
Call PropBag.WriteProperty("strAlan", m_strAlan, m_def_strAlan)
Call PropBag.WriteProperty("strTablo", m_strTablo, m_def_strTablo)
End Sub
![]()