OBJECT ORİENTED PROJESİ-CONSOLDE EŞİNİ BUL OYUNU

19 Haziran 2010 – 01:54 Yazar: Derya GUNDUZ

Projemde 5×5 matrix içine her defasında random olarak atılan, her birinden ikişer tane olmak

üzere 12 çeşit harf ve birinin eşi olmayan harfler kullandım .Matrixi “manager” classında

tanımladım matrixden main de nesne oluşturdum,”harfler” adlı 25 elemanlı bir dizide 13 çeşit harf, her

birinden 2şer tane birinin eşi olmayacak şekilde ,eleman atadım.ayrıca “diz” adında 25 elemanlı bir dizi

daha oluşturdum ve bu dizinin elamlarını 1den 25e kadar random oluşturulmuş sayılar meydana

getirdi.Sonra “diz“ dizisinin 1. elamanının değerine göre “harfller” dizisinin elemanını aldım ve

matrixin sıradan gelen elamanı ile eşleştirdim.Böylece matrix her program çalıştığında random olarak

harf değerlerini almış oldu.

Manager classından iki tane nesene oluşturdum,”ilk” matrixi random harf değrleri atanmış

matrix,”geçici” matrixi ise en başta boş olan ve kullanıcının söylediği koordinatların eşitlik durumuna

göre değer alan matrixdir.koordinatlar aynı oldukça “geçici” matrixi “ilk” matrixinin o koordinat

değrlerine eşit oluyor,o değerleri alıyor ve ekranda o değerler kapalıken açılmış gibi

görünüyor,koordinatlar aynı olunca “manager” claasına yamış olduğum “puanarttır” fonksiyonu devreye

giriyor ve oyuncu 5 puan kazanıyor.Girilen koordinatlar aynı değilse “ilk” matrixinin o koordinatı ile

“gecici” matrixinin o koordinatı eşit olmuyor oyuncu bir süre o koordinatları görüyor ve sonra o

görünen koordinatların yerine gecici matrixinin elemanları görünüyor(kapalıymış gibi).

Koordinatların alınması işini de “player” classı yapıyor,kullanıcıdan koordinat isiyor,kontrolleri

yapıyor ona göre “gecici” matrixine eleman ataması yapıyor ya da koordinatlar matrix indexi dışındaysa

hata mesajları döndürüyor.

Her bir puan verilip ya da yanlış koordinat söylenmesi halinde kullanıcıya çıkış yapıp

yapmamak istediği soruluyor,oyuncya çıkmak istiyorsa “q” ya devam etmek istiyorsa herhangi bir tuşa

basılması gerektiği söyleniyor.

projenin tamamını indirmek  ,kodları görmek için    tıklayın

DERYA GÜNDÜZ

http://www.deryagunduz.blogspot.com

deryagunduz47@gmail.com

Bookmark and Share

PIC 16F877A DA YANAN LEDİN SAĞA SOLA HARAKET ETMESİ-RLF RRF KULLANIMI

17 Haziran 2010 – 00:55 Yazar: Derya GUNDUZ

Pic 16f877a da ledin yanması demek  kullanılan  potrun ilgili  bitinin “1″ olması demektir.Yanan bir  ledin sağa sola hareket etmesini sağlayan özel komutlar  vardır:

rlf :   Açılımı “rotate left file”,içeriği sola kaydırmaya yarar.Örneğin portun içinde b’01000000′  ise  rlf komutu bir kere uygulandığında b’10000000′   şeklinde olur.

rrf: Açılımı “rotate right  file”,içeriği sağa kaydırmaya yarar.Örneğin portun içinde b’01000000′  ise  rrf komutu bir kere uygulandığında b’00100000′   şeklinde olur.


portun içeriğini sağa  sonra sola kaydıran örnek kodu inceleyelim:

Bu kodda    PORTB nin içine en başta b’00000001′  sayısı  yerleştiriliyor,içerik 7. bit 1 olana kadar her defasında  bir bit sola kaydırılıyor, çünkü 7. bit  1 olduğunda sola kayacak yer klamıyor,bu kontrolden sonra  sağa kaymalar başlayacaktır.Bu aşamada da içerik0. bit 1 olana kadar  her defasında bir bit olmak üzere sağa kaydırılıyor ,0. bit  1 olduğunda yine sola kayma olacaktır.

