Skip to content

5. VB.NET ve VS.NET ile Grafik Arayüzler

Burada, VB.NET ile grafik arayüzlerin nasıl oluşturulacağını göstermeyi amaçlıyoruz. Öncelikle, bir grafik arayüz oluşturmamızı sağlayan .NET platformunun temel sınıflarının neler olduğuna bakacağız. İlk etapta herhangi bir otomatik oluşturma aracı kullanmayacağız. Daha sonra, .NET dilleriyle uygulama geliştirmeyi ve özellikle grafik arayüz oluşturmayı kolaylaştıran bir Microsoft geliştirme aracı olan Visual Studio.NET (VS.NET) kullanacağız. Kullanılan VS.NET sürümü İngilizce sürümdür.

5.1. Grafik kullanıcı arayüzlerinin temelleri

5.1.1. Basit bir pencere

Aşağıdaki kodu ele alalım:


' seçenekler
Option Strict On
Option Explicit On 

' ad alanları
Imports System
Imports System.Drawing
Imports System.Windows.Forms

' form sınıfı
Public Class Form1
    Inherits Form

    ' üretici
    Public Sub New()
        ' pencere başlığı
        Me.Text = "Mon premier formulaire"
        ' pencere boyutları
        Me.Size = New System.Drawing.Size(300, 100)
    End Sub

    ' test işlevi
    Public Shared Sub Main(ByVal args() As String)
        ' form görüntülenir
        Application.Run(New Form1)
    End Sub
End Class

Yukarıdaki kod derlenir ve ardından çalıştırılır

dos>vbc /r:system.dll /r:system.drawing.dll /r:system.windows.forms.dll frm1.vb

dos>frm1

Çalıştırma sonucunda aşağıdaki pencere görüntülenir:

Image

Bir grafik arayüz genellikle System.Windows.Forms.Form temel sınıfından türetilir:

Public Class Form1
    Inherits Form

Form temel sınıfı, kapatma ve büyütme/küçültme düğmeleri ile boyut ayarlama gibi özelliklere sahip bir temel pencere tanımlar ve bu grafik nesneler üzerindeki olayları yönetir. Burada, temel sınıfa bir başlık, genişlik (300) ve yükseklik (100) değerleri atayarak onu özelleştiriyoruz. Bu işlem, sınıfın oluşturucusunda gerçekleştirilir:


    Public Sub New()
        ' pencere başlığı
        Me.Text = "Mon premier formulaire"
        ' pencere boyutları
        Me.Size = New System.Drawing.Size(300, 100)
    End Sub

Pencerenin başlığı Text özelliği ile, boyutları ise Size özelliği ile belirlenir. Size, System.Drawing ad alanında tanımlanmıştır ve bir yapıdır. Main yordamı, grafik uygulamasını şu şekilde başlatır:


        Application.Run(New Form1)

Form1 türünde bir form oluşturulur ve görüntülenir; ardından uygulama, formda meydana gelen olayları (tıklamalar, fare hareketleri vb.) dinlemeye başlar ve formun işlediği olayları yürütür. Burada, formumuz Form temel sınıfı tarafından yönetilen olaylar dışında başka hiçbir olayı yönetmemektedir (kapatma düğmelerine tıklamalar, büyütme/küçültme, pencere boyutunu değiştirme, pencereyi taşıma vb.).

5.1.2. Düğmeli bir form

Şimdi penceremize bir düğme ekleyelim:


' seçenekler
Option Strict On
Option Explicit On 

' ad alanları
Imports System
Imports System.Drawing
Imports System.Windows.Forms

