19 Kasım 2020 Perşembe

Vb ile ActiveX Bileşen Oluşturma-5: superText #2

Önceki bölümde oluşturduğumuz projedeki superText kontrolünü geliştirmeye devam ediyoruz.

Önceki bölümde, son aşamada bir sorun olduğunu belirtmiştim. Projeyi çalıştırdığınızda göreceksiniz ki superText'in Metin özelliğine girdiğimiz bilgiler program çalıştırınca kayboluyor. Çalışmayı durdurunca da geri gelmiyor. Bu hatayı giderelim.

PropertyBag

ActiveX kontrollerin özelliklerinin tutulduğu bir nesne var. Nesnenin adı PropertyBag. Bu nesnenin fonsiyonları ile özellik değerleri yazılıp okunabilir.
WriteProperty fonksiyonu özellik değeri okumak için,
ReadProperty ise özellik değeri yazmak içindir.

  • superText kod penceresine aşağıdaki kodları ekleyin
Public Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Text1.Text = PropBag.ReadProperty("Metin", UserControl.Name)
End Sub

Public Sub UserControl_WriteProperties(PropBag As PropertyBag)
    Call PropBag.WriteProperty("Metin", Text1.Text, UserControl.Name)
End Sub
  • Şimdi projedeki test formuna(Form1) superText kontrolünden ekleyin, Metin özelliğini değiştirip çalıştırın.
  • Göreceksiniz ki artık Metin özelliği standart Textbox'ın Text özelliği gibi çalışıyor.
    Metin özellik değerleri kaybolmuyor.
    ReadProperties özelliği okumaya çalıştığımızda,
    WriteProperties ise özelliğe yazmaya çalıştığımızda çalışır.
  • Test formunun Click olayında aşağıdaki kodu deneyebilirsiniz.
    Bu kodlar ile superText'in Metin özelliğine değer atanmaktadır.
Private Sub Form_Click()
    superText1.Metin = "Merhaba"
End Sub

Önceki bölümde superText kontrolümüzün Metin özellik değerini kontrolün Name değerinden alarak superText olarak yazdırmıştık.

Dikkat ederseniz bir form'a Textbox eklendiğinde Textbox'un Text özelliği otomatik olarak Name değerindeki değeri tam olarak alıyor. Text1, Text2, Text3 ... gibi.

Bizim superText kontrolünün de böyle bir özelliği olsa nasıl olur? İyi olur. Öyleyse; önceki bölümde eklediğimiz UserControl_InitProperties prosedürünü aşağıdaki kodlar ile değiştirin.

Private Sub UserControl_InitProperties()
    'Text1.Text = UserControl.Name
    Text1.Text = Extender.Name
End Sub

Özellik değerini listeden seçme: Enum

Standart kontrollerin bazı özelliklerini incelediğinizde özellik değerini değiştirmek için bir liste açılır ve listeden bir değer seçilir. Bu hem kolaylık hem de güvenlik sağlar.

  • Şimdi superText kontrolümüze buna benzer bir özellik ekleyeceğiz.
    superText'e metin girişi için sınırlama yapabileceğiz.
    Seçenekler şunlar: Hepsi, Yalnız Sayı, Yalnız Harf, Yalnız Büyük Harf, Yalnız Küçük Harf
  • superText formunun kod penceresinde Declaration'a aşağıdaki kodları ekleyin.
Dim mGiris as Byte 'giriş değeri
Enum stGiris
    Hepsi
    Sayı
    Harf
    [Büyük Harf]
    [Küçük Harf]
End Enum

Bu kodlar ile özellik için girilecek değerlerin numaralı listesi oluşturuluyor. TYPE ... END TYPE yapısına biraz benzer.