SAYAC1 EQU h’0C’   ;gecikme sayacları için adresler belirtiliyor
 
                  SAYAC2 EQU h’0D’
 
                       CLRF PORTB      ;potrbnin içi en başta temizleniyor
 
            BSF STATUS,5             ;bank1 tris registerlarının ayarlanması için seçildi
 
                 CLRF TRISB             ;portb çıkış portu yapıldı
 
                  BCF STATUS,5                  ;port içeriği ile ilgili işlem yapılması için tekrar bank0 a geçildi
 
               MOVLW h’01’               
 
               MOVWF PORTB            ;portb nin içine b'00000001'  sayısı atıldı
 
SOL:
 
             CALL GECIKME;en başta bi bekleme anı oluyor
 
            RLF PORTB,F               ;içerik 1 birim sola kaydı
 
  BTFSS PORTB,7            ;portbnnin 7. biti kontrol ediliyor,
 
1 ise sağa kaydırma başlayacak 1 değilse tekrar  sola kayma olacaktır                                                                                                 
 
GOTO SOL
 
SAG:
 
CALL GECIKME                    ;bekleme yapılıyor
 
RRF PORTB,F                     ;içerik 1 birim sağa kaydırılıyor
 
BTFSS PORTB,0                  ;portbnin 0. biti kontrol ediliyor 1 ise sola kaymaya geçilecek,0 ise sağa ;kaymaya devam
 
GOTO SAG
 
GOTO SOL
 
GECIKME:
 
              MOVLW h’FF’
 
             MOVWF SAYAC1           ;gecikme için sayac1 in içine h'FF'  sayısı atılıyor
 
DONGU1:
 
          MOVLW h’FF’
 
               MOVWF SAYAC2                 ;gecikme için sayac1 in içine h'FF'  sayısı atılıyor
 
DONGU2:
 
          DECFSZ SAYAC2,F
 
    GOTO DONGU2           ;sayac2 nin içindeki sayı 0 olana  kadar her defasında 1 azalt,0 olunca saya1 i      ;                                       ;azaltmaya git
 
               DECFSZ SAYAC1,F        ;sayac1in içi 0 olana kadar her defasında 1 azalt,0 olduğunda return yap
 
              GOTO DONGU1
 
              RETURN            ;en son callın yapıldığı adrese  gider
 
        END        ;programo bitir

DERYA GÜNDÜZ

http://deryagunduz.blogspot.com

deryagunduz47@gmail.com

Bookmark and Share

C++ da Function Template-Class Template

16 Haziran 2010 – 15:35 Yazar: Derya GUNDUZ

          Template in kelime anlamı taslaktır,c++ daki  kullanım şekli de kelime anlamına çok yakın bir kullanımdır. Fonksiyonu taslak olarak yazıyorsunuz ve  bu  fonksiyon farklı kullanım şekilleri  için esnek bir yapıya  sahip oluyor.

          C++ daki Function Template için  farklı tiplerde  kullanım esnekliği vardır.Bir  fonksiyonu farklı farklı tipler için ayrı ayrı yazmak yerine,tek bir  fonksiyon taslağı yazıp  bunu farklı tipler için kullanabilirsiniz.

          örneğin bir mutlak değer  fonksiyonun int veri tipi için şu şekilde yazarız:

 

 

        int mutlakdeger(int a){

      if(a>0)    return a;

       else return -a;

        }

    

      double veri  tipi için olanını şu şekilde yazarız:

                          

        double  mutlakdeger(double  a){

      if(a>0)    return a;

       else return -a;

        }

      

     long olan için ;

            long  mutlakdeger(long  a){

      if(a>0)    return a;

       else return -a;

        }

      

               yani bütün tipler için ayrı ayrı yazardık.Bunu  taslak şeklinde yazıp  bütün veri tipleri için kullanabilmek istediğimiz   zaman yapmamız gereken şey fonksiyonu template  şeklinde tanımlamak.

 

           Template kulllanımı şu şekilde: 


    template            //fonksiyonun başına yazılması gereken

     T mulakdeger (T a)                    //yukarda tanımladığımız template Tyi  veri tipi olarak  kullandık

  

             {

 

 if(a>0)    return a;

       else return -a;

 

         }

            int  main(){

              cout<<"int veri tipi için mutlak deger alma";

              cout<<"double veri tipi için mutlak deger alma";

             }

  bu şekilde kullanarak her veri tipi için ayrı yazma  gerekliliğinden kurtuluruz,kodlar kısalır fazla zaman  harcamak zorunda kalmayız.

          

    Template çeşitleri:

 

  •  template      //fonksiyonlar için kullanılır
  •  template                 //classı template şekilde kullanabilmek için,daha çok data                storage classlarda(container)  kullanılır
  •  template        //birden fazla  tip tanımlayabiliriz

       Class Template:

            templateler ayrıca classlar için de kullanılabilir,işlev olarak  functşon template gibidir

           

           template

