Merhabalar, custom bir mesasgebox için ihityaç duyan bir arkadaşın sorusu üzerine inceledim, opak bir layer üzerine messagebox göstermek istemiş, controllerin ekleniş sırası ve draw sırasında bir arkaplanının oluşması bunu zorlaştırmış gibi ama kullnmak isteidimiz panelden bir panel türetip onpaint metodunu ve ve defaultparams propertysini override ederek halledebiliyoruz,

Transparent Panel üretelim birtane;

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams createParams = base.CreateParams;
            createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return createParams;
        }
    }
 
    protected override void OnPaintBackground(PaintEventArgs e)
    {
        SolidBrush brush = new SolidBrush(Color.FromArgb(100, 0, 0, 0));
        e.Graphics.FillRectangle(brush,0,0,this.Width,this.Height);
    }
 
}

ve bunu form yüklendikten sonra create edip istdiğimiz gibi göstertebiliyoruz.!

0
1
2
3
4
5
6
7
8
9
10
11
void Form1_Load(object sender, EventArgs e)
        {
            TransparentPanel overlay = new TransparentPanel();
            overlay.BackColor = Color.FromArgb(50, Color.Black);
            overlay.Width = this.Width;
            overlay.Height = this.Height;
 
            this.Controls.Add(overlay);
            overlay.BringToFront();
 
        }

Genelde sort işlemleri için query build ettirme ile başlarız programlamaya, işler büyüdükçe dataların anlık bir serverdan alınması olayına karşı çıkarız hemen, cache girer araya, bazı işleri ramde halletmek vs.. uzatabiliriz, sort işlemini kısaca lambda operatorunu kullanarak nasıl yaparıza bir örnek vermek istiyorum.

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
class Program
 
{
 
 static void Main(string[] args)
 
 {
 
 List<User> users = new List<User>(new [] {
 
 new User {FirstName = "Tufan Barış",LastName = "YILDIRIM"},
 
 new User {FirstName = "Ergin",LastName = "Tekinbaş"},
 
 new User {FirstName = "Vuslat",LastName = "Çalışal"},
 
 new User {FirstName = "Nilüfer",LastName = "Öztürk"}
 
 });
 
 Console.WriteLine("Order by FirstName ASC");
 
 users.Sort((u1, u2) => string.Compare(u1.FirstName, u2.FirstName, false));
 
 PrintList(users);
 
 Console.WriteLine("Order by FirstName DESC");
 
 users.Sort((u1, u2) => string.Compare(u2.FirstName, u1.FirstName, false));
 
 PrintList(users);
 
 Console.WriteLine("Order by LastName ASC");
 
 users.Sort((u1, u2) => string.Compare(u1.LastName, u2.LastName, false));
 
 PrintList(users);
 
 Console.WriteLine("Order By LastName DESC");
 
 users.Sort((u1, u2) => string.Compare(u2.LastName, u1.LastName, false));
 
 PrintList(users);
 
 Console.ReadLine();
 
 }      
 
 static void PrintList(List<User> users)
 
 {
 
 foreach (var user in users)
 
 {
 
 Console.WriteLine("{0} {1}",user.FirstName,user.LastName);
 
 }
 
 }
 
}
 
public class User
 
{
 
 public string FirstName { get; set; }
 
 public string LastName { get; set; }
 
}

MultiThread birden fazla işlemi beraber yürütme işlemine denebilir. Multithreadin önemi şurda doğar, işlemlerimiz yürürken programımız bize o işlemi hisettirmesin (programızı işleten ana iş parcacığından farklı bir iş parcacığı bu işlemi yürütsün) istiyorsak multithread işlemlere ihtiyacımız olacaktır.

WPF elemanları bir thread tarafından oluşturulur (ana threadimzi olur bu ) ve bu thread tarafından sahiplenilir. Diğer threadler bu elemanlara ulaşamaz.(Ekranda gördüğümüz elemanlar ). wpf elemanlarının “Dispatcher” propertysi ile sahibi olan Thread’e ulaşıp ona Invoke metodunu kullanarak iş yaptırabiliyoruz. ilk önce Dispatcherin kök sınıftan geldiğini söylemeliyim ki her elemanda Disparchera ulaşabileceğimizi bilelim. Hiyerarşide  bunu göreibliyoruz.

Not : Abstract Classların köşeleri oval olarak eklenmiştir.

Dispatcherobjelerin Dispatcher propertsi bizi threade ulaştırabiliyor. threadler için aracı fonksiyonlar oluşturmak da gayet basit oldğuna göre. bir threade ulaşıp ona yaptırmak istediğimiz işlemi delegate ile verebilirz.

Örnek bir Thread yazıp bu Threadin bir listboxa eleman eklemesini sağlamaya çalışalım

0
1
2
3
4
5
6
private void ListBoxDoldur(){
for (int i = 0; i < 500; i++)
                {
                    listBox1.Items.Add(String.Format("{0} Nolu Elaman", i));
                    Thread.Sleep(100);
                }
}

bu metodu çağırırsak işlem bitene kadar programımız bize yanıt vermeyecektir. şimdi bu metodu yeni bir thread ile çağıralım.

0
   new Thread(ListBoxDoldur).Start();

bu işlem eleman eklerken bize şoyle bir hata verdirecektir.
“Başka bir iş parçacığına ait olduğundan çağıran iş parçacığı bu nesneye erişemiyor.”

