3 Ocak 2021 Pazar

Vb ile ActiveX Bileşen Oluşturma-11: superText #8

Önceki bölümde oluşturduğumuz projeye devam ediyoruz. superText ActiveX kontrolüne yeni özellikler ekleyeceğiz.

Label(Etiket) bileşeni ile Caption(başlık) ekleme

Gelişmiş özelliklere sahip bir metin kutusu oluşturduk ancak dikkat ederseniz projelerde genelde metin kutusu ile birlikte solunda, sağında ya da üstünde bir Label(etiket) de eklenir.

Projelerimize Label ve superText kontrollerini ayrı ayrı eklemektense Label'i superText bileşenine dahil etsek nasıl olur? Daha kullanışlı olur tabii ki. Öyleyse başlayalım.

  • Önceki bölümdeki proje dosyasını açın. Eğer proje dosyaları yoksa önceki bölümdeki linkten dosyayı indirebilirsiniz.
  • Test formundaki bileşenleri silin.
  • superText(superText.ctl) formunu açın. Shift+F7
  • TextBox'ı aşağı taşıyıp üstünde kalan boşluğa Label ekleyin.
  • Label1'in özelliklerini ayarlayın
    AutoSize: True
    Left: 0
    Top: 0
  • superText kontrolü forma eklediğimizde;
    Label, sol üst köşede,
    TextBox, Label'in 3px altında olacak.
    TextBox yüksekliği = kontrol yüksekliği - Label yüksekliği - 3px kadar olacak.
    Bunu sağlamak için UserControl_Resize prosedüründeki kodları aşağıdaki kodlar ile değiştirin.
Private Sub UserControl_Resize()
Dim px As Integer
px = Screen.TwipsPerPixelY * 3 '3 pixel
With Text1
    .Left = 0
    .Top = Label1.Height + px
    .Height = UserControl.ScaleHeight - Label1.Height - px
    .Width = UserControl.ScaleWidth
End With
End Sub

Eklenen Label'in Caption(başlık) özelliğini son kullanıcı değiştirebilmesi gerekir. Yoksa varsayılan değer olan Label1 sabit kalacaktır. Öyleyse superText kontrolüne Caption özelliği eklemeliyiz. Daha önceki sayfalarda özellik eklemeyi ayrıntılı olarak açıklamıştım.

Caption özelliği kodlarla eklenebileceği gibi ActiveX Control Interface Wizard ile de eklenebilir. Sihirbazı kullanalım.

  • ActiveX Control Interface Wizard'ı çalıştırın. Sihirbazda 2. sayfada soldaki listeden Caption'u seçin. > butonu ile sağdaki listeye aktarın.
  • 4. sayfada soldaki listeden Caption'u seçin,
    Control: Label
    Member: Caption
    olarak ayarlayın
  • Next ve ardından Finish tıklayın. Sihirbaz gerekli kodları ekleyecektir.
  • Test formuna superText kontrol ekleyip Caption özelliğini değiştirmeyi deneyin.

Üstte de belirtmiştim, projelerde Label kullanılırken TextBox'ın solunda, üstünde veya sağında olabiliyor. Halbuki eklediğimiz Label şu an için üstte sabit.

Label konumu ile ilgili bir özellik ekleyelim. Bu özellik değeri ile kullanıcı Label'in konumunu belirleyebilsin.

Özellik adı olarak LabelPosition olmasını düşündüm. ActiveX kontrolün daha yaygın olarak kullanılabilmesi için İngilizce dilini tercih ettim. Önceki bölümlerde bazı kısımlarda Türkçe adlar kullanmıştım. Bunu konunun anlaşılması için tercih etmiştim. Sonraki bölümlerde, önceden Türkçe olarak kullanılan adları İngilizce ile değiştireceğim.

Özellik değeri seçenekleri şunlar olacak:
Top (üstte)
Left (solda)
Right (sağda)

Bottom (altta) eklemeyeceğim. Çünkü metin kutusu altında kullanımı yaygın değil. İsteyen ekleyebilir. Varsayılan seçenek Top olacak.

  • ActiveX Control Interface Wizard'ı çalıştırın.
  • 3. sayfada New tıklayın.
  • Name: LabelPosition
    Type: Property
  • OK, Next, Next tıklayın. Sihirbaz gerekli kodları ekleyecektir.
  • Aşağıdaki kodları General / Declarations'da Enum listeleri altına ekleyin.
Enum e_lblPosition
    Top
    Left
    Right
End Enum
  • Public Property Get LabelPosition() As Variant satırı ve
    Public Property Let LabelPosition(ByVal New_LabelPosition As Variant)
    satırındaki Variante_lblPosition ile değiştirin.

superText kontrolü özelliklerine LabelPosition eklendi ve değeri değiştirilebiliyor ancak bir etkisi yok. Verilen değere göre gerekli değişikliğin yapılması için kodlama yapılması gerekir.

  • Private Sub UserControl_Resize() prosedürünü aşağıdaki kodlar ile değiştirin.
Private Sub UserControl_Resize()
Dim px As Integer
px = Screen.TwipsPerPixelY * 3 '3px
Select Case LabelPosition 'Label konumu
    Case e_lblPosition.Top 'Label üstte
        With Text1
            .Top = Label1.Height + px
            .Left = 0
            .Height = UserControl.ScaleHeight - Label1.Height - px
            .Width = UserControl.ScaleWidth
            With Label1
                .Top = 0
                .Left = 0
            End With
        End With
    Case e_lblPosition.Left 'Label solda
        px = Screen.TwipsPerPixelX * 3
        With Text1
            .Top = 0
            .Left = Label1.Width + px
            .Height = UserControl.ScaleHeight
            .Width = UserControl.ScaleWidth - Label1.Width - px
            With Label1
                .Top = UserControl.ScaleHeight / 2 - (.Height / 2)
                .Left = 0
            End With
        End With
    Case e_lblPosition.Right 'Label sağda
        With Text1
            .Top = 0
            .Left = 0
            .Height = UserControl.ScaleHeight
            .Width = UserControl.ScaleWidth - Label1.Width - px
            With Label1
                .Top = UserControl.ScaleHeight / 2 - (.Height / 2)
                .Left = Text1.Width + px
            End With
        End With
