KMRT BSRN

"Hiç kimsenin ilgisine ihtiyaç duymadığın gün olgunlaşırsın. Hiç kimseden beklentiye girmediğin gün yara almazsın. Ve hiç kimseye bağımlı kalmazsan kazanırsın." OSHO


Yorum bırakın

Tüm İşler Tek Metodta.. (Single Method For All Jobs)

Bazı durumlarda yapılması gereken işlerin hepsini tek metod içinde yapmamız gerekebilir. Tabii bu biraz üzeri kapalı bir giriş oldu. 🙂 Nedir bu işler? Neden bir metod içinde hepsini yapalım ki? diye sorular sorabilirsiniz. Bende bu sorular üzerinden basit bir senaryo ile olayı anlatmaya çalışacağım. Fakat kısacası şunu belirteyim. Böyle olması gereken bir durum oldu ve bende bunun üzerinde olaya yaklaşarak bu konuda biraz uğraştım. Öncelikle “Tüm İşler” dediğimiz nedir? Benim burada tüm işlerden kastım: bir metodun içinde olay tanımlama ve o olaya kod yazmak ve yazılan kodu bağlamak.. Şimdi diyebilirsiniz ne var ki bunda zaten bunu yapıyoruz.. Doğru ama yaptığımız şeyler olaylar, metotlar herzaman tek metod içinde olmuyor.. Buna şöyle bir örnek verelim.

image

Resimde gördüğünüz form’da sağ tarafta bulunan GroupBox’ı bir Usercontrol olarak düşünün yada normal form üzerinde bir kontrol olarak da düşünebilirsiniz. Buradaki problem şu; “Olay Bağla !” butonunu kullanarak “Mesaj Ver !” butonuna bir olay set etmek ve bu olayda çalışacak koduda bu olayı tanımlarken geliştirmek istiyorum.. Bunu çözmenin iki yolu var. Genelde ilk yolu tercih ederiz..

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    this.btnMesajVer.Click += new EventHandler(btnMesajVer_Click);
}

void btnMesajVer_Click(object sender, EventArgs e)
{
    MessageBox.Show("?lk y?ntem ile olu?turuldu..");
}

 

Fakat burada dikkat’i çekmek istediğim ve problemin oluşmasına sebep olan, ilk tercihi gerçekleyemememize sebep olan şöyle bir durum oluşursa ne yapacağız !?

1) İstenilen şu; “btnOlayBagla” butonuna tıklandığında “btnMesajVer” butonuna “Click” olayı tanımlamak ve bu olay da çalışacak kodu da burada(“btnMesajVer_Click” olayında değil) tanımlamak istiyorsam. Bunu nasıl yaparım. Yani tüm işleri tek bir metod içinde(örneğimizde; “btnOlayBagla_Click” içinde) yapmak istiyorum.

Aslında şöyle bir durumla da karşı karşıya kalmış olabilirdik..

2) Yularıdaki kodlarda da görüldüğü gibi “btnMesajVer” butonuna erişebiliyorum ve Click olayını yakalayabiliyorum. Peki ya bu buton(“btnMesajVer”) yukarıdaki paragraflarda da belirttiğim gibi bir UserControl içinde olsaydı. Hemen dediğinizi duyar gibiyim. “Modifiers” özelliğini “Public” yapardım, sonrada erişir olayımı yine yazardım diyorsunuz.. Peki ya “Modifiers” özelliğini “Public” yapmanıza izin yoksa, ya da şöyle söyleyeyim. Yapmamanız gereken sebepler varsa ve yapamıyorsanız. Daha da zorlaştıralım. Bunu gene (1) no’lu durumla aynı şekilde çözmemiz isteniyorsa yani “Tek metod içinde Tüm işlemleri Bağla”..

İşte bunu nasıl yapabiliriz ona bakalım. Öncelikle (1) no’lu senaryomuzu çözelim. (Basitten karmaşığa..)

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    // ?ncelikle EventHandler nesnemi olu?turuyorum.
    // Bu nesne "btnMesajVer" butonunun yapaca?? kodu i?erecektir.
    EventHandler handler = delegate
        {
            MessageBox.Show("btnMesajVer t?kland?..");
        };

    // Olu?tudu?um Delegate 'i(Olay ve olay?n ?al??t?raca?? kodu)
    // ilgili nesneye ba?l?yorum.
    this.btnMesajVer.Click += handler;
}