class  deneme{

                    //  classın diğer  elemanlarının prototypeları  yazılır

……………

       public int  denemefonk(T  ){}

……….. 

            };

            implementasyonlar:

 

         template

          deneme::denemefonk(T  a){………..}

 

           int main(){

         denemenesne;

          ………..

       }

 

  şeklinde kullanılır…………

     

DERYA GÜNDÜZ

Eskişehir Osmangazi Üniversitesi  Bilgisayar Mühendisliği 2. sınıf

http://www.deryagunduz.blogspot.com

deryagunduz47@gmail.com

Bookmark and Share

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. The statement has been terminated

14 Haziran 2010 – 09:58 Yazar: Tahir MUTLU

sql sorgulamada datetime türünde yaptığınız sorgularda “The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. The statement has been terminated” problemi ile karşılaşıyorsanız sorgunuza değeri gönderirken .ToString(“MM.dd.yyyy hh:mm:ss”) şeklinde düzenleyip göndrirseniz probleminiz çözülür.

?View Code CSHARP
SqlConnection con = new SqlConnection(/* kendi sql baglanma cümleniz */);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            DateTime dt = new DateTime(2010,6,10,0,0,0); // 10 haziran
            DateTime dt1 = new DateTime(2010, 6, 11, 0, 0, 0); // 11 haziran
 
            cmd.CommandText = "select * from tblDeneme where time>'" + dt.ToString("MM.dd.yyyy hh:mm:ss") + "' and time<'" + dt1.ToString("MM.dd.yyyy hh:mm:ss") + "'";
' kendi sql baglanma cümleniz 
2	Dim con As New SqlConnection()
3	Dim cmd As New SqlCommand()
4	cmd.Connection = con
5	Dim dt As New DateTime(2010, 6, 10, 0, 0, 0)
6	' 10 haziran
7	Dim dt1 As New DateTime(2010, 6, 11, 0, 0, 0)
8	' 11 haziran
9	cmd.CommandText = ("select * from tblDeneme where time>'" + dt.ToString("MM.dd.yyyy hh:mm:ss") & "' and time<'") + dt1.ToString("MM.dd.yyyy hh:mm:ss") & "'"
Bookmark and Share

16f877a portlar ve port seçimleri

04 Haziran 2010 – 02:46 Yazar: Derya GUNDUZ

portlar nedir ne işe yarar?

port

şekilden de  anlaşılacağı gibi,portlar bir microcontrollerda microcontroller ile bileşenleri arasındaki iletişimi sağlar.

pic 16f877a da  5 tane  port vardır:

  • PORT A
  • PORT B
  • PORT C
  • PORT D
  • PORT E

portların giriş çıkış  portları olması

portlar  kullanılacakları konuma  göre bazen çıkış portu bazen de giriş portu olmalıdır.portun  giriş ya da  çıkış portu olmasını yada  bazı bitlerinin  giriş bazı  bitlerinin çıkış olmasını  TRIS adındaki  özel bir register sağlar.

hangi port için çalışacaksak trisx  deyip bitlerini  değiştiririz.

0——>çıkış

1——>giriş

clrf    TRISB            ;b  portunun bütün bitlerini çıkış yapar

movlw  h’ff’

movwf  TRISA         ;a  portunun  bütün bitlerini  giriş yapar

ya da  bazı bitleri girş  bazılarını çıkış da  yapabiliriz:

movllw  b’00001111′