' form sınıfı
Public Class Form1
    Inherits Form

    ' özellikler
    Private cmdTest As Button

    ' oluşturucu
    Public Sub New()
        ' başlık
        Me.Text = "Mon premier formulaire"
        ' boyutlar
        Me.Size = New System.Drawing.Size(300, 100)
        ' bir düğme
        ' oluşturma
        Me.cmdTest = New Button
        ' konum
        cmdTest.Location = New System.Drawing.Point(110, 20)
        ' boyut
        cmdTest.Size = New System.Drawing.Size(80, 30)
        ' etiket
        cmdTest.Text = "Test"
        ' olay yöneticisi
        AddHandler cmdTest.Click, AddressOf cmdTest_Click
        ' formda düğme ekleme
        Me.Controls.Add(cmdTest)
    End Sub

    ' olay yöneticisi
    Private Sub cmdTest_Click(ByVal sender As Object, ByVal evt As EventArgs)
        ' düğmeye tıklanmış - bildirilmesi
        MessageBox.Show("Clic sur bouton", "Clic sur bouton", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

    ' test işlevi
    Public Shared Sub Main(ByVal args() As String)
        ' form görüntüleniyor
        Application.Run(New Form1)
    End Sub
End Class

Forma bir düğme ekledik:


        ' bir düğme
        ' oluşturma
        Me.cmdTest = New Button
        ' konum
        cmdTest.Location = New System.Drawing.Point(110, 20)
        ' boyut
        cmdTest.Size = New System.Drawing.Size(80, 30)
        ' etiket
        cmdTest.Text = "Test"
        ' olay yöneticisi
        AddHandler cmdTest.Click, AddressOf cmdTest_Click
        ' formda düğme ekleme
        Me.Controls.Add(cmdTest)

Location özelliği, Point yapısı kullanılarak düğmenin sol üst köşesinin koordinatlarını (110,20) belirler. Düğmenin genişliği ve yüksekliği, Size yapısı kullanılarak (80,30) olarak belirlenir. Düğmenin Text özelliği, düğmenin etiketini belirlemeye yarar. Düğme sınıfında, aşağıdaki gibi tanımlanmış bir Click olayı bulunur:

Public Event Click As EventHandler

burada EventHandler, aşağıdaki imzaya sahip bir "delegate" işlevidir:

Public Delegate Sub EventHandler(ByVal sender As Object,ByVal e As EventArgs)

Bu, düğme üzerindeki [Click] olay işleyicisinin, [EventHandler] delege işlevinin imzasına sahip olması gerektiği anlamına gelir. Burada, cmdTest düğmesine tıklandığında, cmdTest_Click yöntemi çağrılacaktır. Bu yöntem, önceki EventHandler şablonuna uygun olarak şu şekilde tanımlanmıştır:


    ' olay yöneticisi
    Private Sub cmdTest_Click(ByVal sender As Object, ByVal evt As EventArgs)
        ' düğmeye tıklanmış - bildirilmiş
        MessageBox.Show("Clic sur bouton", "Clic sur bouton", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

Sadece bir mesaj görüntülenir:

Image

Sınıf derlenir ve çalıştırılır:

dos>vbc /r:system.dll /r:system.drawing.dll /r:system.windows.forms.dll frm2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4

dos>frm2

MessageBox sınıfı, bir pencerede mesajlar görüntülemek için kullanılır. Burada oluşturucuyu kullandık

Overloads Public Shared Function Show(ByVal owner As IWin32Window,ByVal text As String,ByVal caption As String,ByVal buttons As MessageBoxButtons,ByVal icon As MessageBoxIcon) As DialogResult
text
görüntülenecek mesaj
başlık
pencerenin başlığı
düğmeler
pencerede bulunan düğmeler
icon
pencerede bulunan simge

buttons parametresi, aşağıdaki sabitlerden birini alabilir:

sabit
düğmeler
   AbortRetryIgnore 
  OK 
    OKCancel 
    RetryCancel 
    YesNo 
    YesNoCancel 

icon parametresi, aşağıdaki sabitlerden birini değer olarak alabilir:

Asterisk
Error
aynı Stop
Exclamation
aynı Uyarı
Hand
Information
Aynı şekilde Asterisk
None
Question
Stop
aynı şekilde El
Warning

 

Show yöntemi, bir sıralama olan System.Windows.Forms.DialogResult türünde bir sonuç döndüren statik bir yöntemdir:


public enum System.Windows.Forms.DialogResult 
{
    Abort = 0x00000003, 
    Cancel = 0x00000002, 
    Ignore = 0x00000005, 
    No = 0x00000007, 
    None = 0x00000000, 
    OK = 0x00000001, 
    Retry = 0x00000004, 
    Yes = 0x00000006, 
}

Kullanıcının MessageBox türündeki pencereyi kapatmak için hangi düğmeye bastığını öğrenmek için şunu yazacağız:

dim res as DialogResult=MessageBox.Show(..)
if res=DialogResult.Yes then
' "Evet" düğmesine basıldı
...
end if

5.2. Visual Studio.NET ile bir grafik arayüz oluşturma

Daha önce gördüğümüz örneklerden bazılarını şimdi Visual Studio.NET ile oluşturarak ele alacağız.

5.2.1. Projenin ilk oluşturulması

  1. VS.NET'i başlatın ve Fichier/Nouveau/Projet seçeneğini seçin

Image

  1. projenizin özelliklerini girin
    1. oluşturmak istediğiniz proje türünü seçin; burada bir proje VB.NET (1)
    2. oluşturmak istediğiniz uygulama türünü seçin; burada bir Windows uygulaması (2)
    3. Projenin alt klasörünü hangi klasöre yerleştirmek istediğinizi belirtin (3)
    4. Projenin adını belirtin (4). Bu, aynı zamanda proje dosyalarını içerecek klasörün adı olacaktır
    5. Bu klasörün adı (5) numaralı alanda gösterilir
  1. Bunun üzerine, i4 klasörü altında bir dizi klasör ve dosya oluşturulur:
proje1 klasörünün alt klasörleri

Bu dosyalardan sadece biri önemlidir: form1.cs dosyası. Bu dosya, VS.NET tarafından oluşturulan formla ilişkili kaynak dosyadır. Buna daha sonra tekrar döneceğiz.

5.2.2. VS.NET arayüz pencereleri

VS.NET arayüzü artık i4 projemizin bazı öğelerini gösteriyor:

Bir grafik kullanıcı arayüzü tasarım penceremiz var:

Araç çubuğundaki (toolbox 2) denetimleri seçip pencere alanına (1) sürükleyerek bir grafik arayüz oluşturabiliriz. Fareyi "toolbox" üzerine getirdiğimizde, bu alan genişler ve bir dizi denetim görünür hale gelir:

Image

Şu an için bunlardan hiçbirini kullanmıyoruz. Hala VS.NET ekranında, "Explorer Solution" (Çözüm Gezgini) penceresini görüyoruz:

Image

İlk etapta bu pencereden pek yararlanmayacağız. Bu pencere, projeyi oluşturan tüm dosyaları gösterir. Bunlardan sadece biri bizi ilgilendirir: programımızın kaynak dosyası, burada Form1.vb. Form1.vb dosyasına sağ tıklayarak, grafik arayüzümüzün kaynak koduna (Kodu Görüntüle) veya grafik arayüzün kendisine (Görünüm Tasarımcısı) erişmemizi sağlayan bir menü açılır:

Image

Bu iki öğeye "Çözüm Gezgini" penceresinden doğrudan erişilebilir:

 

Açık pencereler, ana tasarım penceresinde "birikir":

Image

Burada Form1.vb[Design] tasarım penceresini, Form1.vb ise kod penceresini ifade eder. Bir pencereden diğerine geçmek için sekmelerden birine tıklamak yeterlidir. VS.NET ekranında bulunan bir diğer önemli pencere ise özellikler penceresidir:

Image

Pencerede gösterilen özellikler, grafik tasarım penceresinde o anda seçili olan denetimin özellikleridir. Affichage menüsüyle projenin farklı pencerelerine erişilebilir:

Image

Burada, az önce açıklanan ana pencereler ve bunların klavye kısayolları yer almaktadır.

5.2.3. Bir projenin çalıştırılması

Henüz hiçbir kod yazmamış olsak da, çalıştırılabilir bir projemiz var. Projeyi çalıştırmak için F5 veya Déboguer/Démarrer komutunu verin. Aşağıdaki pencere açılır:

Image

Bu pencere büyütülebilir, simge durumuna getirilebilir, boyutlandırılabilir ve kapatılabilir.

5.2.4. VS.NET tarafından oluşturulan kod

Uygulamamızın koduna (Affichage/Code) bir göz atalım:


Public Class Form1
    Inherits System.Windows.Forms.Form

#Bölge "Windows Form Tasarımcısı tarafından oluşturulan kod"

    Public Sub New()
        MyBase.New()

        'Bu çağrı, Windows Form Tasarımcısı tarafından gereklidir.
        InitializeComponent()

        'InitializeComponent() çağrısından sonra herhangi bir başlatma ekleyin

    End Sub

    'Bileşen listesini temizlemek için formun Dispose yöntemini çağırır.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows Form Tasarımcısı tarafından gereklidir
    Private components As System.ComponentModel.IContainer

    'REMARQUE: Aşağıdaki yordam, Windows Form Tasarımcısı tarafından gereklidir
    'Windows Form Tasarımcısı kullanılarak değiştirilebilir.  
    'Kod düzenleyicisini kullanarak bunu değiştirmeyin.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
        Me.Text = "Form2"
    End Sub

#Bölge Sonu

End Class

System.Windows.Forms.Form temel sınıfından türetilmiş bir grafik arayüz:

Public Class Form1
    Inherits System.Windows.Forms.Form

Form temel sınıfı, kapatma ve büyütme/küçültme düğmeleri ile boyut ayarlama gibi özelliklere sahip bir temel pencere tanımlar ve bu grafik nesneler üzerindeki olayları yönetir. Form oluşturucu, form denetimlerinin oluşturulduğu ve başlatıldığı InitializeComponent yöntemini kullanır.


    Public Sub New()
        MyBase.New()

        'Bu çağrı, Windows Form Tasarımcısı tarafından zorunlu kılınmıştır.
        InitializeComponent()

        'InitializeComponent() çağrısından sonra herhangi bir başlatma kodu ekleyin
    End Sub

Oluşturucuda yapılması gereken diğer tüm işlemler, InitializeComponent çağrısından sonra gerçekleştirilebilir. InitializeComponent yöntemi


Private Sub InitializeComponent()
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 53)
        Me.Name = "Form1"
        Me.Text = "Form1"
    End Sub

"Form1" penceresinin başlığını, genişliğini (292) ve yüksekliğini (53) belirler. Pencerenin başlığı Text özelliği ile, boyutları ise Size özelliği ile belirlenir. Size, System.Drawing ad alanında tanımlanmıştır ve bir yapıdır. Bu uygulamayı çalıştırmak için projenin ana modülünü tanımlamamız gerekir. Bunun için [Projets/Propriétés] seçeneğini kullanırız:

Image

[Objet de démarrage] içinde, az önce oluşturduğumuz form olan [Form1]'i belirtiriz. Çalıştırmayı başlatmak için [Déboguer/Démarrer] seçeneğini kullanırız:

Image

5.2.5. DOS penceresinde derleme

Şimdi bu uygulamayı bir DOS penceresinde derleyip çalıştırmayı deneyelim:

dos>dir form1.vb
14/03/2004  11:53               514 Form1.vb

dos>vbc /r:system.dll /r:system.windows.forms.dll form1.vb

vbc : error BC30420: 'Sub Main' est introuvable dans 'Form1'.

Derleyici, [Main] prosedürünü bulamadığını bildiriyor. Nitekim, VS.NET bu prosedürü oluşturmamış. Ancak, önceki örneklerde bu prosedürle zaten karşılaşmıştık. Şu şekildedir:


    Shared Sub Main()
        ' uygulama başlatılıyor
        Application.Run(New Form1) ' où Form1 est le formulaire
    End Sub

[Form1.vb] koduna önceki kodu ekleyip yeniden derleyelim:

dos>vbc /r:system.dll /r:system.windows.forms.dll form2.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4

Form2.vb(41) : error BC30451: Le nom 'Application' n'est pas déclaré.

        Application.Run(New Form2)
        ~~~~~~~~~~~

Bu sefer, [Application] adı bilinmiyor. Bu, sadece [System.Windows.Forms] ad alanını içe aktarmadığımız anlamına gelir. Aşağıdaki komutu ekleyelim:

Imports System.Windows.Forms

ve ardından yeniden derleyelim:

dos>vbc /r:system.dll /r:system.windows.forms.dll form1.vb

Bu sefer başarılı oldu. Şunu çalıştıralım:

dos>dir
14/03/2004  11:53               514 Form1.vb
14/03/2004  12:15             3 584 Form1.exe

dos>form1

Image

Form1 türünde bir form oluşturulur ve görüntülenir. [Main] prosedürünün eklenmesini, derleyicinin /m seçeneğini kullanarak önleyebiliriz; bu seçenek, sınıfın System.Windows.Form'ten miras aldığı durumlarda çalıştırılacak sınıfı belirtmeye olanak tanır:

dos>vbc /r:system.dll /r:system.windows.forms.dll /r:system.drawing.dll /m:form2 form2.vb

/m:form2 seçeneği, çalıştırılacak sınıfın [form2] adlı sınıf olduğunu belirtir.

5.2.6. Olay Yönetimi

Form görüntülendikten sonra, uygulama formda meydana gelen olayları (tıklamalar, fare hareketleri vb.) dinlemeye başlar ve formun yönettiği olayları yürütür. Burada, formumuz Form temel sınıfı tarafından yönetilen olaylar (kapatma düğmelerine tıklamalar, büyütme/küçültme, pencere boyutunu değiştirme, pencereyi taşıma vb.) dışında başka hiçbir olayı yönetmez. Oluşturulan form, hiçbir yerde kullanılmayan bir components özniteliği kullanmaktadır. dispose yöntemi de burada hiçbir işe yaramıyor. Aynı durum, kullanılan bazı ad alanları (Collections, ComponentModel, Data) ve proje için tanımlanan projet1 ad alanı için de geçerlidir. Dolayısıyla, bu örnekte kod şu şekilde basitleştirilebilir:


Imports System
Imports System.Drawing
Imports System.Windows.Forms

Public Class Form1
    Inherits System.Windows.Forms.Form

    ' oluşturucu
    Public Sub New()
        ' formun bileşenleriyle birlikte oluşturulması
        InitializeComponent()
    End Sub

    Private Sub InitializeComponent()
        ' pencere boyutu
        Me.Size = New System.Drawing.Size(300, 300)
        ' pencerenin başlığı
        Me.Text = "Form1"
    End Sub

    Shared Sub Main()
        ' uygulamayı başlatıyoruz
        Application.Run(New Form1)
    End Sub
End Class

5.2.7. Sonuç

Şimdi VS.NET tarafından oluşturulan kodu olduğu gibi kabul edeceğiz ve özellikle formdaki çeşitli denetimlerle ilgili olayları yönetmek için kendi kodumuzu ekleyeceğiz.

5.3. Giriş alanı, düğme ve etiket içeren pencere

5.3.1. Grafik Tasarım

Önceki örnekte, pencereye herhangi bir bileşen eklememiştik. interface2 adlı yeni bir proje başlatıyoruz. Bunun için, daha önce açıklanan proje oluşturma prosedürünü takip ediyoruz:

Image

Şimdi bir düğme, bir etiket ve bir giriş alanı içeren bir pencere oluşturalım:

Alanlar şunlardır:

No
ad
tür
rol
1
lblSaisie
Etiket
bir açıklama
2
txtSaisie
TextBox
bir giriş alanı
3
btnAfficher
Düğme
giriş alanının içeriğini bir iletişim kutusunda görüntülemek için txtSaisie

Bu pencereyi oluşturmak için şu adımları uygulayabilirsiniz: pencerenin içinde herhangi bir bileşenin dışında sağ tıklayın ve pencerenin özelliklerine erişmek için Properties seçeneğini seçin:

Image

Bunun üzerine sağ tarafta özellikler penceresi açılır:

Image

Bu özelliklerden bazılarına dikkat etmek gerekir:

BackColor
pencerenin arka plan rengini ayarlamak için
ForeColor
penceredeki resimlerin veya metnin rengini ayarlamak için
Menu
pencereye bir menü eklemek için
Text
pencereye bir başlık vermek için
FormBorderStyle
pencere türünü belirlemek için
Font
penceredeki yazının yazı tipini belirlemek için
Name
pencerenin adını belirlemek için

Burada, Text ve Name özelliklerini belirliyoruz:

Text
Girişler ve düğmeler - 1
Name
frmSaisiesBoutons

"Araç Kutusu" çubuğunu kullanarak

  • ihtiyacınız olan bileşenleri seçin
  • bunları pencereye sürükleyip bırakın ve uygun boyutlarını ayarlayın
"Araç Kutusu"ndan bileşeni seçtikten sonra,
"Echap" tuşunu kullanarak araç çubuğunu gizleyin, ardından
ve bileşeni boyutlandırın. Gerekli olan üç bileşen için de
için de aynısını yapın: Label, TextBox, Button. Bileşenleri hizalamak ve
boyutlandırmak için Format menüsünü kullanın:
Biçimlendirme ilkesi şöyledir:
  1. birlikte biçimlendirilecek bileşenleri seçin (Ctrl tuşunu basılı tutun)
  2. istediğiniz biçimlendirme türünü seçin
Align seçeneği, bileşenleri hizalamanızı sağlar
Make Same Size seçeneği,
bileşenlerin aynı yüksekliğe veya aynı
genişliğe sahip olmasını sağlar:
"Horizontal Spacing" seçeneği, örneğin
bileşenleri, aralarındaki
aynı büyüklükte aralıklarla yatay olarak hizalanmasını sağlar. Aynı şekilde
Dikey Aralık seçeneği de dikey hizalama için aynı işlevi görür.
"Center in Form" seçeneği,
bir bileşeni yatay veya
dikey olarak pencerenin ortasına hizalamayı sağlar:
Bileşenler pencereye doğru şekilde
pencereye yerleştirildikten sonra, özelliklerini sabitleyin.
Bunun için bileşene sağ tıklayın ve
Properties seçeneğini seçin:
  • Etiket 1 (Label)
Bileşeni seçin ve
özellikler penceresini açın. Bu pencerede,
aşağıdaki özellikleri değiştirin:
ad: lblSaisie, metin:
  • giriş alanı 2 (TextBox)
Bileşeni seçin ve
özellikler penceresini açın. Bu pencerede,
şu özellikleri değiştirin:
ad: txtSaisie, metin: boş bırakın
  • 3 numaralı düğme (Button):
name: cmdAfficher, text:
  • Pencerenin kendisi: name: frmSaisies&Düğmeler,
text: Girişler & düğmeler - 1
Projemizi çalıştırabiliriz (Ctrl-F5)
çalıştırarak pencerenin
çalışırken nasıl göründüğüne dair ilk bir ön izleme elde edebiliriz:

Pencereyi kapatın. Şimdi, Afficher düğmesine tıklandığında çalışacak yordamı yazmamız gerekiyor.

5.3.2. Form olaylarının yönetimi

Grafik tasarımcı tarafından oluşturulan koda bir göz atalım:


...

Public Class frmSaisiesBoutons
  Inherits System.Windows.Forms.Form

  ' bileşenler
    Private components As System.ComponentModel.Container = Nothing
    Friend WithEvents btnAfficher As System.Windows.Forms.Button
    Friend WithEvents lblsaisie As System.Windows.Forms.Label
    Friend WithEvents txtsaisie As System.Windows.Forms.TextBox

  ' oluşturucu
  Public Sub New()
    InitializeComponent()
  End Sub

...

  ' bileşenlerin başlatılması
    Private Sub InitializeComponent()
...
    End Sub
End Class

Öncelikle bileşenlerin özel tanımlamasına dikkat edilmelidir:

  • Friend anahtar sözcüğü, bileşenin görünürlüğünün projedeki tüm sınıflara yayıldığını belirtir
  • WithEvents anahtar sözcüğü, bileşenin olaylar ürettiğini belirtir. Şimdi bu olayların nasıl yönetileceğine odaklanalım

Formun kod penceresini görüntüleyin (Görünüm/kod veya F7):

Yukarıdaki pencerede (1) ve (2) numaralı iki açılır liste bulunmaktadır. (1) numaralı liste, form bileşenlerinin listesidir:

Image

Liste (2), (1)'de seçilen bileşene ilişkin olayların listesidir:

Image

Bileşene ilişkin olaylardan biri kalın harflerle gösterilir (burada Click). Bu, bileşenin varsayılan olaydır. Bu belirli olayın işleyicisine erişim, tasarım penceresinde bileşene çift tıklanarak sağlanabilir. VB.net, kod penceresinde olay işleyicisinin iskeletini otomatik olarak oluşturur ve kullanıcıyı bu iskeletin üzerine konumlandırır. Diğer olayların işleyicilerine erişim ise kod penceresinde, listeden (1) bileşeni ve (2) olayını seçerek gerçekleştirilir. VB.net, olay işleyicisinin iskeletini oluşturur veya daha önce oluşturulmuşsa imleci üzerine getirir:


    Private Sub btnAfficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAfficher.Click
...
    End Sub

Varsayılan olarak, VB.net C_E, C bileşeninin E olayını işleyen işleyiciye bir ad verir. Bu ad, istenirse değiştirilebilir. Ancak bu tavsiye edilmez. VB geliştiricileri genellikle VB tarafından oluşturulan adı korurlar; bu da tüm VB programlarında adlandırma tutarlılığı sağlar. btnAfficher_Click yordamının btnAfficher bileşeninin Click olayına bağlanması, yordamın adıyla değil, handles anahtar sözcüğüyle yapılır:


Handles btnAfficher.Click

Yukarıda, handles anahtar sözcüğü, yordamın btnAfficher bileşeninin Click olayını yönettiğini belirtir. Önceki olay işleyicisinin iki parametresi vardır:

sender
olayın kaynağı olan nesne (burada düğme)
e
meydana gelen olayı detaylandıran bir EventArgs nesnesi

Burada bu parametrelerin hiçbirini kullanmayacağız. Geriye sadece kodu tamamlamak kalıyor. Burada, içinde txtSaisie alanının içeriğini barındıran bir iletişim kutusu görüntülemek istiyoruz:


    Private Sub btnAfficher_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        ' giriş kutusuna girilen metin görüntüleniyor TxtSaisie
        MessageBox.Show("texte saisi= " + txtsaisie.Text, "Vérification de la saisie", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

Uygulamayı çalıştırdığımızda şu sonuç elde edilir:

Image

5.3.3. Olayları yönetmenin başka bir yöntemi

btnAfficher düğmesi için, VS.NET şu kodu oluşturdu:


Private Sub InitializeComponent()
        ...
        '
        'btnAfficher
        '
        Me.btnAfficher.Location = New System.Drawing.Point(102, 48)
        Me.btnAfficher.Name = "btnAfficher"
        Me.btnAfficher.Size = New System.Drawing.Size(88, 24)
        Me.btnAfficher.TabIndex = 2
        Me.btnAfficher.Text = "Afficher"
...
    End Sub

...

    ' düğmeye tıklama olayı işleyicisi cmdAfficher
    Private Sub btnAfficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAfficher.Click
...
    End Sub

btnAfficher_Click prosedürünü, btnAfficher düğmesinin Click olayına başka bir şekilde bağlayabiliriz:


Private Sub InitializeComponent()
        ...
        '
        'btnAfficher
        '
        Me.btnAfficher.Location = New System.Drawing.Point(102, 48)
        Me.btnAfficher.Name = "btnAfficher"
        Me.btnAfficher.Size = New System.Drawing.Size(88, 24)
        Me.btnAfficher.TabIndex = 2
        Me.btnAfficher.Text = "Afficher"
        AddHandler btnAfficher.Click, AddressOf btnAfficher_Click
...
    End Sub

...

    ' cmdAfficher düğmesine tıklandığında etkin olay yöneticisi
    Private Sub btnAfficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
...
    End Sub

btnAfficher_Click yordamı, Handles anahtar sözcüğünü kaybetti ve dolayısıyla btnAfficher.Click olayıyla olan ilişkilendirmesini yitirdi. Bu ilişkilendirme artık AddHandler anahtar sözcüğü kullanılarak yapılmaktadır:


        AddHandler btnAfficher.Click, AddressOf btnAfficher_Click

Yukarıdaki kod, formun InitializeComponent prosedürüne yerleştirilecek ve btnAfficher.Click olayını btnAfficher_Click adlı prosedürle ilişkilendirecektir. Ayrıca, btnAfficher bileşeni artık WithEvents anahtar sözcüğüne ihtiyaç duymamaktadır:


    Friend btnAfficher As System.Windows.Forms.Button

Bu iki yöntem arasındaki fark nedir?

  • "handles" anahtar sözcüğü, bir olayı bir prosedüre yalnızca tasarım aşamasında ilişkilendirmeye izin verir. Tasarımcı, P prosedürünün E1, E2, ... olaylarını yönetmesi gerektiğini önceden bilir ve şu kodu yazar:

    Private Sub btnAfficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) handles E1, E2, ..., En

Aslında bir prosedürün birden fazla olayı yönetmesi mümkündür.

  • addhandler anahtar sözcüğü, yürütme sırasında bir olayı bir prosedüre ilişkilendirmeyi sağlar. Bu, olay üreticisi-tüketicisi yapısında yararlıdır. Bir nesne, diğer nesnelerin ilgisini çekebilecek belirli bir olay üretir. Bu nesneler, olayı almak için üreticiye abone olurlar (örneğin, kritik bir eşiği aşan bir sıcaklık). Uygulamanın yürütülmesi sırasında, olay üreticisi farklı komutları yürütmek zorunda kalacaktır:
Addhandler E, AddressOf P1
Addhandler E, AddressOf P2
...
Addhandler E, AddressOf Pn

burada E, üretici tarafından üretilen olaydır ve Pi, bu olayı tüketen farklı nesnelere ait prosedürlerdir. Bir sonraki bölümde, olay üreticisi-tüketicisi uygulamasına tekrar değineceğiz.

5.3.4. Sonuç

İncelenen iki projeden, VS.NET ile grafik arayüz oluşturulduktan sonra, geliştiricinin görevi bu grafik arayüz için yönetmek istediği olayların işleyicilerini yazmak olduğu sonucuna varabiliriz. Bundan sonra sadece bu işleyicilerin kodlarını sunacağız.

5.4. Bazı yararlı bileşenler

Şimdi, en yaygın bileşenleri kullanan çeşitli uygulamaları sunarak, bu bileşenlerin temel yöntem ve özelliklerini keşfedeceğiz. Her uygulama için, grafik arayüzü ve ilgili kodu, özellikle de olay işleyicileri sunacağız.

5.4.1. Form bileşeni

Öncelikle, bileşenlerin yerleştirildiği vazgeçilmez bileşen olan formu tanıtacağız. Bu bileşenin temel özelliklerinden bazılarını daha önce ele almıştık. Burada, bir formdaki bazı önemli olaylar üzerinde duracağız.

 
Form yükleniyor
Closing
Form kapatılıyor
Closed
form kapatıldı

Load olayı, form görüntülenmeden önce gerçekleşir. Closing olayı ise form kapatılırken gerçekleşir. Bu kapatma işlemini programlama yoluyla durdurmak mümkündür. Bileşen içermeyen, adı Form1 olan bir form oluşturuyoruz:

Image

Yukarıdaki üç olayı işliyoruz:


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' formun ilk yüklenmesi
        MessageBox.Show("Evt Load", "Load")
    End Sub

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        ' form kapanıyor
        MessageBox.Show("Evt Closing", "Closing")
        ' onay isteniyor
        Dim réponse As DialogResult = MessageBox.Show("Voulez-vous vraiment quitter l'application", "Closing", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        If réponse = DialogResult.No Then
            e.Cancel = True
        End If
    End Sub

    Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        ' form kapanıyor
        MessageBox.Show("Evt Closed", "Closed")
    End Sub
Çeşitli olaylardan haberdar olmak için MessageBox işlevini kullanıyoruz
olaylar hakkında uyarı almak için MessageBox işlevini kullanıyoruz. Closing olayı, kullanıcı
pencereyi kapattığında gerçekleşir.
Bu durumda, kullanıcıya uygulamadan gerçekten çıkmak isteyip istemediğini soruyoruz:
"Hayır" cevabını verirse, olayın
CancelEventArgs olayının Cancel özelliğini ayarlıyoruz.
Bu özelliği False olarak ayarlarsak,
işlemi iptal edilir, aksi takdirde devam eder:

5.4.2. Etiketler ve giriş kutuları TextBox

Bu iki bileşene daha önce rastlamıştık. Label bir metin bileşenidir ve TextBox bir giriş alanı bileşenidir. Ana özellikleri, giriş alanının içeriğini veya etiket metnini belirten Text'tir. Bu özellik okuma/yazma erişimine sahiptir. TextBox için genellikle kullanılan olay, kullanıcının giriş alanını değiştirdiğini bildiren TextChanged'tir. Aşağıda, bir giriş alanındaki değişiklikleri takip etmek için TextChanged olayını kullanan bir örnek verilmiştir:

no
tür
ad
rol
1
TextBox
txtSaisie
giriş alanı
2
Etiket
lblControle
1'deki metni gerçek zamanlı olarak görüntüler
3
Düğme
cmdEffacer
1 ve 2 numaralı alanları silmek için
4
Düğme
cmdQuitter
uygulamadan çıkmak için

Bu uygulamanın ilgili kodu, olay işleyicilerin kodudur:


  ' Çıkış düğmesine tıklama
    Private Sub cmdQuitter_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles cmdQuitter.Click
        ' "Çıkış" düğmesine tıklama - uygulamadan çıkılıyor
        Application.Exit()
    End Sub

    ' txtSaisie alanında değişiklik yapıldı
    Private Sub txtSaisie_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles txtSaisie.TextChanged
        ' TextBox'in içeriği değişti - lblControle etiketine kopyalanıyor
        lblControle.Text = txtSaisie.Text
    End Sub

    ' sil düğmesine tıklama
    Private Sub cmdEffacer_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles cmdEffacer.Click
        ' giriş kutusunun içeriği siliniyor
        txtSaisie.Text = ""
    End Sub

    ' bir tuşa basıldı
    Private Sub txtSaisie_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _
    Handles txtSaisie.KeyPress
        ' hangi tuşa basıldığı kontrol ediliyor
        Dim touche As Char = e.KeyChar
        If touche = ControlChars.Cr Then
            MessageBox.Show(txtSaisie.Text, "Contrôle", MessageBoxButtons.OK, MessageBoxIcon.Information)
            e.Handled = True
        End If
    End Sub

cmdQuitter_Click prosedüründe uygulamanın nasıl sonlandırılacağına dikkat edin: Application.Exit(). Aşağıdaki örnekte çok satırlı bir TextBox kullanılmaktadır:

Kontrol listesi şöyledir:

No
tür
ad
rol
1
TextBox
txtMultiLignes
çok satırlı giriş alanı
2
TextBox
txtAjout
tek satırlık giriş alanı
3
Düğme
btnAjouter
2'den 1'e içerik ekler

Bir TextBox'in çok satırlı hale gelmesi için kontrolün aşağıdaki özellikleri ayarlanır:

 
birden fazla satır metin kabul etmek için
ScrollBars=( None, Horizontal, Vertical, Both)
kontrolün kaydırma çubuklarına sahip olmasını (Yatay, Dikey, Her İkisi) veya sahip olmamasını (Yok) belirlemek için
AcceptReturn=(True, False)
true değerine ayarlandığında, Enter tuşu satır sonu işlevi görür
AcceptTab=(True, False)
true değerine ayarlanırsa, Tab tuşu metinde bir sekme oluşturur

Yararlı kod, [Ajouter] düğmesine tıklamayı işleyen kod ve [txtAjout] giriş alanındaki değişikliği işleyen koddur:


    ' muhtemelen btnAjouter_Click
    Private Sub btnAjouter_Click1(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnAjouter.Click
        ' txtAjout içeriği, txtMultilignes içeriğine ekleniyor
        txtMultilignes.Text &= txtAjout.Text
        txtAjout.Text = ""
    End Sub

    ' veya txtAjout_TextChanged
    Private Sub txtAjout_TextChanged1(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles txtAjout.TextChanged
        ' "Ekle" düğmesinin durumunu belirliyoruz
        btnAjouter.Enabled = txtAjout.Text.Trim() <> ""
    End Sub

5.4.3. açılır listeler ComboBox

ComboBox bileşeni, bir giriş alanı ile birlikte açılır menüdür: kullanıcı (2) içinden bir öğe seçebilir veya (1) içine metin girebilir. Style özelliği ile belirlenen üç tür ComboBox vardır:

 
açılır liste içermeyen, düzenleme alanı bulunan
DropDown
düzenleme alanı içeren açılır liste
DropDownList
düzenleme alanı olmayan açılır liste

Varsayılan olarak, bir ComboBox nesnesinin türü DropDown'tir. ComboBox sınıfını incelemek için yardım dizinine (Aide/Index) ComboBox yazın. ComboBox sınıfının tek bir oluşturucusu vardır:

Public Sub New()
boş bir ComboBox nesnesi oluşturur

ComboBox sınıfının elemanları, Items özelliğinde bulunur:

Public ReadOnly Property Items As ComboBox.ObjectCollection

Bu, indeksli bir özelliktir; Items(i), Combo'nun i numaralı öğesini belirtir. C bir Combo ve C.Items onun öğe listesi olsun. Aşağıdaki özellikler mevcuttur:

 
Combo'daki öğe sayısı
C.Items(i)
Combo'nun i numaralı öğesi
C.Add(object o)
o nesnesini kombinasyonun son öğesi olarak ekler
C.AddRange(object() objets)
kombinasyonun sonuna bir nesne tablosu ekler
C.Insert(int i, object o)
o nesnesini kombo menüsünün i konumuna ekler
C.RemoveAt(int i)
kombinasyon menüsünden i numaralı öğeyi kaldırır
C.Remove(object o)
o nesnesini kombo listesinden kaldır
C.Clear()
kombinasyondaki tüm öğeleri sil
C.IndexOf(object o)
o nesnesinin i konumunu açılır menüde göster

Bir açılır menünün normalde karakter dizeleri içerirken nesneler de içerebilmesi şaşırtıcı gelebilir. Görsel olarak durum böyledir. Bir ComboBox nesnesi, obj nesnesini içeriyorsa, obj.ToString dizesini görüntüler() dizesi görüntülenir. Hatırlanacağı üzere, her nesne, object sınıfından miras alınan ve nesneyi "temsil eden" bir karakter dizesi döndüren ToString yöntemine sahiptir. C açılır menüsünde seçilen öğe C.SelectedItem veya C.Items(C.SelectedIndex) şeklindedir; burada C.SelectedIndex, seçilen öğenin numarasıdır, bu numara ilk öğe için sıfırdan başlar.

Açılır listeden bir öğe seçildiğinde SelectedIndexChanged olayı tetiklenir; bu olay, açılır menüdeki seçim değişikliği hakkında uyarı almak için kullanılabilir. Aşağıdaki uygulamada, bu olayı kullanarak listeden seçilen öğeyi görüntülüyoruz.

Image

Sadece pencerenin ilgili kodunu sunuyoruz. Form oluşturucusunda açılır menüyü şu şekilde dolduruyoruz:


  Public Sub New()
    ' form oluşturma
    InitializeComponent()
    ' açılır menüyü doldurma
    cmbNombres.Items.AddRange(New String() {"zéro", "un", "deux", "trois", "quatre"})
        ' listenin ilk öğesini seçiyoruz
    cmbNombres.SelectedIndex = 0
  End Sub

Yeni bir öğenin seçildiğini bildiren açılır menünün SelectedIndexChanged olayını işliyoruz:


    Private Sub cmbNombres_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles cmbNombres.SelectedIndexChanged
        ' seçilen öğe değişti - görüntüleniyor
        MessageBox.Show("Elément sélectionné : (" & cmbNombres.SelectedItem.ToString & "," & cmbNombres.SelectedIndex & ")", "Combo", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub

5.4.4. ListBox bileşeni

Aşağıdaki arayüzü oluşturmayı planlıyoruz:

Bu pencerenin bileşenleri şunlardır:

No
tür
ad
rol/özellikler
0
Form
Form1
form - BorderStyle=FixedSingle
1
TextBox
txtSaisie
giriş alanı
2
Düğme
btnAjouter
1 numaralı giriş alanının içeriğini 3 numaralı listeye eklemeye yarayan düğme
3
ListBox
listBox1
Liste 1
4
ListBox
listBox2
Liste 2
5
Düğme
btn1TO2
Liste 1'den seçilen öğeleri Liste 2'ye aktarır
6
Düğme
cmd2T0
tersi işlemi yapar
7
Düğme
btnEffacer1
Listeyi boşalt 1
8
Düğme
btnEffacer2
Liste 2'yi boşalt
  • Kullanıcı, alan 1'e metin girer. Ajouter (2) düğmesini kullanarak bunu liste 1'e ekler. Ardından giriş alanı (1) boşaltılır ve kullanıcı yeni bir öğe ekleyebilir.
  • Kullanıcı, listelerden birini seçip aktarılacak öğeyi belirledikten sonra uygun aktarım düğmesi 5 veya 6'yı seçerek öğeleri bir listeden diğerine aktarabilir. Aktarılan öğe, hedef listenin sonuna eklenir ve kaynak listeden kaldırılır.
  • Kullanıcı, Liste 1'deki bir öğeye çift tıklayabilir. Bu durumda söz konusu öğe, düzenleme amacıyla giriş kutusuna aktarılır ve Liste 1'den kaldırılır.

Düğmeler aşağıdaki kurallara göre yanar veya söner:

  • Ajouter düğmesi, yalnızca giriş alanında boş olmayan bir metin varsa yanar
  • Liste 1'den Liste 2'ye aktarım düğmesi 5, yalnızca Liste 1'de seçili bir öğe varsa yanar
  • Liste 2'den Liste 1'e aktarım düğmesi (6), yalnızca Liste 2'de seçili bir öğe varsa yanar
  • Liste 1 ve 2'yi silme düğmeleri 7 ve 8, yalnızca silinecek listede öğeler varsa yanar.

Yukarıdaki koşullarda, uygulama başlatıldığında tüm düğmelerin kapalı olması gerekir. Bu durumda, düğmelerin Enabled özelliğini false olarak ayarlamak gerekir. Bunu tasarım aşamasında yapabiliriz; bu durumda InitializeComponent yönteminde ilgili kod otomatik olarak oluşturulur. Alternatif olarak, aşağıda gösterildiği gibi oluşturucuda kendimiz de yapabiliriz:


    Public Sub New()
        ' formun ilk oluşturulması
        InitializeComponent()
        ' ek başlatma işlemleri
        ' bazı düğmelerin devre dışı bırakılması
        btnAjouter.Enabled = False
        btn1TO2.Enabled = False
        btn2TO1.Enabled = False
        btnEffacer1.Enabled = False
        btnEffacer2.Enabled = False
    End Sub

Ajouter düğmesinin durumu, giriş alanının içeriği tarafından kontrol edilir. Bu içeriğindeki değişiklikleri takip etmemizi sağlayan olay TextChanged'tir:


    ' metin girişi alanında değişiklik
    Private Sub txtSaisie_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles txtSaisie.TextChanged
        ' txtSaisie'in içeriği değişti
        ' "Ekle" düğmesi yalnızca giriş alanı boş değilse etkinleştirilir
        btnAjouter.Enabled = txtSaisie.Text.Trim() <> ""
    End Sub

Aktarım düğmelerinin durumu, kontrol ettikleri listeden bir öğenin seçilip seçilmediğine bağlıdır:


    ' listbox1 olmadan seçili öğe değiştirildi
    Private Sub listBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles listBox1.SelectedIndexChanged

        ' bir öğe seçildi
        ' 1'den 2'ye aktarım düğmesi etkinleştirilir
        btn1TO2.Enabled = True
    End Sub

    ' listbox2 olmadan seçili öğe değiştirildi
    Private Sub listBox2_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles listBox2.SelectedIndexChanged
        ' bir öğe seçildi
        ' 2'den 1'e aktarım düğmesi etkinleştirildi
        btn2TO1.Enabled = True
    End Sub

Ajouter düğmesine tıklanmasıyla ilişkili kod şöyledir:


    ' "Ekle" düğmesine tıklanır
    Private Sub btnAjouter_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnAjouter.Click
        ' Liste 1'e yeni bir öğe eklendi
        listBox1.Items.Add(txtSaisie.Text.Trim())
        ' giriş silindi
        txtSaisie.Text = ""
        ' Liste 1 boş değil
        btnEffacer1.Enabled = True
        ' odak giriş kutusuna geri dönüyor
        txtSaisie.Focus()
    End Sub

Formdaki bir denetime "odak" yerleştirmeye olanak tanıyan Focus yöntemine dikkat edilmelidir. Effacer düğmelerine tıklanmasıyla ilişkili kod:


    ' Sil1 düğmesine tıklama
    Private Sub btnEffacer1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnEffacer1.Click
        ' Liste 1 siliniyor
        listBox1.Items.Clear()
        btnEffacer1.Enabled = False
    End Sub

    ' Sil2 düğmesine tıklama
    Private Sub btnEffacer2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        ' Liste 2 siliniyor
        listBox2.Items.Clear()
        btnEffacer2.Enabled = False
    End Sub

Seçilen öğeleri bir listeden diğerine aktaran kod:


    ' "btn1to2" düğmesine tıklayın
    Private Sub btn1TO2_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btn1TO2.Click
        ' seçili öğeyi Liste 1'den Liste 2'ye aktarıyor
        transfert(listBox1, listBox2)
        ' Sil düğmeleri
        btnEffacer2.Enabled = True
        btnEffacer1.Enabled = listBox1.Items.Count <> 0
        ' aktarım düğmeleri
        btn1TO2.Enabled = False
        btn2TO1.Enabled = False
    End Sub

    ' btn btn2to1 düğmesine tıklama
    Private Sub btn2TO1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btn2TO1.Click
        ' Liste 2'de seçilen öğenin Liste 1'e aktarılması
        transfert(listBox2, listBox1)
        ' Sil düğmeleri
        btnEffacer1.Enabled = True
        btnEffacer2.Enabled = listBox2.Items.Count <> 0
        ' aktarım düğmeleri
        btn1TO2.Enabled = False
        btn2TO1.Enabled = False
    End Sub

    ' aktarım
    Private Sub transfert(ByVal l1 As ListBox, ByVal l2 As ListBox)
        ' seçilen öğenin Liste 1'den Liste 2'ye aktarılması
        ' Seçili bir öğe mi?
        If l1.SelectedIndex = -1 Then Return
        ' l2'ye ekleme
        l2.Items.Add(l1.SelectedItem)
        ' l1'den silme
        l1.Items.RemoveAt(l1.SelectedIndex)
    End Sub

Öncelikle bir yöntem oluşturuyoruz


    Private Sub transfert(ByVal l1 As ListBox, ByVal l2 As ListBox)

adlı bir yöntem oluşturuyoruz; bu yöntem, l1 listesinden seçilen öğeyi l2 listesine aktarır. Bu sayede, bir öğeyi listBox1 listesinden listBox2 listesine veya listBox2 listesinden listBox1 listesine aktarmak için iki yöntem yerine tek bir yöntem kullanabiliriz. Aktarımı gerçekleştirmeden önce, l1 listesinde bir öğenin seçili olduğundan emin oluruz:


        ' seçili bir öğe mi?
        If l1.SelectedIndex = -1 Then Return

Şu anda hiçbir öğe seçili değilse, SelectedIndex özelliği -1 değerindedir. Prosedürlerde


    Private Sub btnXTOY_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnXTOY.Click

işlemlerinde, X listesinden Y listesine aktarım yapılır ve listelerin yeni durumunu yansıtmak için bazı düğmelerin durumu değiştirilir.

5.4.5. onay kutuları CheckBox, radyo düğmeleri ButtonRadio

Aşağıdaki uygulamayı yazmayı planlıyoruz:

Pencerenin bileşenleri şunlardır:

no
tür
isim
rol
1
RadioButton
radioButton1
radioButton2
radioButton3
3 radyo düğmesi
2
CheckBox
chechBox1
chechBox2
chechBox3
3 onay kutusu
3
ListBox
lstValeurs
bir liste

Üç radyo düğmesi arka arkaya oluşturulursa, varsayılan olarak aynı grubun parçası olurlar. Dolayısıyla biri işaretlendiğinde diğerleri işaretlenmez. Bu altı kontrol için bizi ilgilendiren olay, onay kutusu veya radyo düğmesinin durumunun değiştiğini belirten CheckChanged olaydır. Bu durum, her iki durumda da Check Boole özelliği ile temsil edilir; bu özelliğin değeri "true" ise, kontrolün işaretli olduğu anlamına gelir. Burada, altı CheckChanged olayını işlemek için tek bir yöntem kullandık: affiche yöntemi:


  ' görüntüler
    Private Sub affiche(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles checkBox1.CheckedChanged, checkBox2.CheckedChanged, checkBox3.CheckedChanged, _
    radioButton1.CheckedChanged, radioButton2.CheckedChanged, radioButton3.CheckedChanged
        ' radyo düğmesinin veya onay kutusunun durumunu gösterir
        ' bu bir onay kutusu mu?
        If (TypeOf (sender) Is CheckBox) Then
            Dim chk As CheckBox = CType(sender, CheckBox)
            lstValeurs.Items.Insert(0, chk.Name & "=" & chk.Checked)
        End If
        ' Bu bir radyo düğmesi mi?
        If (TypeOf (sender) Is RadioButton) Then
            Dim rdb As RadioButton = CType(sender, RadioButton)
            lstValeurs.Items.Insert(0, rdb.Name & "=" & rdb.Checked)
        End If
    End Sub

TypeOf (gönderen) Is CheckBox sözdizimi, sender nesnesinin CheckBox türünde olup olmadığını kontrol etmemizi sağlar. Bu sayede, sender nesnesinin tam türüne dönüştürme işlemi gerçekleştirebiliriz. affiche yöntemi, lstValeurs listesine, olayı tetikleyen bileşenin adını ve Checked özelliğinin değerini yazar. Çalıştırıldığında, bir radyo düğmesine tıklanmasının iki CheckChanged olayı tetiklediği görülür: biri eski onaylı düğmede ("onaylı" durumundan "onaylanmamış" durumuna geçer) ve diğeri yeni düğmede ("onaylı" durumuna geçer).

5.4.6. ScrollBar kontrol elemanları

Çeşitli ayarlayıcı türleri vardır: yatay ayarlayıcı (hScrollBar),
dikey değişken (vScrollBar) ve artıcı (NumericUpDown).

Şu uygulamayı gerçekleştirelim:

no
tür
ad
rol
1
hScrollBar
hScrollBar1
bir yatay frekans dönüştürücü
2
hScrollBar
hScrollBar2
1 numaralı sürücünün değişikliklerini takip eden bir yatay sürücü
3
TextBox
txtValeur
yatay sürücünün değerini gösterir
Giriş yapılmasını engellemek için ReadOnly=true
4
NumericUpDown
artırıcı
2 numaralı kaydırıcının değerini sabitlemek için kullanılır
  • Bir ScrollBar kaydırıcı, kullanıcının, üzerinde bir imleç hareket eden kaydırıcının "şeridi" ile simgelenen tamsayı aralığından bir değer seçmesine olanak tanır. Kaydırıcının değeri, Value özelliğinde bulunur.
  • Yatay bir kaydırıcıda sol uç aralığın minimum değerini, sağ uç ise maksimum değerini temsil eder; imleç ise seçili olan mevcut değeri gösterir. Dikey bir kaydırıcıda ise minimum değer üst uçta, maksimum değer ise alt uçta gösterilir. Bu değerler Minimum ve Maximum özellikleriyle temsil edilir ve varsayılan olarak 0 ile 100 arasındadır.
  • Kaydırıcının uçlarına tıklamak, tıklanan uca göre değeri bir artış (pozitif veya negatif) kadar değiştirir; bu artış, varsayılan olarak 1 olan SmallChange olarak adlandırılır.
  • Kaydırıcının her iki yanına tıklamak, tıklandığı uca göre değeri bir artış (pozitif veya negatif) kadar değiştirir; bu artış miktarı LargeChange olarak adlandırılır ve varsayılan değeri 10'dur.
  • Dikey bir kaydırıcının üst ucuna tıklandığında, değeri azalır. Bu durum, normalde değerin "artmasını" bekleyen ortalama bir kullanıcıyı şaşırtabilir. Bu sorun, SmallChange ve LargeChange özelliklerine negatif bir değer atanarak çözülür.
  • Bu beş özellik (Value, Minimum, Maximum, SmallChange, LargeChange) okuma ve yazma işlemlerine açıktır.
  • Sürücünün ana olayı, bir değer değişikliğini bildiren Scroll olayıdır.

NumericUpDown bileşeni sürücünün yakınında bulunur: bu bileşen de Minimum, Maximum ve Value özelliklerine sahiptir; varsayılan değerleri sırasıyla 0, 100, 0'dır. Ancak burada, Value özelliği, kontrolün ayrılmaz bir parçası olan bir giriş kutusunda görüntülenir. Kontrolün ReadOnly özelliği "true" olarak ayarlanmadıkça, kullanıcı bu değeri kendisi değiştirebilir. Artış değeri, Increment özelliği ile belirlenir; varsayılan değeri 1'dir. NumericUpDown bileşeninin ana olayı, değer değişikliğini bildiren olaydır: ValueChanged olayı. Uygulamamızın ilgili kodu şöyledir:

Form, oluşturulurken biçimlendirilir:


    ' oluşturucu
    Public Sub New()
        ' formun ilk oluşturulması
        InitializeComponent()
        ' 2 numaralı sürücüye 1 numaralı sürücüyle aynı özellikler verilir
        hScrollBar2.Minimum = hScrollBar1.Value
        hScrollBar2.Minimum = hScrollBar1.Minimum
        hScrollBar2.Maximum = hScrollBar1.Maximum
        hScrollBar2.LargeChange = hScrollBar1.LargeChange
        hScrollBar2.SmallChange = hScrollBar1.SmallChange
        ' artırıcı için de aynısı geçerlidir
        incrémenteur.Minimum = hScrollBar1.Value
        incrémenteur.Minimum = hScrollBar1.Minimum
        incrémenteur.Maximum = hScrollBar1.Maximum
        incrémenteur.Increment = hScrollBar1.SmallChange
        ' TextBox'e 1 numaralı sürücünün değeri atanır
        txtValeur.Text = "" & hScrollBar1.Value
    End Sub

Sürücü 1'in değer değişikliklerini izleyen işleyici:


    ' hscrollbar1 sürücüsünün yönetimi
    Private Sub hScrollBar1_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _
    Handles hScrollBar1.Scroll
        ' 1 numaralı sürücünün değerinin değiştirilmesi
        ' değeri, 2 numaralı kaydırıcıya ve TxtValeur metin kutusuna yansıtılır
        hScrollBar2.Value = hScrollBar1.Value
        txtValeur.Text = "" & hScrollBar1.Value
    End Sub

2 numaralı sürücünün değer değişikliklerini izleyen yönetici:


    ' hscrollbar2 kaydırma çubuğu yönetimi
    Private Sub hScrollBar2_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) _
    Handles hScrollBar2.Scroll
        ' regülatör 2'deki tüm değişiklikler engellenir
        ' sürücü 1'in değerini korumaya zorlayarak
        e.NewValue = hScrollBar1.Value
    End Sub

incrémenteur kontrolündeki değişiklikleri izleyen yönetici:


    ' artırıcı yönetimi
    Private Sub incrémenteur_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles incrémenteur.ValueChanged
        ' 2 numaralı sürücünün değeri sabitlenir
        hScrollBar2.Value = CType(incrémenteur.Value, Integer)
    End Sub

5.5. Fare olayları

Bir kap içinde çizim yaparken, örneğin tıklama sırasında bir nokta görüntülemek için farenin konumunu bilmek önemlidir. Farenin hareketleri, farenin içinde hareket ettiği kapta olaylara neden olur.

 
fare, kontrol alanına yeni girdi
MouseLeave
fare kontrol alanından çıktı
MouseMove
fare kontrol alanı içinde hareket ediyor
MouseDown
Farenin sol tuşuna basıldı
MouseUp
Farenin sol tuşunun bırakılması
DragDrop
Kullanıcı bir nesneyi denetim üzerine bırakır
DragEnter
Kullanıcı bir nesneyi sürükleyerek kontrol alanına girer
DragLeave
kullanıcı bir nesneyi sürükleyerek kontrol alanından çıkar
DragOver
kullanıcı bir nesneyi sürükleyerek kontrol alanının üzerinden geçer

Aşağıda, farklı fare olaylarının ne zaman gerçekleştiğini daha iyi anlamanıza yardımcı olacak bir program bulunmaktadır:

No
tür
ad
rol
1
Etiket
lblPosition
Form 1, Liste 2 veya Düğme 3'te farenin konumunu görüntülemek için
2
ListBox
lstEvts
MouseMove dışındaki fare olaylarını görüntülemek için
3
Düğme
btnEffacer
2'nin içeriğini silmek için

Olay işleyicileri şunlardır. Üç kontrol üzerindeki fare hareketlerini izlemek için tek bir işleyici yazılır:


    ' muhtemelen form1_mousemove
    Private Sub Form1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
    Handles MyBase.MouseMove, lstEvts.MouseMove, btnEffacer.MouseMove, lstEvts.MouseMove
        ' fare hareketi - farenin (X,Y) koordinatlarını göster
        lblPosition.Text = "(" & e.X & "," & e.Y & ")"
    End Sub

Farenin bir kontrolün alanına her girdiğinde koordinat sisteminin değiştiğini bilmek gerekir. Koordinat sisteminin başlangıç noktası (0,0), farenin üzerinde bulunduğu kontrolün sol üst köşesidir. Böylece, çalıştırma sırasında fareyi formdan düğmeye getirdiğimizde koordinatlardaki değişikliği açıkça görebiliriz. Farenin alanındaki bu değişiklikleri daha iyi görebilmek için, denetimlerin Cursor özelliğini kullanabiliriz:

Image

Bu özellik, fare kontrol alanına girdiğinde fare imlecinin şeklini belirlemeye olanak tanır. Dolayısıyla örneğimizde, aşağıdaki ekran görüntülerinde gösterildiği gibi, imleci formun kendisi için Default, Liste 2 için Hand ve Düğme 3 için No olarak ayarladık.

Image

Image

Image

[InitializeComponent] yönteminde, bu seçimler sonucunda oluşturulan kod şöyledir:


        Me.lstEvts.Cursor = System.Windows.Forms.Cursors.Hand
        Me.btnEffacer.Cursor = System.Windows.Forms.Cursors.No

Ayrıca, Liste 2'deki fare giriş ve çıkışlarını algılamak için, aynı listedeki MouseEnter ve MouseLeave olaylarını işliyoruz:


    ' olası lstEvts_MouseEnter
    Private Sub lstEvts_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles lstEvts.MouseEnter
        affiche("MouseEnter sur liste")
    End Sub

    ' lstEvts_MouseLeave olayı
    Private Sub lstEvts_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles lstEvts.MouseLeave
        affiche("MouseLeave sur liste")
    End Sub
    
' görüntüler
    Private Sub affiche(ByVal message As String)
        ' mesaj, olay listesinin en üstünde görüntülenir
        lstEvts.Items.Insert(0, message)
    End Sub

Image

Formdaki tıklamaları işlemek için MouseDown ve MouseUp olaylarını işliyoruz:


    ' olay Form1_MouseDown
    Private Sub Form1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
    Handles MyBase.MouseDown
        affiche("MouseDown sur formulaire")
    End Sub

    ' Form1_MouseUp olayı
    Private Sub Form1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
    Handles MyBase.MouseUp
        affiche("MouseUp sur formulaire")
    End Sub

Image

Son olarak, Effacer düğmesine yapılan tıklamaları işleyen kod:


    ' olay btnEffacer_Click
    Private Sub btnEffacer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles btnEffacer.Click
        ' olay listesini siler
        lstEvts.Items.Clear()
    End Sub

5.6. Menülü bir pencere oluşturma

Şimdi menülü bir pencereyi nasıl oluşturacağımıza bakalım. Aşağıdaki pencereyi oluşturacağız:

1 numaralı kontrol, salt okunur (ReadOnly=true) ve adı txtStatut olan bir TextBox'tir. Menü ağacı şu şekildedir:

Menü seçenekleri, diğer görsel bileşenler gibi denetimlerdir ve özellikleri ile olayları vardır. Örneğin, A1 menü seçeneğinin özellik tablosu:

Image

Örneğimizde iki özellik kullanılmaktadır:

 
menü kontrolünün adı
Text
menü seçeneğinin etiketi

Örneğimizdeki farklı menü seçeneklerinin özellikleri şunlardır:

Ad
Metin
mnuA
Seçenekler A
mnuA1
A1
mnuA2
A2
mnuA3
A3
mnuB
B seçenekleri
mnuB1
B1
mnuSep1
- (ayırıcı)
mnuB2
B2
mnuB3
B3
mnuB31
B31
mnuB32
B32

Bir menü oluşturmak için, "ToolBox" çubuğundan "MainMenu" bileşenini seçin:

Image

Böylece, "Type Here" başlıklı boş kutucuklar içeren boş bir menü formun üzerine yerleştirilir. Menüdeki farklı seçenekleri buraya girmeniz yeterlidir:

Image

Yukarıdaki örnekte olduğu gibi, B1 ve B2 seçenekleri arasına bir ayırıcı eklemek için, menüde ayırıcının yerleştirileceği konuma gelin, sağ tıklayın ve "Insert Separator" seçeneğini seçin:

Image

Uygulamayı Ctrl+F5 tuşlarıyla çalıştırdığımızda, şimdilik hiçbir işlevi olmayan bir menü içeren bir form karşımıza çıkar. Menü seçenekleri bileşenler gibi işlenir: özellikleri ve olayları vardır. [fenêtre de code]'te, mnuA1 bileşenini seçin ve ardından ilgili olayları seçin:

Image

Yukarıda Click olayı oluşturulursa, VS.NET otomatik olarak aşağıdaki yordamı oluşturur:


Private Sub mnuA1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuA.Click
....
    End Sub

Tüm menü seçenekleri için bu şekilde ilerleyebiliriz. Burada, tüm seçenekler için aynı prosedür kullanılabilir. Bu nedenle, önceki prosedürü affiche olarak yeniden adlandırıyoruz ve bu prosedürün yönettiği olayları tanımlıyoruz:


    Private Sub affiche(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles mnuA1.Click, mnuA2.Click, mnuB1.Click, mnuB2.Click, mnuB31.Click, mnuB32.Click
        ' seçilen alt menünün adını TextBox içinde görüntüler
        txtStatut.Text = (CType(sender, MenuItem)).Text
    End Sub

Bu yöntemde, olay kaynağındaki menü seçeneğinin Text özelliğini görüntülemekle yetiniyoruz. sender olay kaynağının türü object’tir. Menü seçenekleri ise MenuItem türündedir; bu nedenle burada object'ten MenuItem'e tür dönüştürme yapmak zorundayız. Uygulamayı çalıştırın ve A1 seçeneğini seçin; ardından şu mesajı göreceksiniz:

Image

Bu uygulamanın yararlı kodu, affiche yönteminin kodunun yanı sıra, form oluşturucuda menünün oluşturulmasına ilişkin koddur (InitializeComponent):


  Private Sub InitializeComponent()
    Me.mainMenu1 = New System.Windows.Forms.MainMenu
    Me.mnuA = New System.Windows.Forms.MenuItem
    Me.mnuA1 = New System.Windows.Forms.MenuItem
    Me.mnuA2 = New System.Windows.Forms.MenuItem
    Me.mnuA3 = New System.Windows.Forms.MenuItem
    Me.mnuB = New System.Windows.Forms.MenuItem
    Me.mnuB1 = New System.Windows.Forms.MenuItem
    Me.mnuB2 = New System.Windows.Forms.MenuItem
    Me.mnuB3 = New System.Windows.Forms.MenuItem
    Me.mnuB31 = New System.Windows.Forms.MenuItem
    Me.mnuB32 = New System.Windows.Forms.MenuItem
    Me.txtStatut = New System.Windows.Forms.TextBox
    Me.mnuSep1 = New System.Windows.Forms.MenuItem
    Me.SuspendLayout()
    ' 
    ' mainMenu1
    ' 
    Me.mainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuA, Me.mnuB})

    ' 
    ' mnuA
    ' 
    Me.mnuA.Index = 0
    Me.mnuA.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuA1, Me.mnuA2, Me.mnuA3})
    Me.mnuA.Text = "Options A"
    ' 
    ' mnuA1
    ' 
    Me.mnuA1.Index = 0
    Me.mnuA1.Text = "A1"
        ' 
    ' mnuA2
    ' 
    Me.mnuA2.Index = 1
    Me.mnuA2.Text = "A2"
        ' 
    ' mnuA3
    ' 
    Me.mnuA3.Index = 2
    Me.mnuA3.Text = "A3"
        ' 
    ' mnuB
    ' 
    Me.mnuB.Index = 1
    Me.mnuB.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuB1, Me.mnuSep1, Me.mnuB2, Me.mnuB3})

    Me.mnuB.Text = "Options B"
    ' 
    ' mnuB1
    ' 
    Me.mnuB1.Index = 0
    Me.mnuB1.Text = "B1"
        ' 
    ' mnuB2
    ' 
    Me.mnuB2.Index = 2
    Me.mnuB2.Text = "B2"

    ' 
    ' mnuB3
    ' 
    Me.mnuB3.Index = 3
    Me.mnuB3.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuB31, Me.mnuB32})
    Me.mnuB3.Text = "B3"
        ' 
    ' mnuB31
    ' 
    Me.mnuB31.Index = 0
    Me.mnuB31.Text = "B31"
        ' 
    ' mnuB32
    ' 
    Me.mnuB32.Index = 1
    Me.mnuB32.Text = "B32"
        ' 
    ' txtStatut
    ' 
    Me.txtStatut.Location = New System.Drawing.Point(8, 8)
    Me.txtStatut.Name = "txtStatut"
    Me.txtStatut.ReadOnly = True
    Me.txtStatut.Size = New System.Drawing.Size(112, 20)
    Me.txtStatut.TabIndex = 0
    Me.txtStatut.Text = ""
    ' 
    ' mnuSep1
    ' 
    Me.mnuSep1.Index = 1
    Me.mnuSep1.Text = "-"
    ' 
    ' Form1
    ' 
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(136, 42)
    Me.Controls.Add(txtStatut)
    Me.Menu = Me.mainMenu1
    Me.Name = "Form1"
    Me.Text = "Menus"
    Me.ResumeLayout(False)
  End Sub

