28 Kasım 2020 Cumartesi

Vb ile ActiveX Bileşen Oluşturma-6: superText #3

Önceki bölümde kaldığımız yerden devam ediyoruz. superText ActiveX
kontrolüne yeni özellikler ekleyeceğiz.

  • Önceki bölümdeki proje dosyasını açın. Eğer proje dosyaları yoksa önceki bölümdeki dosyayı indirebilirsiniz.
  • Önceki bölümde, projede test için kullandığımız Form1'i burada kullanmayacağız. Form1'i projeden kaldırmak için CTRL+R ile Project penceresini açıp Form1(Form1.frm) üzerinde sağ
    tıklayıp Remove Form1.frm tıklayın.
  • File / Add Project... ile ActiveX kontrolü test edeceğimiz yeni Standart EXE projesi ekleyin. (Project2)
  • Project2'yi başlangıç projesi yapmak için Project penceresinde Project2 üzerinde sağ tıklayıp Set As Startup tıklayın.
  • Toolbox'daki superText kontrolün pasif olduğunu göreceksiniz. superText kontrolünü Form1'e eklemek için tıkladığınızda bir uyarı gelecek
    This control is private to its project. To be public, a control must be
    in an ActiveX Control project, and its Public property must be True.
    Önceki projede superText bulunduğu proje içinde sorunsuz kullanılabiliyordu ancak şimdi bulunduğu projeden farklı bir projede kullanmaya çalıştığımızda hata verdi.
    Çünkü superText'in kapsamı projeye özeldir(Private), bulunduğu proje dışı kullanma izni yok. Bunun değiştirilip genel erişime(Public) izin verilmesi gerekir. Şimdi bu sorunu giderelim.
  • Önce Project1'in proje türünü ve adını değiştirelim.
    Project1 üzerinde sağ tıklayıp Project1 Properties... tıklayın.
  • Açılan pencerede aşağıdaki ayarları yapın.
    Project type: ActiveX Control
    Startup Object: (None)
    Project Name: SuperTextKontrol
    OK tıklayın. Bir uyarı gelecek Tamam tıklayın.
  • Project penceresinde superText'i çift tıklayın, superText seçili iken Properties penceresinde
    Public = False
    olan ayarı
    Public = True
    olarak değiştirin. Böylece superText kontrolü genel erişime(Public) açık olacak.
    Artık Toolbox'daki superText kontrolü herhangi bir form'a eklenebilir.
  • Project penceresinde Project1 üzerinde sağ tıkla / Project1
    Properties...
    Project Name: Test
Projelerin özellik ayarlamaları tamam. Şimdi superText'i geliştirmeye devam edelim.

Renk özellikleri ekleme

superText'i TextBox ile karşılaştırdığımızda çok sayıda özelliğin superText'de olmadığı görülmektedir. Son kullanıcı bu eksik özelliklerin olmasını arzulamayacaktır.

Şimdi eksik olan yazı rengi(Forecolor) ve zemin rengi(BackColor) özelliklerini ekleyelim.

Dikkat ederseniz herhangi bir kontrolün renk özelliği varsa onu değiştirmeye çalıştığınızda bir renk seçme yardımcısı açılır. superText'e ekleyeceğimiz renk özelliğinin de böyle olması çok iyi olur.

  • Aşağıdaki kodları superText kod penceresine ekleyin.
Public Property Get BackColor() As OLE_COLOR
BackColor = Text1.BackColor
End Property

Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
Text1.BackColor() = New_BackColor
PropertyChanged "BackColor"
End Property

Public Property Get ForeColor() As OLE_COLOR
ForeColor = Text1.ForeColor
End Property

Public Property Let ForeColor(ByVal New_ForeColor As OLE_COLOR)
Text1.ForeColor() = New_ForeColor
PropertyChanged "ForeColor"
End Property
OLE_COLOR veri türü, renk değerini veren özellikler için kullanılır. Bir özellik OLE_COLOR olarak tanımlandığında, özellikler penceresi, rengin sayısal karşılığını hatırlamak zorunda kalmadan kullanıcının özelliğin rengini görsel olarak seçmesini sağlayan bir renk seçici iletişim kutusu görüntüler.