movwf     TRISD        ;d  portunun ilk 4  bitini giriş,son 4 bitini çıkış yaptık

porta yazma porttan okuma:

clrf          TRISB           ;önce  b  portunun bütün bitlerini çıkış olarak ayarlıyoruz

movlw     0×55

movwf      PORTB         ;portb nin içine  55 hex  yazdık

movlw  h’ff”

movwf    TRISA       ;a  portunu okuma yapmak için giriş portu yaptık

movf  PORTA,w

movwf   myreg          ;porta nın içeriğini  myreg adında  bir registera attık

DERYA  GÜNDÜZ

Bookmark and Share

Windows’un Versiyonunu Öğrenmek

01 Haziran 2010 – 11:39 Yazar: Tahir MUTLU

Geliştirmekte olduğumuz uygulamalarda, bazen uygulamamızı kuracak olduğumuz bilgisayarın işletim sisteminin versiyonuna göre farklı işlemler gerçekleştirmemiz gerekebiliyor. Bunun içinde bu işlemlerden önce işletis sistemi bilgisini almamız gerekiyor.

OperatingSystem sınıf özelliklerini, kullanılan işletim sistemi hakkında gerekli bilgileri sağlar. OSVersion özelliği System.Environment sınıfı, bir OperatingSystem nesnesini döndürür.

System.OperatingSystem osInfo = System.Environment.OSVersion;

osInfo nun Version.Minor yada Version.Major bilgilerine göre işletim sistemine karar verebiliyoruz.

Örneğin :

PlatformID = 1 , Major=  4  , Minor=10 ise Windows 98

?Download winver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 System.OperatingSystem osInfo = System.Environment.OSVersion;
            string winVersion ="";
 
            switch (osInfo.Platform)
            {
 
                case System.PlatformID.Win32Windows:
 
                    switch (osInfo.Version.Minor)
                    {
                        case 0:
                            winVersion = "Windows 95";
                            break;
                        case 10:
                            if (osInfo.Version.Revision.ToString() == "2222A")
                                winVersion = "Windows 98 Second Edition";
                            else
                                winVersion = "Windows 98";
                            break;
                        case 90:
                            winVersion = "Windows Me";
                            break;
                    }
                    break;
 
 
                case System.PlatformID.Win32NT:
 
                    switch (osInfo.Version.Major)
                    {
                        case 3:
                            winVersion = "Windows NT 3.51";
                            break;
                        case 4:
                            winVersion = "Windows NT 4.0";
                            break;
                        case 5:
                            if (osInfo.Version.Minor == 0)
                                winVersion = "Windows 2000";
                            else
                                winVersion = "Windows XP";
                            break;
                        case 6:
                            if(osInfo.Version.Minor == 1)
                                winVersion = "Windows 7";
                             else if(osInfo.Version.Minor == 0)
                                winVersion = "Windows Vista";
                            break;
 
                    } break;
            }
            lblVersion.Text = winVersion;

?Download winver.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 Dim osInfo As System.OperatingSystem = System.Environment.OSVersion
Dim winVersion As String = ""
Select Case osInfo.Platform
 
    Case System.PlatformID.Win32Windows
 
        Select Case osInfo.Version.Minor
            Case 0
                winVersion = "Windows 95"
                Exit Select
            Case 10
                If osInfo.Version.Revision.ToString() = "2222A" Then
                    winVersion = "Windows 98 Second Edition"
                Else
                    winVersion = "Windows 98"
                End If
                Exit Select
            Case 90
                winVersion = "Windows Me"
                Exit Select
        End Select
        Exit Select
 
 
    Case System.PlatformID.Win32NT
 
        Select Case osInfo.Version.Major
            Case 3
                winVersion = "Windows NT 3.51"
                Exit Select
            Case 4
                winVersion = "Windows NT 4.0"
                Exit Select
            Case 5
                If osInfo.Version.Minor = 0 Then
                    winVersion = "Windows 2000"
                Else
                    winVersion = "Windows XP"
                End If
                Exit Select
            Case 6
                If osInfo.Version.Minor = 1 Then
                    winVersion = "Windows 7"
                ElseIf osInfo.Version.Minor = 0 Then
                    winVersion = "Windows Vista"
                End If
                Exit Select
 
        End Select
        Exit Select