Evet yukarıda da gördüğünüz gibi gayet basit ve net bir şekilde tek metot içinde olayımızı oluşturduk. İlgili nesnenin istediğimiz olayına bağladık. Gelelim (2) no’lu durumda ne yapabileceğimize. Yukarıdaki kodda gördüğünüz gibi nesnemize çok rahat güzel bir biçimde erişiyoruz. Peki ya UserControl içinde olsaydı ve “Modifers” özelliğini de “Public” veremiyorsak, işte o durumda da kodumuz şu hale geliyor. (Kodu yazarken UserControl kullanmadım. Yaptığımdan farkı yok. Zaten farkedeceksinizdir ilgili kontrolü direkt kullanmıyorum.)

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    // ?ncelikle EventHandler nesnemi olu?turuyorum.
    // Bu nesne "btnMesajVer" butonunun yapaca?? kodu i?erecektir.
    EventHandler handler = delegate
        {
            MessageBox.Show("btnMesajVer t?kland?..");
        };

    // Kontrol?m? ad? ile ar?yorum.(Burada form i?inde arad?m, siz UserControl
    // i?inde de arayabilirsiniz..)
    Control[] ctrl = this.Controls.Find("btnMesajVer", true);

    if (ctrl.Length > 0)
    {
        Button btn = ctrl.First() as Button;

        if (btn != null)
        {
            // Olu?tudu?um Delegate 'i(Olay ve olay?n ?al??t?raca?? kodu)
            // ilgili nesneye ba?l?yorum.
            btn.Click += handler;
        }
    }
}

İşte bu işlemi de bu şekilde halledebiliriz. Çıtayı son bir kez daha yükseltiyoruz. İki durum içinde (1)(2) şöyle bir gereksinim olsa bunu nasıl yaparız !? Yukarıda hepsi çok güzel, kontrolümüzü yakaladık. Kontrolümüze olayımızı oluşturduk ve bağladık. Olayımızın içindeki kodu geliştirdik. Hepsi çalışıyor fakat bizden, olayı bağladığımız kontrolün(“btnMesajVer”) bu bağladığımız olayı ilk olarak buradan(olayı bağladığımız yerden) çalıştırmamız istense, bunu nasıl yaparız? Yani “btnOlayBagla” butonuna tıklandığında hem “btnMesajVer” butonuna olay bağlayacağız hem de bu olayı 1 veya kaç kere istenirse buradan tetikleyeceğiz(fırlatacağız). Bunun içinde sadece 1 satırlık bir ekleme ile işimizi görebiliriz..

C#
private void btnOlayBagla_Click(object sender, EventArgs e)
{
    // ?ncelikle EventHandler nesnemi olu?turuyorum.
    // Bu nesne "btnMesajVer" butonunun yapaca?? kodu i?erecektir.
    EventHandler handler = delegate
        {
            MessageBox.Show("btnMesajVer t?kland?..");
        };

    // Kontrol?m? ad? ile ar?yorum.(Burada form i?inde arad?m, siz UserControl
    // i?inde de arayabilirsiniz..)
    Control[] ctrl = this.Controls.Find("btnMesajVer", true);

    if (ctrl.Length > 0)
    {
        Button btn = ctrl.First() as Button;

        if (btn != null)
        {
            // Tabii burada olay?n tekrar tekrar ba?lanmamas?
            // i?in kontrol yapmay? unutmay?n !!
            if (btn.GetType().GetEvent("Click") != null)
                btn.GetType().GetEvent("Click").RemoveEventHandler(btn, handler);

            // Olu?tudu?um Delegate 'i(Olay ve olay?n ?al??t?raca?? kodu)
            // ilgili nesneye ba?l?yorum.
            btn.Click += handler;

            // Olay? ilk defa tetikliyorum(f?rlat?yorum)..
            handler.Invoke(btn, null);
        }
    }
}

İşte böylece tüm durumlarımızı çözdük. İşinize yaraması ve kullanmanız umuduyla..

Reklamlar


Yorum bırakın

Serialize & Deserialize

Fazla açıklamaya gerek yok. Aşağıdaki metotları kullanarak nesnelerinizin Serialize ve Deserialize işlemlerini kolayca yapabilirsiniz..

C#
private string SerializeObject(Type type, object o)
{

    string result = string.Empty;

    System.IO.StringWriter writer = new System.IO.StringWriter();

    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
    serializer.Serialize(writer, o);

    result = writer.ToString();

    return result;

}

private object DeserializeObject(Type t, string s)
{

    object result = null;

    if (!string.IsNullOrEmpty(s)) {
        System.IO.TextReader tr = new System.IO.StringReader(s);
        System.Xml.XmlReader reader = System.Xml.XmlReader.Create(tr);
        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(t);

        if (serializer.CanDeserialize(reader)) {
            result = serializer.Deserialize(reader);
        }
    }