Özellik değeri değişiminin kalıcı olması için UserControl_ReadProperties ve UserControl_WriteProperties prosedürlerini aşağıdaki kodlar ile değiştirin.
Public Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Text1.Text = PropBag.ReadProperty("Metin", UserControl.Name)
    mGiris = PropBag.ReadProperty("Giris", 0)
    Text1.BackColor = PropBag.ReadProperty("BackColor", vbWindowBackground)
    Text1.ForeColor = PropBag.ReadProperty("ForeColor", vbWindowText)
End Sub

Public Sub UserControl_WriteProperties(PropBag As PropertyBag)
    Call PropBag.WriteProperty("Metin", Text1.Text, UserControl.Name)
    Call PropBag.WriteProperty("Giris", mGiris, 0)
    Call PropBag.WriteProperty("BackColor", Text1.BackColor, vbWindowBackground)
    Call PropBag.WriteProperty("ForeColor", Text1.ForeColor, vbWindowText)
End Sub
Şimdi kontrolün zemin ve yazı rengini değiştirmeyi deneyebilirsiniz.

Odak Zemin Rengi özelliği ekleme

Renk konusu açılmışken yeni bir renkle ilgili bir özellik daha ekleyelim.
Şu ana kadarki kodlama ile superText kontrolü odaklandığında zemin rengi değişiyordu. Fakat bu zemin renginin ne olacağını superText tasarım kodlarında belirlemiştik.
Rengi değiştirmek için kodlarda değişiklik yapmamız gerekiyor. Kodlar derlendiğinde kodlara müdahale etme imkanı da olmayacaktır.
Öyleyse ne yapalım? Son kullanıcı superText kontrolünün özelliklerinde odak zemin rengini belirleyebilsin. superText'e OdakZeminRengi özelliği ekleyelim. Böylece daha esnek bir kontrol oluşturacağız.
  • superText kod penceresinde Declarations'a aşağıdaki kodları ekleyin.
Dim ozr As OLE_COLOR 'odak zemin rengi
Dim gZeminRengi As OLE_COLOR 'geçici zemin rengi
  • Aşağıdaki kodları superText kod penceresine ekleyin.
Public Property Get OdakZeminRengi() As OLE_COLOR
  OdakZeminRengi = ozr
End Property

Public Property Let OdakZeminRengi(ByVal c As OLE_COLOR)
  ozr = c
  PropertyChanged "OdakZeminRengi"
End Property
  • UserControl_ReadProperties ve UserControl_WriteProperties prosedürlerini aşağıdaki kodlar ile değiştirin.
Public Sub UserControl_ReadProperties(PropBag As PropertyBag)
    Text1.Text = PropBag.ReadProperty("Metin", UserControl.Name)
    mGiris = PropBag.ReadProperty("Giris", 0)
    Text1.BackColor = PropBag.ReadProperty("BackColor", vbWindowBackground)
    Text1.ForeColor = PropBag.ReadProperty("ForeColor", vbWindowText)
    ozr = PropBag.ReadProperty("OdakZeminRengi", vbWindowBackground)
End Sub

Public Sub UserControl_WriteProperties(PropBag As PropertyBag)
    Call PropBag.WriteProperty("Metin", Text1.Text, UserControl.Name)
    Call PropBag.WriteProperty("Giris", mGiris, 0)
    Call PropBag.WriteProperty("BackColor", Text1.BackColor, vbWindowBackground)
    Call PropBag.WriteProperty("ForeColor", Text1.ForeColor, vbWindowText)
    Call PropBag.WriteProperty("OdakZeminRengi", ozr, vbWindowBackground)
End Sub
  • Text1_GotFocus ve Text1_LostFocus prosedürlerini aşağıdaki kod ile değiştirin.
Private Sub Text1_GotFocus()
    gZeminRengi = Text1.BackColor
    Text1.BackColor = ozr 'odak zemin rengi
End Sub

Private Sub Text1_LostFocus()
    Text1.BackColor = gZeminRengi 'geçici zemin rengi
End Sub
  • Şimdi Test projesinde superText kontrolünün BackColor, ForeColor ve OdakZeminRengi özelliklerini değiştirmeyi deneyin.
  • Test formuna birkaç tane superText kontrolü ekleyin ve çalıştırın.