End Select
lblVersion.Text = winVersion

windows bilgilerinin tam listesi aşağıdaki resimlerde mevcuttur

Bookmark and Share

c++da hata ayıklama

15 Mayıs 2010 – 00:15 Yazar: Derya GUNDUZ

c++daki hata yakalama olayı program içindeki istisnai durumları ayrı bir blok içinde tutup,programın çalışmasını engellemelesizi önlüyor.

bunu sağlayan en temel yapı da “throw”‘dur,throw ile hatalı ya da istisnai durumda ne yapması gerektiğini bildiyoruz ve main içinden try-catch yardımıyla hatalı durum zamanında çağırıyoruz.

örneğin bölme işlemi yapan bir program düşünelim, =a bölmek normalde hata verir ,0a bölme yapıldığında programın hata verip  durmasını engellemek için,kendimiz 0a  bölme yapması durumunda istediğimiz  durumu çalıştırıyoruz.

şimdi bunun ile ilgili örnek kodumuzu inceleyelim:

//hata yakalama
#include<iostream>
using namespace std;
double divide(int a,int b){
if(b==0)  throw “0a bolme olmaz”;
return ((double)a/b);
}
int main()
{int p;
 int x,y;
 cout<<”x:”;
 cin>>x;
 cout<<”y:”;
 cin>>y;
 try{
  cout<<”bolum:”<<divide(x,y)<<endl  ;                                  //bir problem yoksa bu kısım çalışır
 }
 catch(char *s)
 {
 cout<<s;                                       //0′a bölme varsa  üstee hhrow ile yazılanı çağırır 
  }
cin>>p;
}

DERYA GÜNDÜZ

http://deryagunduz.blogspot.com

mikroskosmos@hotmail.com

Bookmark and Share

How to Kill A Thread(Bir Thread’in Ölümü)

12 Mayıs 2010 – 17:10 Yazar: Omer Baris KARAER

Başlığı görenler küçümseyebilir ama yapılan büyük bir hata var.Eğer kodunuzda çok fazla cross thread call işlemi yapıyorsak ve herhangi bir threadi belli bir işlemi bitirdikten sonra öldürmek istiyorsak aşağıdaki gibi yapabiliriz

…..

?View Code CSHARP
public class Class1
{
static void Main()
{
 
public bool ThreadCycle
 
Thread worker=new Thread(DoWork);
 
worker.start();
 
}
 
private void DoWork()
 
{
 
while (ThreadCycle)
 
{
 
Xwork();
 
Ywork();
 
zWork();
 
........
 
}
 
worker.Join();//threadi işlemlerini bitiresiye kadar beklet....
 
if(worker.isAlive)
 
worker.Abort();
 
}
}
Evet işlemi gerçekleştirdik ,ThreadCycle değişkeniyle oynadık ,programımızı kapatmak istiyoruz veya threadi bitirmek istiyoruz Abort() metodunu çağırdık ve thread öldü….. mü acaba.Bu işlemle threadin ölüp ölmediginden emin olamazsınız.Bunun yerine yapılması gereken Thread.Abort() metodunun fırlatmış oldugu exception dan yararlanmaktır.ThreadAbortException Abort() metodu çağrıldığı anda fırlatılır.Kodumuzu şu şekilde revize edersek istediğimiz elde etmiş olacağız
Yanii
?View Code CSHARP
try
 
{
 
while(ThreadCycle)
 
{
 
DoWork();.....
 
}
 
}
 
catch(ThreadAbortException e)
 
{
 
MessageBox.Show("Thread öldü...");
 
}

herkese kolay gelsin…

Bookmark and Share

ESOGÜ Bilişim Günleri 2010

11 Mayıs 2010 – 12:00 Yazar: admin

Geçtiğimiz yıl Eskişehir Osmangazi Üniversitesi Bilişim Günleri’nin ilk defa düzenlenmesine rağmen 600’ den fazla kişi katıldı. Yerel ve ulusal basında yer alan bu etkinliğimiz Eskişehir‘de gerçekleştirilen en büyük ve içeriği en zengin bilişim etkinliklerindedir. Geçtiğimiz yılki tecrübelerimize dayanarak bu yıl etkinliğimizi bir adım daha öne götürme hedefine sahibiz. Bunun için gerekli çalışmalara çoktan başladık. Bu yıl 14-15-16 Mayıs tarihlerinde yine Eskişehir Osmangazi Üniversitesi Meşelik Yerleşkesi Kongre ve Kültür Merkezinde düzenlenecek olan etkinliği dört farklı fakülteden 5 öğrenci kulübü organize ediyor. Etkinlik Programı