Menüyü forma bağlayan komut dikkat çekicidir:


    Me.Menu = Me.mainMenu1

5.7. Görsel olmayan bileşenler

Şimdi bir dizi görsel olmayan bileşene odaklanacağız: bunlar tasarım aşamasında kullanılır, ancak yürütme sırasında görünmezler.

5.7.1. OpenFileDialog ve SaveFileDialog iletişim kutuları

Şu uygulamayı oluşturacağız:

Kontroller şunlardır:

No
tür
ad
rol
1
TextBox çok satırlı
txtTexte
kullanıcı tarafından yazılan veya bir dosyadan yüklenen metin
2
Düğme
btnSauvegarder
1'deki metni bir metin dosyasına kaydetmeye yarar
3
Düğme
btnCharger
bir metin dosyasının içeriğini 1'e yükler
4
Düğme
btnEffacer
1'in içeriğini siler

İki adet görsel olmayan kontrol kullanılır:

Image

"ToolBox" öğesinden alınarak forma bırakıldıklarında, formun altındaki ayrı bir alana yerleştirilirler. "Dialog" bileşenleri "ToolBox" öğesinden alınır:

Image

Effacer düğmesinin kodu basittir:


    Private Sub btnEffacer_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnEffacer.Click
        ' giriş kutusu siliniyor
        txtTexte.Text = ""
    End Sub