    return result;

}

Şöyle biraz daha bu yapıyı geliştirerek kendime bir Class oluşturayım derseniz.. Bir de bunu generic tip ile süslersem ne olur acaba !? dediğinizde ise şu oluyor; 🙂

C#
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class c_Serializer<t>
{

    /// <summary>
    /// Parametre olarak ge?ilen nesneye XML serile?tirme uygular..
    /// </summary>
    /// <param name="obj">Serile?tirmek istenilen nesne.
    /// <returns>XML ifade.</returns>
    /// <remarks></remarks>
    public string Serialize(T obj) {

        string result = string.Empty;

        System.IO.StringWriter writer = new System.IO.StringWriter();

        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
        serializer.Serialize(writer, obj);

        result = writer.ToString();

        return result;

    }

    /// <summary>
    /// Parametre olarak ge?ilen nesneye XML serile?tirme uygular..
    /// </summary>
    /// <param name="type">Serile?tirme uygulanacak tip.
    /// <param name="o">Serile?tirmek istenilen nesne.
    /// <returns>XML ifade.</returns>
    /// <remarks></remarks>
    private string Serialize(Type type, object o) {

        string result = string.Empty;

        System.IO.StringWriter writer = new System.IO.StringWriter();

        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
        serializer.Serialize(writer, o);

        result = writer.ToString();

        return result;

    }

    /// <summary>
    /// Parametre olarak ge?ilen XML ifadeyi, e?er de-serile?tirme yap?labiliyorsa nesneye ?evirir. Aksi halde "Nothing" d?ner.
    /// </summary>
    /// <param name="s">XML ifade.
    /// <returns>Nesne.</returns>
    /// <remarks></remarks>
    public T Deserialize(string s) {

        T result = null;

        if (!string.IsNullOrEmpty(s)) {
            System.IO.TextReader tr = new System.IO.StringReader(s);
            System.Xml.XmlReader reader = System.Xml.XmlReader.Create(tr);
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

            try {
                if (serializer.CanDeserialize(reader)) {
                    result = (T)serializer.Deserialize(reader);
                }

            }
            catch (Exception ex) {
            }

        }

        return result;

    }

    /// <summary>
    /// Parametre olarak ge?ilen XML ifadeyi, e?er de-serile?tirme yap?labiliyorsa nesneye ?evirir. Aksi halde "Nothing" d?ner.
    /// </summary>
    /// <param name="t">De-serile?tirmede kullan?lacak tip.
    /// <param name="s">XML ifade.
    /// <returns>Nesne.</returns>
    /// <remarks></remarks>
    private object Deserialize(Type t, string s) {

        object result = null;

        if (!string.IsNullOrEmpty(s)) {
            System.IO.TextReader tr = new System.IO.StringReader(s);
            System.Xml.XmlReader reader = System.Xml.XmlReader.Create(tr);
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(t);

            if (serializer.CanDeserialize(reader)) {
                result = serializer.Deserialize(reader);
            }
        }

        return result;

    }

}


Yorum bırakın

VB – Yanıp Sönen Etiket (Flashing Label) Kontrolü Oluşturma

Bu yazımızda yanıp sönen ve kullanıcının ilgilini çeken bir etiket(Label) kontrolü geliştireceğiz. Projelerimde çoğu zaman böyle bir ifadeye, kullanıcının mutlaka okuması gereken, dikkat etmesi gereken yazılara ihtiyaç duyarım. Çoğu uygulamada da bu şekilde ifadeler mevcuttur. Yaygın olarak bu ifadeler uygulama içinde “Kalın(Bold)” ve “Altı Çizili(Underline)” olarak ayarlanırlar. Ya da kırmızı olarak renklendirilirler. Fakat yaptığım projelerde karşılaştığım kadarı ile bu belirginleştirme, kullanıcıların farketmesini sağlamıyor. Ya da kullanıcıların alışkanlıklarından ötürü dikkatlerinin oraya çekilmesini sağlamıyor. Bu konuda düşünürken, bu konuda parlak bir fikir aklıma geldi. 🙂 Evettt gerçekten parlak, hatta yanıp sönen :)) Sonunda yanıp sönen bir etiket(Label) kontrolü geliştirmeye karar verdim. Sonunda nasıl birşey mi çıktı. Buyrun aşağıdadır.

HighlightLabel.vb
Public Class HighlightLabel
    Inherits Label