Bookmark and Share

ASP.Net Server Kontrolleri

10 Mayıs 2010 – 11:33 Yazar: Mehmet KORDACI

ASP.Net ile web uygulamalarımız geliştirirken kimi zaman kontrollerin çalışma şekillerini değiştirmek isteyebiliriz. Kontrollü biraz daha özelleştirmek isteyebiliriz. Bu işlemi kontrolü sayfamızın üstüne attıktan sonra sayfamızın koduna eklemeler yaparak gerçekleştirebiliriz. Ama peki başka bir sayfada daha aynı kontrolü kullanacaksak ne yapacağız. Böyle bir durumda kodları ilk sayfamızdan diğerine kopyalamamız gerekecek. Bu sorunu da böyle hallettikten sonra kontrolümüzü bir çok sayfada kullandık. Peki kontrolümüzün bir özelliğinde değişiklik yapacaksak ne olacak? Eklediğimiz bütün kodları teker teker değiştireceğiz. Daha sonra iş arkadaşınız kendi uygulamasında aynı özelleşmiş kontrolü kullanmak istediğinde ona kontrolün arkasına yazdığımız kodları göndermemiz gerekecek. İşte bu ve buna benzer sorunlardan kurtulmak için kendi ASP.Net Server Kontrollerimizi yazarız.

Bu makalede uygularımızda kullanabilmek için Sayısal Textbox kontrolü oluşturucağım. Sayısal karakterlerin tesbitinde javascript kullanacağım için, javascript bilginiz olması bir avantaj olacaktır. Amacımız custom kontrolleri oluşturmayı anlamak olduğu için çok ayrıntılı bir kontrol yapmayacağım, ama siz bu başlangıcın üzerine eklemeler yaparak istediğiniz hale getirebilirsiniz. Bu konuda karşınıza çıkacak sorunlarda yardımcı olmaya çalışırım.

Öncelikle Visual Studio’da bir web uygulaması açalım. Daha sonra solution’a bir tane ASP.NET Server Control Projesi ekleyelim (Ben NumericTextbox adını verdim.) Kontrolümüzün adını da ServerControl1′den NumText’e değiştirdim.

Kontrolümüzün class dosyasını açtığımızda class’ımızın WebControl class’ından türediğini görebiliriz. Ama ben burada TextBox’ın özelleşmiş bir halini kullanacağım için ve TextBox kontrolünün birçok özelliğini kullanacağım için sınıfımı TextBox class’ından türeteceğim. Bu nedenler WebControl yerine TextBox yazıyoruz. Ayrıca class’ımıza bir adet property eklendiğini ve bu property’nin de default olarak atandığını görebiliriz. Ama biz bu propertyleri Textbox’dan alacağımız için DefaultProperty attribute’unu ve Text property’sini siliyoruz.

Class’ımızın hemen üstünde bulunan

[ToolboxData("<{0}:NumText runat=server>")]

attribute’u ise kontrolü sayfamıza attığımız da markup kodunda kontrolümüzün kodunun nasıl gözükeceğini belirtir. {0} yerine istediğimiz bir prefix yazabiliriz. Şimdilik biz bu şekilde bırakıp işleri ASP.Net’e bırakıyoruz.

Artık biraz kod yazma vakti geldi sanırım. Öncelikle bastığımız karakterleri kontrol edecek javascript kodumuzu yazalım. Javascript kodu ile ilgili işlemleri RegisterJavaScript fonksiyonu ile yapıyoruz.