Bir sorun var değil mi? Yeni eklenen superText kontrolü varsayılan zemin rengi 0 (siyah) oluyor.
Bu sorunu giderelim.
  • UserControl_InitProperties prosedürünü aşağıdaki kod ile değiştirin.
Private Sub UserControl_InitProperties()
    Text1.Text = Extender.Name
    ozr = vbWindowBackground 'odak zemin rengine varsayılan değeri ata
End Sub

Ödev 1:

Bu aşamaya kadar sorunsuz geldiyseniz size ödev: superText kontrolüne OdakYaziRengi özelliği ekleyin.
Odak kontrole geldiğinde kontrolün yazı rengi OdakYaziRengi'nde belirlenen renk olsun.
Odak terk edildiğinde yazı rengi asıl rengine dönsün.

Ödevi OdakZeminRengi özelliği eklerken uyguladığımız işlemlerin benzeri ile kolaylıkla yapabileceğinizi düşünüyorum.

Özellik açıklaması ekleme

Properties penceresinde kontrole eklediğimiz özellikler haricinde bir özelliği tıkladığımızda pencerenin alt bölmesinde özellik adı ve bir cümlelik özellik açıklamasını göreceksiniz.
Bizim eklediğimiz özelliklerde ise alt bölmede özellik adı yazıyor ancak açıklama yok.
Eğer özelliklerin açıklamasını eklersek son kullanıcı özellik hakkında kısa bir bilgi edinebilir.

Şimdi bu işlemi yapalım.
  • superText kod penceresi açıkken menüden Procedure Attributes (prosedür öznitelikleri) tıklayın.
  • Açılan pencerede Name yanındaki listeden eklenen özellik adını seçin,
    Description kısmına özellik açıklama metnini girin.
  • Apply tıklayın.
  • sonraki özelliği seçip açıklama girin. Her bir özellik değişiminde Apply (uygula) tıklayın.
  • İşlem bitince OK tıklayın.

Örnek:

Giris: Klavye giriş tuşları kısıtlaması
Metin: Kontrolün içerdiği metin
OdakZeminRengi: Odak, kontrolde iken zemin rengi
  • Test projesindeki superText özelliklerini kontrol edin. Eklediğimiz özellikleri açıklaması var mı?

About (Hakkında) özelliği ekleme

Standart kontrollerde yok ama sonradan eklenen ActiveX kontrol özelliklerine bakıldığında ilk özellik (About) olduğunu fark edeceksiniz. Bu özellik yanındaki ... tıklandığında yada özellik adı çift tıklandığında özellik hakkında bilgi içeren bir pencere gelir.
About özelliği superText kontrolünde de olsa iyi olur. Haydi bu özelliği ekleyelim.
  • superText kod penceresine aşağıdaki kodları ekleyin.
Sub Hakkinda()
    MsgBox "superText ActiveX Kontrol" & vbCrLf & "©2020 Mesut Akcan" & vbCrLf & _
        "Bu kontrol TextBox kontrolüne yeni kullanışlı özellikler eklenerek geliştirilmiştir."
End Sub
Üstteki kodları eklemek yeterli değil.
Bu prosedüre AboutBox özniteliği atamamız gerekir.
  • superText kod penceresindeyken menüden Procedure Attributes tıklayın.
  • Name listesinden Hakkinda seçin.
    Procedure ID listesinden AboutBox seçin
    OK tıklayın.
  • Test formundaki superText özelliklerinde (About) özelliği eklendiğini kontrol edin. Özelliği çift tıklayın.
Evet güzel oldu. Ancak Hakkında iletişim kutusu başlığında Project1 yazması amatörce oldu, değil mi?
Bunu düzeltmenin 2 yolu var. Onları sonraki bölümde açıklayacağım.
Bu bölümün 2. ödevi de bu konuda olsun.

Ödev 2:

Hakkında iletişim kutusu başlığını superText Hakkında olarak değiştirin.

Ödevlerin cevaplarını aşağıdaki yorum kısmına yazabilirsiniz.

Proje dosyaları: Vb_ile_ActiveX_Olusturma_6.rar


Önceki Bölüm: 5: superText #2
Sonraki Bölüm: 7: superText #4

Hiç yorum yok:

Yorum Gönder