Eleman eklemeye çalışan iş parcacığı ListBox’un sahini olmadığından bu işlemi gerçekleştiremeyecektir.

delegate Orneği ;

0
1
2
3
4
5
6
7
8
9
10
private void ListBoxDoldur(){
for (int i = 0; i < 500; i++)
                {
                    listBox1.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
                    (ThreadStart)delegate()
                {
                    listBox1.Items.Add(currentUser.Name);
                });
                    Thread.Sleep(100);
                }
}

listBox1 elemanının threadini alıp ona isimsiz bir fonksiyon gonderdik ve o işi yapmasını soyledik. şimdi hatasız bir şeilde 500 elemanı programımızı dondurmadan ekleyebildik.

bir sonraki örneğimiz multithread bir chat server olacaktır. iyi çalışmalar.

IEnumerator Arayüzü:


 

 System.Collections isimalanı içinde bulunan bu arayüz Iteator işlemleri yapmamızı sağıyor. Bunu kendimiz de yapamaz mıyız ? tabi ki yaparız. Ama  belli başlı sınıflar ya da kullanımlar bizden IEnumarator ya da IEnumarable arayüzüne sahip sınıflardan türetilmiş elemanlar ister bu yüzden iterator işlemlerimiz için kendi yapımızı kullanmak yerine IEnumarator ve IEnumarable arayuzlerini implment edersek genel geçer bir yapımız olur.

Bu yapıyı şunlara benzetebiliriz.
Foreach
PHP’de db result fetching olayları.
.Netciler de zaten .GetEnumartor() metorlarını çokça kullanmışlardır. 

Neden MovePrev yok derseniz onu da  makaleyi okuduktan sonra eklersiniz.  sınıflarımıza (:. 

IEnumerable Arayüzü:



Tek metod (GetEnumarator) isteyen bu arayüz bir iterator olmanız yerine sizden iterator gorebi gorebilecek bir dongu de alabilir. Bu da cok işimize yarayabilecek ozelliklerden biridir. Hemen bir IEnumarator dönderebilen Sınıf implement ediip geçmeden önce yield return’dan bahsederlim 

Yield Return:



IEnumarator dönüş tipi olan bir fonksiyon (Örn: GetEnumarator()) birden fazla elemanın ard arda dönebileceğini düşünün. Ki zaten .nett te Enumarator yapısı bunun üzerine kurulmuştur. IEnumarator yapısıyla dönecek elemanın tipi de belirlenebiliniyor. Bu da bizi Current elamanının type casting olayından kurtarıyor. IEnumarator dönüş tipinizse yield return ile birden fazla eleman döndürüp bunu da GetEnumarator() dye tanımlayabilirsiiz bunları yapmışken IEnumarable arayüzünden implement ederseniz yine bazı standartlara uymuş olursunuz. 

Şimdi hem IEnumarable türüne örnek yazalım hem de yield return kullanımına örnek göstereelim.

Örnek sınıfımız artık bize bir numarator verebiliyor. 

Ve bu kullanıma artık müsait. Tabi ki kullanımız bu kadar basit olmayacaktır ancak örnek olması açısından düşünülebilir. Bu verilerin bize belli bir kaynaktan geldiğini varsayalım yine hiç bir şey değişmeyecek ve kaynağımızdan alma sırasına göre numratatore gonderebileceğiz. Örnek sınıfımızı hiç bozmadan buna örnek vermek istersek. 

Yield return anında bir kırılma olabilir mi ? return olsaydı olurdu anca debug anında şoyle bir şey gözlemledim. Numarator alan fonksiyon ya metodlar beraberinde üretim fonksiyonununda ismini taşıyor “GetEnumaratıor” tahminimce kaldığı yeri de burdan biliyor 

IEnumarator<T> Arayüzü:



Kendi tiplerimize iterate ozelliği kazandırabilir miyiz. .NET in En sevdiğimiz yapılarından olan Generic Collections bize bura da Numaratorleri object türünden değil de kendi tiplerimizde kullanma şansı veriyor. LINQ içinde from eleman in elemanlar dediğimizde eleman tipini tanıması generic collectionslarda tipin zaten tanımlanıyor olmasıdır. Biz de numaratorlerimizde YazilimciNumarator.Current deiğimizde cast ihtiyacı duymadan . tipine uygun metodları ya da propertyleri kullanabilmemiz için Enumarator arayüzüne de sahip bu arayüzü kullanmalıyız bir yazılımcı sınıfı yazıp numaratore ornek verelim.

IEnumarable<T> Arayüzü:



IEnumarable Arayüzü ile aynı olan bu arayüz GetEnumarator metodunu ezerek buna bir de tip tanınlanmış olan IEnumarator tipinde bir Generic dönderir. Yine bu metodu biz yazacağız.
Yazılımcı listesini yine bir “yield return” örneğiyle kısaca anlatalım.
Artık tipimiz de belliyse şimdi numarator gibi kullanırken”Current” bize “Yazilimci” gibi davranabilecek davranmaktan ziyade tipi zaten Yazilimci olacaktır fakat bunu cast etme ihtiyacı duymadan kullanabileceğiz.

Makaleyi  pdf formatta isterseniz

IEnumarable ve IEnumarator.pdf

iyi çalışmalar..

© 2012 Tufan Suffusion theme by Sayontan Sinha