?View Code JAVASCRIPT
        private void RegisterJavaScript()
        {
            string script = @"
          <SCRIPT language='javascript'>
          function GetNumeric(obj,event)
             {
                var unicode=event.charCode? event.charCode : event.keyCode;
                innerText=obj.value;          
		        if((unicode >= 48 && unicode <= 57) || // 0-9
                   (unicode >= 37 && unicode <= 40) || // yukarı,aşağı,sağ,sol
                   unicode == 8 || // backspace
                   unicode == 46)
		           {
                     event.returnValue=true; 
		           }
                   else if(unicode==9)
                   {
                     event.returnValue=true;              
                   }
                   else
                     event.returnValue=false;
 
             }
            </SCRIPT>";
            script += "\n<SCRIPT language='javascript'>\n";
            script += "function NumericTextBoxOnKeyDown(obj,event){\n";
            script += "GetNumeric(obj,event);\n";
            script += "}\n";
            script += "</SCRIPT>\n";
            if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "NumericTextBox"))
            {
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "NumericTextBox", script);
            }
        }

Bu fonksiyonda basılan karakter sayısal tuşler ise ya da yön tuşları ise işleme alan değilse almayan bir script yazdık. Daha sonra da bu script’i sayfamıza ekleyen kodu yazdık.

Klavye’de basılan tuşları masaüstü uygulamarında rahatça takip edebiliriz ama Asp.Net kontrollerinde bu işlemleri Web de yapmamızı sağlayacak Client eventleri yok. Bu yüzden kontrolün Render metodunu override edip, içinde keydown olayını kontrolümüze eklememiz gerekir.

?View Code CSHARP
        protected override void Render(HtmlTextWriter writer)
        {
            Attributes.Add("onkeydown", "NumericTextBoxOnKeyDown(this,event)");
            base.Render(writer);
        }

Bir şeyi dikkatinizi çekmiştir. NumericTextBoxOnKeyDown javascript fonksiyonunu kullanmamıza rağmen sayfamıza henüz eklemedik. Bunun için ise OnPreRender metodunu override edeceğiz ve RegisterJavaScript fonksiyonunu çağıracağız.

?View Code JAVASCRIPT
    protected override void OnPreRender(EventArgs e)
    {
      base.OnPreRender(e);
      RegisterJavaScript();
    }

Solution’ın tamamımını derledikten sonra web uygulamamızda bir sayfa açalım. Toolbox’a baktığımızda kontrolümüzün en üst kısımda eklendiğini görebiliriz. Kontrolü sayfamıza atalım ve uygulamamızı çalıştıralım. Gördüğümüz gibi artık içine sadece sayıları girebildiğimiz bir kontrolümüz oldu.

Şimdi de kontrolümüze bir property ekleyelim. Bu property kontrole kaç tane sayı girilebileceğini belirlesin. Böylece uygulama geliştiriciye design time’da kaç tane sayı girilebileceğini belirtme şansı vermiş oluruz.

?View Code CSHARP
       private int _KacSayi = 10;
        public int KacSayi
        {
            get
            {
                return _KacSayi;
            }
            set
            {
                _KacSayi = value;
            }
        }

Bu property’i ekledikten sonra RegisterJavaScript fonksiyonunu biraz değiştirmemiz gerekli. GetNumeric javascript fonksiyonunu aşağıdaki hale getiriyoruz.

?View Code JAVASCRIPT
          function GetNumeric(obj,event)
             {
 
                var unicode=event.charCode? event.charCode : event.keyCode;
                innerText=obj.value;   
                if(innerText.length < "+ KacSayi + @" ) 
                { 
		        if((unicode >= 48 && unicode <= 57) || // 0-9
                   (unicode >= 37 && unicode <= 40) || // yukarı,aşağı,sağ,sol
                   unicode == 8 || // backspace
                   unicode == 46)
		           {
                     event.returnValue=true; 
		           }
                   else if(unicode==9)
                   {
                     event.returnValue=true;              
                   }
                   else
                     event.returnValue=false; 
                    }
                    else
                    {
                       event.returnValue=false; 
                    }
 
             }

Tekrar rebuild all ettikten sonra, sayfamızda kontrolümüze sağ tıklayıp özelliklerine baktığımızda eklediğimiz property’nin özellikler penceresine geldiğini görürüz.

Böylece kendi özelleşmiş kontrolümüzü yazmış oluyoruz. Yeni client side olaylar, property’ler ve fonksyisonlar ekleyerek çok daha güzel bir hale getirebilirsiniz. Gerisi ihtiyaçlarınıza ve hayal gücünüze kalmış.

Bookmark and Share