SaveFileDialog sınıfı şu şekilde tanımlanmıştır:

Image

Bu sınıf, birkaç sınıf seviyesinden türetilmiştir. Bu sayısız özellik ve yöntem arasından şunlara dikkat çekeceğiz:

string Filter
diyalog penceresindeki dosya türü açılır menüsünde sunulan dosya türleri
int FilterIndex
Yukarıdaki listede varsayılan olarak sunulan dosya türünün numarası. 0'dan başlar.
String
InitialDirectory
dosyanın kaydedilmesi için başlangıçta gösterilen klasör
string FileName
kullanıcı tarafından belirtilen yedekleme dosyasının adı
DialogResult.ShowDialog()
Yedekleme iletişim kutusunu görüntüleyen yöntem. DialogResult türünde bir sonuç döndürür.

ShowDialog yöntemi, aşağıdakine benzer bir iletişim kutusu görüntüler:

1
Filter özelliğinden oluşturulan açılır liste. Varsayılan olarak önerilen dosya türü, FilterIndex ile belirlenir
2
geçerli klasör, bu özellik doldurulmuşsa InitialDirectory ile belirlenir
3
kullanıcı tarafından seçilen veya doğrudan girilen dosya adı. FileName özelliğinde kullanılabilir olacaktır
4
Kaydet/İptal düğmeleri. Enregistrer düğmesi kullanılırsa, ShowDialog işlevi sonucu DialogResult.OK olarak döndürür

