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.
Bir kontrol nesnesini baştan yaratmak.
Var olan bir kontrol nesnesini iyileştirmek.
Var olan bir çok kontrol nesnesini birleştirerek yeni bir kontrol nesnesi yaratmak.
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ı:
ActiveX Control türünde bir proje yaratın.
UserControl penceresinde kontrol nesnesinin görsel arayüzünü yaratın.
Kod penceresinde, kontrol nesnesinin yeniden boyutlandırılması durumunda çalışacak olan Resize olayı için kod yazın.
Kontrol nesnesine özellikler, metotlar ve olaylar ekleyin ve onları programlayın.
Kontrol nesnesinin işlevselliğini gerçekleştirecek kodu yazın.
Yeni, Standard EXE türünden bir proje ekleyin. Bu kontrol nesnesinin hatalarını bulma ve test etme olanağı sağlayacaktır.
File menüsünden Make OCX seçeneğini seçerek kontrolün derlenmiş halini yaratın.
Örnek: ActiveX kontrol nesnesi yaratma.
Yukarıda genel olarak adımlar halinde belirtilen işlemi yine adımlar halinde gerçekleştirelim.
File menüsünden New Project seçeneğini seçin. ActiveX Control türünden bir proje yaratın.
Project menüsünden Project Properties seçeneğini seçin. Project Name olarak YeniButon yazın. Project Description kısmına Yeni ActiveX Butonu yazın.
Projedeki UserControl nesnesinin, Name özelliğini yButon, BackColor özelliğini &H00FF8080&, Height özelliğini 405, Width özelliğni 1605 olarak değiştirin.
Projeyi kaydedin.
Kontrol nesnesini test edebilmek için Standard EXE türünden yeni bir proje ekleyin. Üzerindeki formun Name özelliğini frmYBtn, Caption özelliğini Kontrol Nesnesinin Testi olarak değiştirin.
Proje grubunu kaydedin.
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:
Aşağıdaki kodu UserControl nesnesinin kod kısmına ekleyin.
Private Sub UserControl_Resize()
Static i As Integer
i = i + 1
Debug.Print "Boyutlandırma" & i
End Sub
UserControl tasarım pencerisini ekrana getirin ve bu pencereyi kapatın. FrmYBtn formunun tasarım penceresini açın. Araç kutusunun altında yeni kontrol nesnesi standart bir şekil ile görülmektedir.
yButon kontrol nesnesini çift tıklayın. Bu işlem kontrol nesnesinin gerçek boyutunda formun tam ortasına yerleştirilmesini sağlar. Bu durumuyla Immediate Window penceresinde ?Boyutlandırma1? yazısı yazılır. Bunun anlamı Resize olayının bir kere tetiklendiğidir. Kontrol nesnesi yeniden boyutlandırıldığında bu defa ?Boyutlandırma2? yazısı çıkacak ve bu böyle devam edecektir.Kontrol nesnesinin Width özelliği değiştirildiğinde bu yazının tekrar yazıldığı görülür.
yButton tasarım penceresini açın. Şimdi form penceresine dönün. Kontrol nesnesinin taralı olarak gözüktüğü görülecektir. Şimdi yine kontrol nesnesini boyutlandırın. Bu defa herhangi bir yazı yazılmadı. Çünkü kontrol nesnesinin tasarım penceresi açık iken kontrol nesnesi çalışmaz.
Şimdi yeni butonun üç boyutlu görünümünü gerçekleştirmek için aşağıdaki işlemleri gerçekleştirin.
Form üzerindek yButon nesnesini silin ve çift tıklayarak yeniden bir yButon yerleştirin. Bu işlem gerçek boyutu ile bir yButon yerleştirilmesini sağlar.
Aşağıdaki Line nesnelerini belirtilen özellikleriyle UserControl üzerine yerleştirin.
Line1
BorderColor =&H00808080&
BorderWidth =2
X1= 1560
X2= 1560
Y1= 60
Y2= 400
Line2
BorderColor &H00E0E0E0&
BorderWidth 2
X1 20
X2 20
Y1 0
Y2 400
Line2
BorderColor &H00808080&
BorderWidth 2
X1 40
X2 1560
Y1 405
Y2 405
Line4
BorderColor &H00E0E0E0&
BorderWidth 2
X1 0
X2 1560
Y1 20
Y2 20
Form penceresine geçin, sağ tuşa basın ve çıkan menüden Update UserControl seçeneğini seçin. Üç boyutlu görünümün sağlandığı görülür. Şimdi kontrol nesnesini yeniden boyutlandırın. Görüleceği gibi yeni çizilen çizgiler olduğu yerde durmaktadır.
Aşağıdaki kodu Ybuton kontrol nesnesinin kod kesimine yazın.
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
Formun tasarım penceresini açın, sağ tuşa basıp Update User Control seçeneğini seçin. Bu işlem gerçekleştiği anda aşağıdaki yazıların Immediate penceresine yazıldığı görülür.
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.
Şimdi F5 tuşuna basarak projeyi çalıştırın. Bu defa aşağıdaki yazıların yazıldığı görülecektir. Bunlarda ilki tasarım zamanındaki nesnenin yok edildiğini belirtmektedir.
Write Properties
Terminate
Initialize
Read Properties
Boyutlandırma1
Şimdi ilk nesneyi yukarı doğru çekerek, çift tıklama ile yeni bir nesne formu üzerine yerleştirin. Şimdi F5 tuşuna basarak projeyi çalıştırın. Bu defa yukarıdaki mesajlardan ikişer tane oluştuğu görülecektir.
Ş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.
Kontrol nesnesi tasarım penceresini açın ve üzerine bir etiket yerleştirin. Etiketin aşağıdaki özelliklerini belirtildiği gibi değiştirin.
Name lblCaption
Alignment Center
Autosize True
Font Times New Roman-10-Tur.
ForeColor White
BackStyle Transparent
Caption "Temzileyin"
WordWrap True
UserControl kod penceresini açın. Tools menüsünden Add Procedure seçeneğini kullanarak, Caption adında, Public bir Property yaratın ve aşağıdaki kodu ekleyin.
Public Property Get Caption() As String
Caption = lblCaption.Caption
End Property
Public Property Let Caption(vNewValue As String)
lblCaption.Caption = vNewValue
End Property
Kontrol nesnesi tasarım penceresini kapatın, formun üzerindeki kontrol nesnelerinden birini seçin. Properties penceresinden de görüleceği gibi nesnenin artık Caption adlı bir özelliği vardır. Bu özelliği değiştirip ENTER tuşuna basın. Yazılan Caption özelliğinin nesne üzerine yansıdığı görülecektir.
Şimdi projeyi çalıştırın. Yazılan Caption değerinin yok olduğu görülecektir. Bunun sebebi, yok edilen tasarım zamanı nesnesinin özelliklerinin çalışma zamanı nesnesine aktarılmamasıdır. Şimdi bu aktarmanın nasıl yapılacağını görelim.
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. Ş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.
UserControl nesnesinin tasarım pencersi açılır, Project menüsünden Add PropertyPage seçeneği seçilir.
Property Page için bir isim ve Caption belirlenir.
Projeyi kaydedin.
Propety Page tasarım penceresi UserControl tasarım penceresine benzerdir. Buradan Property Page tasarımı yapılabilir.
Ş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
Projeyi kaydedin. Property Page kod penceresini açın ve aşağıdaki kodu ekleyin.
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.
Property Page tasarım penceresini kapatın, UserControl tasarım penceresini açın. Properties penceresinden Property Pages özelliğini kullanarak YBGenel Property Page dialog kutusunu kontrol nesnesine ekleyin.
Kontrol nesnesini test etmek için kullanılan frmYBtn formunu açıp Update UserControl seçeneği ile kontrol nesnelerini günleyin.
Kontrol nesnelerinden birini seçip, Properties penceresinden (Custom) özelliğini kullanarak Property Page dialog kutusunu açın. Caption özelliğini değiştirip OK butonuna basın. Kontrol nesnesinin Caption özelliğinin değiştiği görülecektir. Bu işlem birden fazla kontrol nesnesinin özelliklerini bir defada değiştirmek için de kullanılabilir. Property Page Özellik sayfası olarak türkçeye çevrilebilir.
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.
UserControl kod pencersini açın, ArkaRenk diye bir özellik ekleyin ve aşağıdaki kodu yazın.
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
Sırasıyla InitProperties, ReadProperties ve WriteProperties olaylarına aşağıdaki satırları ekleyin.
* ARenk= RGB(192, 192, 192) (InitProperties)
* ARenk = PropBag.ReadProperty("ARenk", RGB(192, 192, 192))
* PropBag.WriteProperty "ARenk", ARenk, RGB(192, 192, 192)
Properties penceresinden Property Pages özelliğini seçip Color standart özellik sayfasını seçin.
Deneme formunu açın ve üzerindeki kontrol nesnelerini silin. Çift tıklama ile yeni bir kontrol nesnesi ekleyin.
(Custom) özelliğini kullanarak kontrol nesnesinin özellik sayfalarını açın ve özelliklerde değişiklik yaparak deneyin.
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. :yo
