Ö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
- 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)
Önceki Bölüm:
4: superText #1 |
Sonraki Bölüm: 6: superText #3 |
Hiç yorum yok:
Yorum Gönder