Kaydetme prosedürü şu şekilde yazılabilir:


    Private Sub btnSauvegarder_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnSauvegarder.Click
        ' giriş kutusu bir metin dosyasına kaydedilir
        ' iletişim kutusunu yapılandırıyoruz savefileDialog1
        saveFileDialog1.InitialDirectory = Application.ExecutablePath
        saveFileDialog1.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
        saveFileDialog1.FilterIndex = 0
        ' iletişim kutusu görüntülenir ve sonucu alınır
        If saveFileDialog1.ShowDialog() = DialogResult.OK Then
            ' dosya adı alınır
            Dim nomFichier As String = saveFileDialog1.FileName
            Dim fichier As StreamWriter = Nothing
            Try
                ' dosyayı yazma modunda açıyoruz
                fichier = New StreamWriter(nomFichier)
                ' içine metin yazılır
                fichier.Write(txtTexte.Text)
            Catch ex As Exception
                ' sorun
                MessageBox.Show("Problème à l'écriture du fichier (" + ex.Message + ")", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return
            Finally
                ' dosyayı kapatıyoruz
                Try
                    fichier.Close()
                Catch
                End Try
            End Try
        End If
    End Sub
  • Başlangıç dosyasını, uygulamanın yürütülebilir dosyasını içeren dosyaya bağlarız:
        saveFileDialog1.InitialDirectory = Application.ExecutablePath
  • Görüntülenecek dosya türlerini belirleriz
        saveFileDialog1.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"

Filtrelerin sözdizimi şu şekildedir: filtre1|filtre2|..|filtren avec filtrei= Texte| dosya şablonu. Burada kullanıcı, *.txt ve *.* dosyaları arasında seçim yapabilir.

  • Başlangıçta gösterilecek dosya türü belirlenir
        saveFileDialog1.FilterIndex = 0

Burada, kullanıcıya ilk olarak *.txt türündeki dosyalar sunulacaktır.

  • İletişim kutusu görüntülenir ve sonucu alınır

    If saveFileDialog1.ShowDialog() = DialogResult.OK Then
  • İletişim kutusu görüntülenirken, kullanıcı ana forma erişemez (modal iletişim kutusu olarak adlandırılır). Kullanıcı kaydedilecek dosyanın adını belirler ve ya Kaydet düğmesine basarak, ya İptal düğmesine basarak ya da iletişim kutusunu kapatarak iletişim kutusundan çıkar. ShowDialog yönteminin sonucu, yalnızca kullanıcı diyalog penceresinden çıkmak için Enregistrer düğmesini kullanmışsa DialogResult.OK olur.
  • Bu işlem tamamlandıktan sonra, oluşturulacak dosyanın adı artık saveFileDialog1 nesnesinin FileName özelliğinde yer alır. Böylece, klasik bir metin dosyası oluşturma işlemine geri dönülür. Burada, TextBox: txtTexte.Text içeriği yazılırken, meydana gelebilecek istisnalar da yönetilir.

OpenFileDialog sınıfı, SaveFileDialog sınıfına çok benzemektedir ve aynı sınıf soyundan türemiştir. Bu sınıfın özellikleri ve yöntemlerinden aşağıdakileri ele alacağız:

string Filter
diyalog penceresindeki dosya türü açılır menüsünde sunulan dosya türleri
int FilterIndex
yukarıdaki listede varsayılan olarak önerilen dosya türünün numarası. 0'dan başlar.
string InitialDirectory
açılacak dosyanın aranması için başlangıçta gösterilen klasör
string FileName
kullanıcı tarafından belirtilen açılacak dosyanın adı
DialogResult.ShowDialog()
kaydetme iletişim kutusunu görüntüleyen yöntem. DialogResult türünde bir sonuç döndürür.

ShowDialog yöntemi, aşağıdakine benzer bir iletişim kutusu görüntüler:

1
Filter özelliğinden oluşturulan açılır liste. Varsayılan olarak önerilen dosya türü, FilterIndex ile belirlenir
2
geçerli klasör, bu özellik doldurulmuşsa InitialDirectory ile belirlenir
3
kullanıcı tarafından seçilen veya doğrudan girilen dosya adı. FileName özelliğinde kullanılabilir olacaktır
4
Aç/İptal düğmeleri. Ouvrir düğmesi kullanılırsa, ShowDialog işlevi DialogResult.OK sonucunu verir

Açma prosedürü şu şekilde yazılabilir:


Private Sub btnCharger_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnCharger.Click
        ' metin dosyasını giriş alanına yükleyin
        ' openfileDialog1 iletişim kutusunu yapılandırıyoruz
        openFileDialog1.InitialDirectory = Application.ExecutablePath
        openFileDialog1.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
        openFileDialog1.FilterIndex = 0
        ' diyalog penceresi görüntülenir ve sonucu alınır
        If openFileDialog1.ShowDialog() = DialogResult.OK Then
            ' dosya adı alınır
            Dim nomFichier As String = openFileDialog1.FileName
            Dim fichier As StreamReader = Nothing
            Try
                ' dosyayı okuma modunda açıyoruz
                fichier = New StreamReader(nomFichier)
                ' dosyanın tamamını okur ve TextBox'e aktarır
                txtTexte.Text = fichier.ReadToEnd()
            Catch ex As Exception
                ' sorun
                MessageBox.Show("Problème à la lecture du fichier (" + ex.Message + ")", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return
            Finally
                ' dosyayı kapatıyoruz
                Try
                    fichier.Close()
                Catch
                End Try
            End Try
        End If
    End Sub
  • Başlangıç klasörü, uygulamanın yürütülebilir dosyasını içeren klasör olarak belirlenir:
            saveFileDialog1.InitialDirectory=Application.ExecutablePath
  • Görüntülenecek dosya türleri belirlenir
            saveFileDialog1.Filter = "Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
  • Başlangıçta gösterilecek dosya türü belirlenir
            saveFileDialog1.FilterIndex = 0

Burada, kullanıcıya ilk olarak *.txt türündeki dosyalar gösterilecektir.

  • İletişim kutusu görüntülenir ve sonucu alınır

    If openFileDialog1.ShowDialog() = DialogResult.OK Then

İletişim kutusu görüntülenirken, kullanıcı ana forma erişemez (modal iletişim kutusu olarak adlandırılır). Kullanıcı, açılacak dosyanın adını belirler ve iletişim kutusundan ya Aç düğmesini, ya İptal düğmesini kullanarak ya da iletişim kutusunu kapatarak çıkar. ShowDialog yönteminin sonucu, yalnızca kullanıcı diyalog penceresinden çıkmak için Ouvrir düğmesini kullanmışsa DialogResult.OK olur.

  • Bu işlem tamamlandıktan sonra, oluşturulacak dosyanın adı artık openFileDialog1 nesnesinin FileName özelliğinde yer alır. Bu noktada, klasik bir metin dosyası okuma işlemine geri dönülür. Bir dosyanın tamamını okumayı sağlayan yöntem şöyledir:
                    txtTexte.Text=fichier.ReadToEnd
  • dosyanın içeriği TextBox ve txtTexte nesnelerine aktarılır. Olası istisnalar yönetilir.

5.7.2. FontColor ve ColorDialog iletişim kutuları

Önceki örneğe devam ederek iki yeni düğme sunuyoruz:

No.
tür
ad
işlev
6
Düğme
btnCouleur
TextBox'in karakter rengini ayarlamak için
7
Düğme
btnPolice
TextBox'in yazı tipini ayarlamak için

Forma bir ColorDialog denetimi ve bir FontDialog denetimi ekliyoruz:

Image

FontDialog ve ColorDialog sınıfları, OpenFileDialog ve SaveFileDialog sınıflarındaki ShowDialog yöntemine benzer bir ShowDialog yöntemine sahiptir. ColorDialog sınıfındaki ShowDialog yöntemi, bir renk seçilmesini sağlar:

Image

Kullanıcı OK düğmesiyle iletişim kutusundan çıkarsa, ShowDialog yönteminin sonucu DialogResult.OK olur ve seçilen renk, kullanılan ColorDialog nesnesinin Color özelliğinde bulunur. FontDialog sınıfındaki ShowDialog yöntemi, bir yazı tipi seçilmesini sağlar:

Image

Kullanıcı OK düğmesiyle iletişim kutusundan çıkarsa, ShowDialog yönteminin sonucu DialogResult.OK olur ve seçilen yazı tipi, kullanılan FontDialog nesnesinin Font özelliğinde bulunur. Couleur ve Police düğmelerine yapılan tıklamaları işlemek için gerekli öğeler şunlardır:


    Private Sub btnCouleur_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnCouleur.Click
        ' metin rengi seçiliyor
        If colorDialog1.ShowDialog() = DialogResult.OK Then
            ' TextBox dosyasının forecolor özelliğini değiştiriyoruz
            txtTexte.ForeColor = colorDialog1.Color
        End If
    End Sub


    Private Sub btnPolice_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnPolice.Click
        ' yazı tipi seçimi
        If fontDialog1.ShowDialog() = DialogResult.OK Then
            ' TextBox'in font özelliğini değiştirme
            txtTexte.Font = fontDialog1.Font
        End If
    End Sub

5.7.3. Zamanlayıcı

Burada şu uygulamayı yazmayı öneriyoruz:

No
Tür
Ad
Rol
1
TextBox, ReadOnly=true
txtChrono
bir zamanlayıcı gösterir
2
Düğme
btnArretMarche
zamanlayıcının Durdur/Başlat düğmesi
3
Zamanlayıcı
timer1
burada her saniye bir olay gönderen bileşen

Zamanlayıcı çalışırken:

Image

Zamanlayıcı durdurulduğunda:

Image

TextBox ve txtChrono bileşenlerinin içeriğini her saniye değiştirmek için, her saniye bir olay üreten bir bileşene ihtiyacımız var; bu olayı yakalayarak kronometrenin ekranını güncelleyebiliriz. Bu bileşen Timer'tir:

Image

Bu bileşen forma (görsel olmayan bileşenler bölümüne) eklendiğinde, form oluşturucusunda Timer türünde bir nesne oluşturulur. System.Windows.Forms.Timer sınıfı şu şekilde tanımlanmıştır:

Image

Özelliklerinden yalnızca aşağıdakileri ele alacağız:

Interval
Tick olayının yayınlandığı milisaniye sayısı.
Tick
Interval milisaniyenin sonunda üretilen olay
Enabled
zamanlayıcıyı etkin (true) veya devre dışı (false) yapar

Örneğimizde zamanlayıcının adı timer1'tir ve timer1.Interval 1000 ms (1 saniye) olarak ayarlanmıştır. Dolayısıyla Tick olayı her saniye gerçekleşecektir. Durdur/Çalıştır düğmesine tıklama, aşağıdaki prosedürle işlenir:


    Private Sub btnArretMarche_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles btnArretMarche.Click
        ' kapalı mı, açık mı?
        If btnArretMarche.Text = "Marche" Then
            ' başlangıç saatini not ediyoruz
            début = DateTime.Now
            ' ekranı görüntülenir
            txtChrono.Text = "00:00:00"
            ' zamanlayıcıyı başlatıyoruz
            timer1.Enabled = True
            ' düğmenin etiketini değiştir
            btnArretMarche.Text = "Arrêt"
            ' bitiş
            Return
        End If        '
        If btnArretMarche.Text = "Arrêt" Then
            ' zamanlayıcı durdurulur
            timer1.Enabled = False
            ' düğmenin etiketini değiştir
            btnArretMarche.Text = "Marche"
            ' son
            Return
        End If
    End Sub

    Private Sub timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles timer1.Tick
        ' bir saniye geçti
        Dim maintenant As DateTime = DateTime.Now
        Dim durée As TimeSpan = DateTime.op_Subtraction(maintenant, début)
        txtChrono.Text = "" + durée.Hours.ToString("d2") + ":" + durée.Minutes.ToString("d2") + ":" + durée.Seconds.ToString("d2")
    End Sub

Durdur/Çalıştır düğmesinin etiketi ya "Durdur" ya da "Çalıştır"dır. Bu nedenle, ne yapılacağını belirlemek için bu etiketi kontrol etmek gerekir.

  • "Çalıştır" durumunda, başlangıç saati form nesnesinin global bir değişkenine kaydedilir, zamanlayıcı başlatılır (Enabled=true) ve düğmenin etiketi "Durdur" olarak değiştirilir.
  • "Durdur" yazısı seçildiğinde, zamanlayıcı durdurulur (Enabled=false) ve düğmenin yazısı "Çalıştır" olarak değiştirilir.

Public Class Timer1
  Inherits System.Windows.Forms.Form
  Private WithEvents timer1 As System.Windows.Forms.Timer
  Private WithEvents btnArretMarche As System.Windows.Forms.Button
  Private components As System.ComponentModel.IContainer
  Private WithEvents txtChrono As System.Windows.Forms.TextBox
  Private WithEvents label1 As System.Windows.Forms.Label

  ' örnek değişkenleri
  Private début As DateTime

Yukarıdaki début özniteliği, sınıfın tüm yöntemlerinde tanınır. Geriye, timer1 nesnesinde her saniye gerçekleşen Tick olayını işlemek kalıyor:


    Private Sub timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles timer1.Tick
        ' bir saniye geçti
        Dim maintenant As DateTime = DateTime.Now
        Dim durée As TimeSpan = DateTime.op_Subtraction(maintenant, début)
        txtChrono.Text = "" + durée.Hours.ToString("d2") + ":" + durée.Minutes.ToString("d2") + ":" + durée.Seconds.ToString("d2")
    End Sub

Zamanlayıcının başlatıldığı andan itibaren geçen süre hesaplanır. Zaman süresini temsil eden TimeSpan türünde bir nesne elde ederiz. Bu süre, kronometrede hh:mm:ss biçiminde görüntülenmelidir. Bunun için, sırasıyla TimeSPan nesnesinin saat, dakika ve saniye süresini temsil eden Hours, Minutes, Seconds özelliklerini kullanıyoruz; bunlar sırasıyla saat, dakika ve saniyeyi temsil eder ve 2 basamaklı bir görüntü elde etmek için ToString("d2") biçiminde görüntülenir.

5.8. IMPOTS örneği

Daha önce iki kez ele aldığımız IMPOTS uygulamasını tekrar ele alıyoruz. Şimdi buna bir grafik arayüz ekliyoruz:

Kontroller şunlardır

No
tür
ad
rol
1
RadioButton
rdOui
evli ise işaretlenir
2
RadioButton
rdNon
evli değilse işaretlenir
3
NumericUpDown
incEnfants
Vergi mükellefinin çocuk sayısı
Minimum=0, Maksimum=20, Artım=1
4
TextBox
txtSalaire
Vergi mükellefinin yıllık maaşı (F cinsinden)
5
TextBox
txtImpots
ödenecek vergi tutarı
ReadOnly=true
6
Düğme
btnCalculer
vergi hesaplamasını başlatır
7
Düğme
btnEffacer
yükleme sırasında formu başlangıç durumuna geri getirir
8
Düğme
btnQuitter
uygulamadan çıkmak için

Çalışma kuralları

  • Maaş alanına bir şey girilmedikçe "Hesapla" düğmesi devre dışı kalır
  • hesaplama başlatıldığında maaşın yanlış olduğu ortaya çıkarsa, hata bildirilir:

Image

Program aşağıda verilmiştir. Program, sınıflar bölümünde oluşturulan impot sınıfını kullanır. VS.NET tarafından otomatik olarak üretilen kodun bir kısmı burada yer almamaktadır.


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
' seçenekler
Option Explicit On 
Option Strict On

' ad alanları
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data

' form sınıfı
Public Class frmImpots
  Inherits System.Windows.Forms.Form
  Private WithEvents label1 As System.Windows.Forms.Label
  Private WithEvents rdOui As System.Windows.Forms.RadioButton
  Private WithEvents rdNon As System.Windows.Forms.RadioButton
  Private WithEvents label2 As System.Windows.Forms.Label
  Private WithEvents txtSalaire As System.Windows.Forms.TextBox
  Private WithEvents label3 As System.Windows.Forms.Label
  Private WithEvents label4 As System.Windows.Forms.Label
  Private WithEvents groupBox1 As System.Windows.Forms.GroupBox
  Private WithEvents btnCalculer As System.Windows.Forms.Button
  Private WithEvents btnEffacer As System.Windows.Forms.Button
  Private WithEvents btnQuitter As System.Windows.Forms.Button
  Private WithEvents txtImpots As System.Windows.Forms.TextBox
  Private components As System.ComponentModel.Container = Nothing
  Private WithEvents incEnfants As System.Windows.Forms.NumericUpDown

  ' vergi hesaplaması için gerekli veri tabloları
  Private limites() As Decimal = {12620D, 13190D, 15640D, 24740D, 31810D, 39970D, 48360D, 55790D, 92970D, 127860D, 151250D, 172040D, 195000D, 0D}
  Private coeffR() As Decimal = {0D, 0.05D, 0.1D, 0.15D, 0.2D, 0.25D, 0.3D, 0.35D, 0.4D, 0.45D, 0.55D, 0.5D, 0.6D, 0.65D}
  Private coeffN() As Decimal = {0D, 631D, 1290.5D, 2072.5D, 3309.5D, 4900D, 6898.5D, 9316.5D, 12106D, 16754.5D, 23147.5D, 30710D, 39312D, 49062D}
   ' vergi nesnesi
  Private objImpôt As impot = Nothing


  Public Sub New()
    InitializeComponent()
     ' formun başlatılması
    btnEffacer_Click(Nothing, Nothing)
    btnCalculer.Enabled = False
     ' vergi nesnesinin oluşturulması
    Try
      objImpôt = New impot(limites, coeffR, coeffN)
    Catch ex As Exception
      MessageBox.Show("Impossible de créer l'objet impôt (" + ex.Message + ")", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
       ' maaş giriş alanını devre dışı bırakma
      txtSalaire.Enabled = False
    End Try 'try-catch
  End Sub 

  Protected Overloads Sub Dispose(ByVal disposing As Boolean)
....
  End Sub

  Private Sub InitializeComponent()
    Me.btnQuitter = New System.Windows.Forms.Button
    Me.groupBox1 = New System.Windows.Forms.GroupBox
    Me.btnEffacer = New System.Windows.Forms.Button
    Me.btnCalculer = New System.Windows.Forms.Button
    Me.txtSalaire = New System.Windows.Forms.TextBox
    Me.label1 = New System.Windows.Forms.Label
    Me.label2 = New System.Windows.Forms.Label
    Me.label3 = New System.Windows.Forms.Label
    Me.rdNon = New System.Windows.Forms.RadioButton
    Me.txtImpots = New System.Windows.Forms.TextBox
    Me.label4 = New System.Windows.Forms.Label
    Me.rdOui = New System.Windows.Forms.RadioButton
    Me.incEnfants = New System.Windows.Forms.NumericUpDown
    Me.groupBox1.SuspendLayout()
    CType(Me.incEnfants, System.ComponentModel.ISupportInitialize).BeginInit()
    Me.SuspendLayout()
....
  End Sub 'InitializeComponent

  Public Shared Sub Main()
    Application.Run(New frmImpots)
  End Sub 'Main


  Private Sub btnEffacer_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles btnEffacer.Click
     ' formun sıfırlanması
    incEnfants.Value = 0
    txtSalaire.Text = ""
    txtImpots.Text = ""
    rdNon.Checked = True
  End Sub 'btnEffacer_Click


  Private Sub txtSalaire_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles txtSalaire.TextChanged
     ' Hesapla düğmesinin durumu
    btnCalculer.Enabled = txtSalaire.Text.Trim() <> ""
  End Sub 'txtSalaire_TextChanged


  Private Sub btnQuitter_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles btnQuitter.Click
     ' uygulama sonu
    Application.Exit()
  End Sub 'btnQuitter_Click


  Private Sub btnCalculer_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
  Handles btnCalculer.Click
     ' Maaş doğru mu?
    Dim intSalaire As Integer = 0
    Try
      ' maaşın alınması
      intSalaire = Integer.Parse(txtSalaire.Text)
       ' 0'dan büyük veya 0'a eşit olmalı
      If intSalaire < 0 Then
        Throw New Exception("")
      End If
    Catch ex As Exception
      ' hata mesajı
      MessageBox.Show(Me, "Salaire incorrect", "Erreur de saisie", MessageBoxButtons.OK, MessageBoxIcon.Error)
       ' hatalı alana odaklanma
      txtSalaire.Focus()
       ' giriş alanındaki metnin seçilmesi
      txtSalaire.SelectAll()
       ' görsel arayüze geri dönüş
      Return
    End Try 'try-catch
    ' maaş doğru - vergi hesaplanıyor
    txtImpots.Text = "" & CLng(objImpôt.calculer(rdOui.Checked, CInt(incEnfants.Value), intSalaire))
  End Sub 'btnCalculer_Click
End Class

Burada, 2. bölümdeki impots sınıfının derlenmesi sonucu elde edilen impots.dll derleme dosyasını kullanıyoruz. Bu derleme dosyasının konsol modunda şu komutla oluşturulabileceğini hatırlatalım:

dos>vbc /t:library impots.vb

Bu komut, “assemblage” adlı impots.dll dosyasını oluşturur. Bu derleme daha sonra farklı projelerde kullanılabilir. Burada, VS.NET adlı projemizde, proje özellikleri penceresini kullanıyoruz:

Image

Bir referans (montaj) eklemek için yukarıdaki Referanslar ana grubuna sağ tıklıyoruz, [Ajouter une référence] seçeneğini seçiyoruz ve proje klasörüne özenle yerleştirdiğimiz [impots.dll] montajını belirliyoruz:

dos>dir
01/03/2004  14:39                9 250 gui_impots.vb
01/03/2004  14:37                4 096 impots.dll
01/03/2004  14:41               12 288 gui_impots.exe

[impots.dll] derlemesi projeye eklendiğinde, [impots] sınıfı proje tarafından tanınır hale gelir. Daha önce tanınmazdı. Başka bir yöntem ise impots.vb kaynak dosyasını projeye eklemektir. Bunun için, proje özellikleri penceresinde projeye sağ tıklayıp [Ajouter/Ajouter un élément existant] seçeneğini seçtikten sonra impots.vb dosyasını belirtin.