End Select
End Sub

Gerekli kodları ekledik ancak Test formunda superText kontrolünün LabelPosition özelliğini değiştirdiğimizde bir etki yapmadığı görülüyor. Sadece superText kontrolünün boyutu değiştirildiğinde Label pozisyonu değişiyor. Öyleyse özellik değişince UserControl_Resize() prosedürü çalıştırılırsa işlem tamam olacak. Gerekli kodlamayı yapalım.

  • Public Property Let LabelPosition(ByVal New_LabelPosition As e_lblPosition)
    prosedürünü aşağıdaki kodlar ile değiştirin.
Public Property Let LabelPosition(ByVal New_LabelPosition As e_lblPosition)
    m_LabelPosition = New_LabelPosition
    PropertyChanged "LabelPosition"
    UserControl_Resize
End Property

    • Test formuna superText kontrol ekleyip LabelPosition özelliğinin değerini değiştirmeyi deneyin.

    Buraya kadar güzel. Peki kullanıcı "Ben Label istemiyorum!" derse ne olacak.
    Evet. Bunun için bir seçenek yok. "Müşteri her zaman haklıdır" düşüncesi ile bu özelliği ekleyelim.

    LabelVisible adlı yeni bir özellik ekleyelim. Bu özelliğin değerinin True olması durumunda Label görünsün, False olması durumunda ise Label gizlensin.

    • LabelVisible eklemek için sihirbazı çalıştırın.
    • 3. sayfada New tıklayın
    • Name: LabelVisible
      Type: Property
      seçip OK sonra Next tıklayın.
    • Sonraki sayfada soldaki listeden LabelVisible seçin
      Control: Label1
      Member: WordWrap
      seçin. Member listesinde Visible çıkmadığı için geçici olarak WordWrap seçtim. Kodlardan bunu değiştireceğiz.
    • Next sonra Finish tıklayın. Sihirbaz gerekli kodları ekleyecektir.
    • Kodlardaki tüm WordWrap kelimelerini Visible ile değiştirmemiz gerekir.
      Bunun için bir kolaylık var.
      Kod penceresinde iken Ctrl+H ye basın.
      Açılan pencerede;
      Find What: WordWrap
      Replace With: Visible
      ayarlayın.
      Replace All tıklayın. Tüm WordWrap kelimelerini Visible ile değiştirilir.
    • Test formuna superText kontrol ekleyip LabelVisible özelliğinin değerini değiştirmeyi deneyin.
    Bir sorun var. Label'i gizlediğimizde TextBox (metin kutusu), superText kontrolü boyutuna eşitlenmiyor. Bunun böyle olmasını istemeyiz.
    Label görünmeyecekse; önceden olduğu gibi metin kutusu boyutu, ActiveX kontrol boyutuna eşit olsun. Bunu sağlayan kodları ekleyelim.
    • Private Sub UserControl_Resize() prosedürünü aşağıdaki kodlar ile değiştirin.
    Private Sub UserControl_Resize()
    Dim px As Integer
    With Text1
        .Top = 0
        .Left = 0
    End With
    If LabelVisible = True Then
        px = Screen.TwipsPerPixelY * 3 '3px
        Select Case LabelPosition 'Label konumu
            Case e_lblPosition.Top 'Label üstte
                With Text1
                    .Top = Label1.Height + px
                    .Height = UserControl.ScaleHeight - Label1.Height - px
                    .Width = UserControl.ScaleWidth
                    With Label1
                        .Top = 0
                        .Left = 0
                    End With
                End With
            Case e_lblPosition.Left 'Label solda
                px = Screen.TwipsPerPixelX * 3
                With Text1
                    .Left = Label1.Width + px
                    .Height = UserControl.ScaleHeight
                    .Width = UserControl.ScaleWidth - Label1.Width - px
                    With Label1
                        .Top = UserControl.ScaleHeight / 2 - (.Height / 2)
                        .Left = 0
                    End With
                End With
            Case e_lblPosition.Right 'Label sağda
                With Text1
                    .Height = UserControl.ScaleHeight
                    .Width = UserControl.ScaleWidth - Label1.Width - px
                    With Label1
                        .Top = UserControl.ScaleHeight / 2 - (.Height / 2)
                        .Left = Text1.Width + px
                    End With
                End With
        End Select
    Else
        With Text1
            .Height = UserControl.ScaleHeight
            .Width = UserControl.ScaleWidth
        End With
    End If
    End Sub
    • Public Property Let LabelVisible(ByVal New_LabelVisible As Boolean) prosedürüne aşağıdaki kodu ekleyin.
    UserControl_Resize
    • Test formuna superText kontrol ekleyip LabelVisible özelliğinin değerini değiştirmeyi deneyin.

    Bundan sonra ödev olarak neler yapabilirsiniz?

    • Yeni eklenen özellikler Property Pages sayfasına eklenebilir.
    • Label'in diğer standart özelliklerinden gerekli olanlar ActiveX kontrole eklenebilir. Alignment, Font, ForeColor, BackColor, BackStyle ... vb.



    Önceki Bölüm: 10: superText #7
    ...

    Hiç yorum yok:

    Yorum Gönder