Arasında boşluk olan eleman listesi köşeli parantez [ içine alınmalıdır.
Bu kodlara göre listedeki ilk eleman Hepsi'nin sayısal değeri 0'dır, diğerleri sırasıyla 1, 2, 3, ve 4
Eğer sayısal değerleri kendiniz belirlemek isterseniz aşağıdaki gibi kodlama yapabilirsiniz.

Enum stGiris
	Hepsi = 1
	Sayı  = 4
	Harf
End Enum

Değeri belirtilmeyen elemanın değeri bir öncekinin sayısal değerinin bir büyüğüdür. Harf = 5 olur.

Eğer ilk değer 0 olmazsa ve varsayılan değer tanımı yapılmamışsa özelliğe otomatik olarak bir değer atanmaz, boş olur. 0 olursa ilk sayı değeri otomatik olarak atanır. O yüzden varsayılan değer atamak istiyorsak bunu listenin en başına yazmalıyız, değerini 0 olarak belirlemeliyiz ya da boş bırakmalıyız. Bizim listeye göre; eğer bir değer girilmemişse superText'de giriş sınırlaması olmayacak.

  • Numaralı listemiz hazır. Giris özelliğini kontrole atayalım.
  • superText kod penceresinde iken menüden Tools / Add Procedure...'ü tıklayın.
  • Name: Giris
    Type: Property
    olarak seçin, OK'i tıklayın.

  • Otomatik eklenen kodları aşağıdaki şekilde değiştirin.
Public Property Get Giris() As stGiris
    Giris = mGiris
End Property

Public Property Let Giris(ByVal vNewValue As stGiris)
    mGiris = vNewValue
    PropertyChanged "Giris"
End Property

Get ve Let'i daha önce açıklamıştık. Burada farklı olan iki şey var.

Giris() As stGiris : Giriş özelliği stGiris listesinden alınacak.
PropertyChanged "Giris" : Declaration'da Dim mGiris as Byte ile bir değişken belirledik, burada belirlememizin sebebi aldığı değeri kaybetmemesi, diğer prosedürler içinde de değerini korumasıdır. PropertyChanged komutu belirtilen özelliğin değerinin değiştiğini belirtir.

  • ReadProperties ve WriteProperties kodlarını da aşağıdaki şekilde değiştirmemiz gerekir
Public Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Text1.Text = PropBag.ReadProperty("Metin", UserControl.Name)
    mGiris = PropBag.ReadProperty("Giris", 0)
End Sub

Public Sub UserControl_WriteProperties(PropBag As PropertyBag)
    Call PropBag.WriteProperty("Metin", Text1.Text, UserControl.Name)
    Call PropBag.WriteProperty("Giris", mGiris, 0)
End Sub
  • Şimdi kontrolü denemek için kullandığımız form üzerine superText kontrolü yerleştirip F4e basıp özelliklerine baktığınızda Giris özelliğini ve değer seçmek için açılan listeyi görebilirsiniz.

Giris
özelliğinin kontrolümüze atandığını gördük ama bu özelliğin değerini seçmek hiçbir işe yaramıyor.
  • Şimdi seçilen değere göre giriş sınırlama kodlarını girelim.
    superText kod penceresinde Text1_KeyPress kodlarını aşağıdaki şekilde düzenleyin.
Private Sub Text1_KeyPress(KeyAscii As Integer)
    Dim keyErr As Boolean 'hatalı giriş
    If KeyAscii = 8 Then Exit Sub 'TAB tuşu ise
    If KeyAscii = vbKeyReturn Then 'ENTER tuşu ise
        KeyAscii = 0
        SendKeys "{TAB}", True 'TAB tuşvuruşu gönder
        Exit Sub
    End If
    Select Case mGiris
        Case 1: 'Sayı
            '0-9 ve . harici ise hata
            If (KeyAscii > 57 Or KeyAscii < 48) And KeyAscii <> 46 Then
                keyErr = True
            End If
            ' metinde . varsa . ise hata
            If KeyAscii = 46 And InStr(Text1, ".") Then keyErr = True
        Case 2: 'Harf
            '0-9 ise hata
            If IsNumeric(Chr(KeyAscii)) Then keyErr = True
        Case 3: 'BuyukHarf
            If KeyAscii = 253 Then
                KeyAscii = 73 'ı => I
            ElseIf KeyAscii = 105 Then
                KeyAscii = 221 'i => İ
            Else
                'küçük harfi büyük harfe dönüştür
                KeyAscii = Asc(UCase(Chr(KeyAscii)))
            End If
        Case 4: 'KucukHarf
            If KeyAscii = 73 Then
                KeyAscii = 253 'I => ı
            ElseIf KeyAscii = 221 Then
                KeyAscii = 105 'İ => i
            Else
                'büyük harfi küçük harfe dönüştür
                KeyAscii = Asc(LCase(Chr(KeyAscii)))
            End If
    End Select
    'hatalı giriş varsa
    If keyErr = True Then KeyAscii = 0: Beep
End Sub
Kontrolümüzle ilgili temel işlemleri tamamlamış olduk. Bu özelliğiyle bile kullanışlı bir kontrol oldu.
  • Declaration'a aşağıdaki kodları da ekleyin. Ben superText için gerekli olacak iki Event'i kullanıma açtım. Gerekli ise siz diğer Event'leri de aynı yöntemle açabilirsiniz.
Event Change()
Event KeyPress(KeyAscii As Integer)
Eklenen Event'leri aktif etme:
  • Change için;
    Declaration'a aşağıdaki kodları da ekleyin.
Private Sub Text1_Change()
    RaiseEvent Change
End Sub
  • KeyPress için;
    daha önce eklediğimiz Private Sub Text1_KeyPress(KeyAscii As Integer) prosedürüne aşağıdaki satırı ilk satır olarak ekleyin.
RaiseEvent KeyPress(KeyAscii)

Proje dosyaları: Vb_ile_ActiveX_Olusturma_5.rar

Önceki Bölüm: 4: superText #1
Sonraki Bölüm: 6: superText #3

Hiç yorum yok:

Yorum Gönder