#Region "Initialize"

    Private components As System.ComponentModel.IContainer
    Friend WithEvents tmrRepater As System.Windows.Forms.Timer

    Public Sub New()
        Me.InitializeComponent()
    End Sub

    Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container()
        Me.tmrRepater = New System.Windows.Forms.Timer(Me.components)
        Me.SuspendLayout()
        'tmrRepater        
        Me.tmrRepater.Interval = 5
        '        'HighlightLabel      
        Me.ResumeLayout(False)

    End Sub

#End Region

#Region "Events"

    Public Event HighlightSpeedChanged(ByVal value As Integer)

#End Region

#Region "Properties"

    Private _HighlightSpeed As Integer = 5
    ''' I??kland?rman?n h?z?n? belirler.    
    ''' (Minimum : 1 Maksimum : 50)  
    '''   
    Public Property HighlightSpeed() As Integer
        Get
            Return _HighlightSpeed
        End Get
        Set(ByVal value As Integer)

            If (value < 1) Then value = 1
            If (value > 50) Then value = 50

            _HighlightSpeed = value

            RaiseEvent HighlightSpeedChanged(value)

        End Set
    End Property

    Private _IsHighlightEnabled As Boolean = True
    Public Property IsHighlightEnabled() As Boolean
        Get
            Return _IsHighlightEnabled
        End Get
        Set(ByVal value As Boolean)
            _IsHighlightEnabled = value

            If (Not _IsHighlightEnabled) Then
                Me.StopLabelHighlight()
            End If

        End Set
    End Property

#End Region

#Region "Local Variables"

    Dim red As Integer = 0
    Dim green As Integer = 0
    Dim blue As Integer = 0
    Dim feeder As Integer = Me.HighlightSpeed

#End Region

#Region "Public Methods"

    '''
    ''' E?er IsHighlightEnabled = True ise ???kland?rmay? ba?lat?r.  
    '''     
    Public Sub StartLabelHighlight()

        If (Me.IsHighlightEnabled) Then
            Me.tmrRepater.Enabled = True
            Me.tmrRepater.Start()
        End If

    End Sub

    ''' I??kland?rmay? durdurur.      
    Public Sub StopLabelHighlight()

        Me.tmrRepater.Enabled = False
        Me.tmrRepater.Stop()

    End Sub

#End Region

#Region "Event Handlers"

    Private Sub tmrRepater_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmrRepater.Tick

        If (red + feeder >= 255) Then
            feeder = (-1) * Me.HighlightSpeed
            red = 255
        ElseIf (red + feeder <= 0) Then
            feeder = (1) * Me.HighlightSpeed
            red = 0
        End If

        red += feeder

        Me.ForeColor = Color.FromArgb(red, green, blue)
    End Sub

#End Region

End Class

image Kontrolü test etmek için gerekli test formu

Form3.Designer.vb
Partial Class Form3
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.     
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer    
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer    'It can be modified using the Windows Form Designer.      'Do not modify it using the code editor.     _    
    Private Sub InitializeComponent()
        Me.btnHizlandir = New System.Windows.Forms.Button()
        Me.btnYavaslat = New System.Windows.Forms.Button()
        Me.Label1 = New System.Windows.Forms.Label()
        Me.HighlightLabel1 = New WindowsApplication1.HighlightLabel()
        Me.SuspendLayout()

        'btnHizlandir       

        Me.btnHizlandir.Location = New System.Drawing.Point(301, 97)
        Me.btnHizlandir.Name = "btnHizlandir"
        Me.btnHizlandir.Size = New System.Drawing.Size(75, 23)
        Me.btnHizlandir.TabIndex = 1
        Me.btnHizlandir.Text = "H?zland?r"
        Me.btnHizlandir.UseVisualStyleBackColor = True

        'btnYavaslat        '        
        Me.btnYavaslat.Location = New System.Drawing.Point(220, 97)
        Me.btnYavaslat.Name = "btnYavaslat"
        Me.btnYavaslat.Size = New System.Drawing.Size(75, 23)
        Me.btnYavaslat.TabIndex = 2
        Me.btnYavaslat.Text = "Yava?lat"
        Me.btnYavaslat.UseVisualStyleBackColor = True        '        
        'Label1        '        
        Me.Label1.AutoSize = True
        Me.Label1.Location = New System.Drawing.Point(166, 102)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(31, 13)
        Me.Label1.TabIndex = 3
        Me.Label1.Text = "H?z : "        '        
        'HighlightLabel1        '        
        Me.HighlightLabel1.AutoSize = True
        Me.HighlightLabel1.Font = New System.Drawing.Font("Microsoft Sans Serif", 18.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(162, Byte))
        Me.HighlightLabel1.HighlightSpeed = 5
        Me.HighlightLabel1.IsHighlightEnabled = True
        Me.HighlightLabel1.Location = New System.Drawing.Point(12, 32)
        Me.HighlightLabel1.Name = "HighlightLabel1"
        Me.HighlightLabel1.Size = New System.Drawing.Size(372, 29)
        Me.HighlightLabel1.TabIndex = 0
        Me.HighlightLabel1.Text = "Bu bir yan?p s?nen uyar? etiketidir."        '        'Form3        '        
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(388, 132)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.btnYavaslat)
        Me.Controls.Add(Me.btnHizlandir)
        Me.Controls.Add(Me.HighlightLabel1)
        Me.Name = "Form3"
        Me.Text = "Form3"
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
    Friend WithEvents HighlightLabel1 As WindowsApplication1.HighlightLabel
    Friend WithEvents btnHizlandir As System.Windows.Forms.Button
    Friend WithEvents btnYavaslat As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
End Class

 

Form3.vb
Public Class Form3

    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.HighlightLabel1.StartLabelHighlight()

        'Me.HighlightLabel1.StopLabelHighlight()

        'Me.HighlightLabel1.IsHighlightEnabled = True        
        'Me.HighlightLabel1.HighlightSpeed = 10

        AddHandler Me.HighlightLabel1.HighlightSpeedChanged, AddressOf HighlightLabel1_HighlightSpeedChanged

        Me.Label1.Text = "H?z : " & Me.HighlightLabel1.HighlightSpeed.ToString()

    End Sub

    Private Sub btnHizlandir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHizlandir.Click
        Me.HighlightLabel1.HighlightSpeed += 5
    End Sub

    Private Sub btnYavaslat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYavaslat.Click
        Me.HighlightLabel1.HighlightSpeed -= 5
    End Sub

    Private Sub HighlightLabel1_HighlightSpeedChanged(ByVal value As Integer)
        Me.Label1.Text = "H?z : " & value.ToString()
    End Sub

End Class

Sonuç :

HighlightSpeed” özelliği ile hızlandırabilir ya da yavaşlatabilirsiniz..

IsHighlightEnabled” özelliği ile etkisizleştirebilirsiniz..

HighlightSpeedChanged” olayını yönetebilirsiniz..

 Resim 1Resim 1  Resim 2Resim 2
 Resim 3Resim 3

Resim 4Resim 4

 Resim 5Resim 5  


Yorum bırakın

Programlama.com – VB de Java Programlama Programı – Visual Basic

Biraz nostalji yapmaya karar verdim. Yazılım hayatıma ilk başladığım zamanlar kullandığım Programlama.com sitesinin hala ayakta olduğunu fakat geçen zaman içinde gereken ilginin pek gösterilmediğini gördüm. Biraz üzüldüm. Hala bıraktığım gibi 🙂

Bunlar yazılım hayatımda yayınladığım ilk makaleler..

Programlama.com – VB de Java Programlama Programı – Visual Basic


Yorum bırakın

Programlama.com – Oyun Makinası – Visual Basic

Biraz nostalji yapmaya karar verdim. Yazılım hayatıma ilk başladığım zamanlar kullandığım Programlama.com sitesinin hala ayakta olduğunu fakat geçen zaman içinde gereken ilginin pek gösterilmediğini gördüm. Biraz üzüldüm. Hala bıraktığım gibi 🙂

Bunlar yazılım hayatımda yayınladığım ilk makaleler..

Programlama.com – Oyun Makinası – Visual Basic


Yorum bırakın

Programlama.com – Yazı Şifreleme – Visual Basic

Biraz nostalji yapmaya karar verdim. Yazılım hayatıma ilk başladığım zamanlar kullandığım Programlama.com sitesinin hala ayakta olduğunu fakat geçen zaman içinde gereken ilginin pek gösterilmediğini gördüm. Biraz üzüldüm. Hala bıraktığım gibi 🙂

Bunlar yazılım hayatımda yayınladığım ilk makaleler..

Programlama.com – Yazı Şifreleme – Visual Basic


Yorum bırakın

Programlama.com – Bilgisayar Diline Dönüştürücü – Visual Basic

Biraz nostalji yapmaya karar verdim. Yazılım hayatıma ilk başladığım zamanlar kullandığım Programlama.com sitesinin hala ayakta olduğunu fakat geçen zaman içinde gereken ilginin pek gösterilmediğini gördüm. Biraz üzüldüm. Hala bıraktığım gibi 🙂

Bunlar yazılım hayatımda yayınladığım ilk makaleler..

Programlama.com – Bilgisayar Diline Dönüştürücü – Visual Basic