Merhaba arkadaşlar,
yazmayalı çok oldu özledim yazmayı (: işlerden fırsat bulamadım desem yeridir. daha once verdiğim Grid sınıfında  BeforeCellPrint ,Rowprint gibi eventlar görmüşsünüzdür. arkadaşlarıdan biri msnden bunların nasıl çalıştığını sordu. sınıftaki kullanımını incelese sanırım olayı tam anlamak için bunu bana iletti. olaylarla mimari geliştirmek programlamada büyük önem arz eder.  hemen her programcı kodladığı winForm uygulamalarında buton_Onclick  olayı ile tanışmıştır. C#ta eventlar delegateler sayesinde olur. delegate türke anlamıyla vekil (aracı) demek. öyle bir tp düşünün ki bu  bir fonksiyon tipine denk geliyor. fonksiyon tanımına uyan bir tip belirliyorsunuz
örnek:

public delegate void DataSourceChangedEventHandler(D3Grid sender, DataTable currentData, DataTable newData);

grid sınıfımız DataTable içindeki satırlar ve sütunlarla bir html tablo oluşturuyor bildiğiniz gibi. Datasource değiştiğinde tetiklenmesini istediğim bazı olaylar vardı ve bunlar için DataSourceChangedEventHandler tipinden fonksiyonlara denk gelecek bu delegate tanımını yazdım. sınıfın kendisini ,mevcut datatable’i ve atanan datatable’i parametre olarak verdik. fonksiyonlarımızı atayabileceğimiz bir de event tanımadık

public event DataSourceChangedEventHandler DataSourceChanged;

bunun tetiklenmesini şu şekilde sağladık.

private DataTable _datatable;

public DataTable DataSource
{
get
{
return _datatable;
}
set
{
if (DataSourceChanged != null)
{
DataSourceChanged(this, _datatable, value);
}
_datatable = value;
}
}

Datasource propertysi set edildiğinde DataSourceChanged adlı elemanımıza olay atanmışsa bunun parametrelerini verip tetiklenmesini sağladık.

bu anlatımım için de yine her anlatımımda olduğu gibi örnekler artııkça sizinle paylaşacağım.

iyi çalışmalar.

Merhaba arkdaşlar, bugün yine yazmak istediğim bir konu var “Extension Methods in c#” ilk once extension amacını anlatmak istiyorum. bildiğiniz üzere .NET framework 3.0 ile LINQ mimarisi üzerine çalışıldı. 2.0 üzerinde oynanma yapılmadan genişletme çabaları da Extensionları doğrumuş. sınıfların LINQ yapısıyla çalışabilmesi için bazı metodlara sahip olması gerekir. bu metodlar extenion yapısıyla bazı classlara eklenmiş oldu.

bize sağladığı güzelliklerin başında “sealed class” (final class) lar için genişletebilme olanağıdır. Object Oriented yapısında genişletme “Inheritance” yani kalıtım ile olur . ancak extensionları kalıtım gibi görmemk lazım. “Delphideki Helper Class”‘ları bilen arkadaşlarımız da bu yapıya yabancı sayılmazlar.

Örnek Olarak:

 

bu metod string sınıfı için yazılmış Int32 dönüşümü yapan bir extension metoddur.

Code completer’ın bize metodları gösterebilmesi de gerçekten  cok iyi.  metodların solundaki Mavi oktan bunların Extension Method olduğunu anlayabiliyoruz.

Küçük bir örnek daha en cok kullandığımız işlemlerden biri olan formlardan sayı gelip gelmediğidir bunu suncuu taraflı kontrol etmek istediğimizde  string  için güzel bi metod olur (:

SQL sorguları gibi kullandığımız LINQ yapısı aslında arka planda metodlarla anlaşır ki bunu gerektiriyor zaten. bir programlama diline adabte edilebilmesi için en mantıklı yöntem seçilmiş.

kısaca extensionları anlatmaya çalıştım arkadaşlar gerisi de sizin hayal gücünüze ve  İhtiyacınıza kalmış.

görüşmek üzere…

user32.dll hakkında ilk yazmaya karar verdiğimde bu konuların sonunun gelmeyeceğini tahmin edebildiğim için kategori açmıştım . şimdi o kategorideki ikinci yazımı yazmak istiyorum. ufak bir projede remote control olayını yapmak istediğm (sakın kendi pcnizi yonetmeyi denemeyin mutlaka bir server-client olsun )  bu olayda işimize yaricak tek EntryPoint mouse_event olacak. bu fonksiyon  windowsa mouse Down ve Mouse Up  mesajları gondermemize yarıyor. Down+Up=Click olacağından bize clik , double click , right click kapılarını da açmış oluyor.  bunu ilk once kendi pcmde denemeye kalktım ama mantıksızlık olduğunu anca pc donunca anladım (: ilk ekran goruntusu alma konumuzdaki fonksiyonu kullanarak ikinci monitorumden goruntu aldım oncelikle.  biraz eğlence oldu tabi monitor değişinceye kadar ana monitorden goruntu alıp yine ana monitordeki programcığımda bunu göstermeye çalıştım işte görüntü aşağıda (:

biraz bu görüntü ile eğlendikten sonra bir de bunlara click gondermeyi denedim  ve sonuç BUM :D click olayı ekranın aynı yerine click ettiği için bu benim programdaki clik olayıma geliyor ve click bir daha calışıyor bu da pcmin donmasına sebep oldu.

işte win apinin mouse eventlarıyla geliştirebileceğiniz sınıfım.

0
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
a
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace WinApi
 
{
public class Mouse {
 
// user32.dll apisinin mouse_event EntriPointinden Yararlancaz.
 
[DllImport("user32.dll")]
 
private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo);
 
// Onay Tanmlarmz
 
// -------------------
 
// Sol Down
 
public const UInt32 MouseEventLeftDown = 0x0002;
 
// Sol Up
public const UInt32 MouseEventLeftUp = 0x0004;
 
// Sa Down
public const UInt32 MouseEventRightDown = 0x0008;
 
// Sa Up
public const UInt32 MouseEventRightUp = 0x00016;
 
// Kk FOnksiyonumuzu yazalm tm mouse eventlar burdan geecek yani mouse_event'tan
private static void SendMouseEvent(UInt32 Button, uint x, uint y, System.IntPtr intptr)
 
{
 
mouse_event(Button, x, y, 0, new System.IntPtr());
 
}
 
// Down eventi gonderen fonksiyon. (Mouse Butonuna Basma. )
 
public static void SendDown(UInt32 Button, uint x, uint y)
 
{
 
// Cursoru tklamak istediimiz koordinatlara Konumlandryoruz.
Cursor.Position = new Point((int)x, (int)y);
 
// Olaymz Gonderiyoruz.
SendMouseEvent(Button, x, y, new System.IntPtr());
 
}
 
// Left Down Fonksiyonumuz.
public static void SendLeftDown(uint x, uint y)
 
{
 
SendDown(MouseEventLeftDown, x, y);
 
}
 
// Up Fonksiyonumuz.(Buton Brakma lemi)
public static void SendUp(UInt32 Button, uint x, uint y)
 
{
 
// Cursoru tklamak istediimiz koordinatlara Konumlandryoruz.
Cursor.Position = new Point((int)x, (int)y);
 
// Olaymz Gonderiyoryuz.
SendMouseEvent(Button, x, y, new System.IntPtr());
 
}
 
// Left Button Up Fonksiyonu (Sol Butonu Brakma ilemi)
public static void SendLeftUp(uint x, uint y)
 
{
 
SendMouseEvent(MouseEventLeftUp, x, y, new System.IntPtr());
 
}
 
// 1 basma + 1 brakma = 1 click olacandan click olaymz da bu ekilde gnderiyoruz.
 
public static void sendLeftClik(uint x, uint y)
 
{
 
SendLeftDown(x, y);
 
SendLeftUp(x, y);
 
}
 
// DoubleClick=2xClick (:
public static void SendDoubleClick(uint x, uint y)
 
{
 
sendLeftClik(x, y);
 
sendLeftClik(x, y);
 
}
 
}
 
}

user32.dll için ilk  konu buna denk geldi hadi hayırlısı (: ekran görüntüsünü izletmek istediğimde mouse olmadığını farkettim.  buna çozüm için de Corsor.Draw  özelliğini kullandım . zaten ekran görüntüsünü almak için Graphics sınıfını kullanıyordum.  Draw fonksiyonu da graphics  objelerine yazdırabiliyordu. süper. !

0
namespace D3 {
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class D3Cursor
    {
        [DllImport("user32.dll", EntryPoint = "LoadCursorFromFile")]
        private static extern IntPtr LoadCursorFromFile(String dosyaAdresi);
        
        public static Cursor Create(string dosyaAdresi)
        {
            IntPtr hCursor = LoadCursorFromFile(dosyaAdresi);
 
            if (!IntPtr.Zero.Equals(hCursor))
            {
                return new Cursor(hCursor);
            }
            else
            {
                throw new ApplicationException("Cursor Dosyadan Okunamadı file " + dosyaAdresi);
            }
        }
    }
 
}

user32.dll içindeki LoadCursorFromFile fonksiyonundan yararlandık. fonksiyon bize IntPtr (Pointer) türünden bir obje döndürüyor. Cursor sınıfı da bu pointer ile cok rahat cursor oluşturabiliyor. zaten bize windowstaki bir elemanın özelliklerinden biri gerekiyorsa bunu en iyi pointerlarla alırız. ve bu en garanti çözümlerden olur.
dosyadan okuyamadağı taktirde ApplicationException türünde yakalanabilir bir hata dönderecektir.

iyi çalışmalar

© 2012 Tufan Suffusion theme by Sayontan Sinha