Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

26 Kasım 2009 Perşembe

Form harici bir sınıftan formun kontrollerine erişmek


using System;
using System.Threading;
using System.Windows.Forms;
/**
* Invoke metodu ne iş yapar?
* Invoke işlemi bir thread içinde işlem yaparken başka threaddeki bir control üzerinde işlem yapmamızı sağlar.
* Invoke metodunu kullanmadan bu control'e erişmeye kalkarsak
* "Cross-thread operation not valid"
* gibi bir mesaj alırız.
*
* Eğer runtime da ekledigimiz controller varsa ve thread içerisinde onlara erişmemiz gerekiyorsa
* invoke ve delegate kullanarak bunu yapabiliriz.
**/
namespace waForm
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private delegate void DelFormCalisirkenBizimMetodaErismemizeYardimciOlacakMetotReferansi();

private void button1_Click(object sender, EventArgs e)
{
FormHariciSinif mt = new FormHariciSinif();

DelFormCalisirkenBizimMetodaErismemizeYardimciOlacakMetotReferansi yardimciOlacakMetotReferansi
= new DelFormCalisirkenBizimMetodaErismemizeYardimciOlacakMetotReferansi(mt.f_CalistirmakIstedigimizMetot);

/**
* Formun çalışmasından farklı olarak (Bunun main thread, ilk iş parçacığımız olduğunu unutmayalım)
* Calismasini istediğimiz
* "FormHariciSinif"
* sınıftan türetilen bir objenin
*
* "f_CalistirmakIstedigimizMetot"
* metodu bulunuyor.(Bununda ikinci iş parçacığı olacağını unutmayalım)
*
* Ama metodumuz formun dışında bir sınıfın objesine ait olacağı ve her işlemin sonunda Form daki btn isimli button
* kontrolüne erişeceği için thread ler arası(iş parçacıkları arası) bir iletişime ihtiyacımız var.
**/

// Metodun sonunda, f_InvocationBitti metodu çalışsın
yardimciOlacakMetotReferansi.BeginInvoke(f_InvocationBitti, null);
}

private void f_InvocationBitti(IAsyncResult _ar)
{
if (_ar.IsCompleted)
{
MessageBox.Show("bitti");
}
}
}

public class FormHariciSinif
{
public void f_CalistirmakIstedigimizMetot()
{
Form frm = Form.ActiveForm as Form1;
Button btn = (Button) frm.Controls.Find("btn", true)[0];
for (int i = 0; i < 10; i++)
{
if (btn.InvokeRequired) // btn nesnesine başvuru farklı iş parçacığından mı? yani invoke gerekli mi?
{ // Gerekiyorsa, yeniden bir metodun referansına Invoke ile gideriz.
btn.Invoke(new MethodInvoker(delegate
{
btn.Text = i.ToString();
}));
}

Thread.Sleep(250); // Çalıştığını görelim diye.
}

/** for döngüsünden çıkınca da çalışsın diye buraya konulabilirdi ama
* biz, BeginInvoke(fBitinceCalisacakFonk,null) diye yazdık.

if (btn.InvokeRequired)
{
btn.Invoke(new MethodInvoker(delegate
{
MessageBox.Show("bitti");
}));
}
* */
}
}
}



Hiç yorum yok: