Yine Edit Nesnesi

Başlatan tolga.onder, 04 Mayıs 2010, 13:56:43

tolga.onder

Merhabalar,


  Önceki başlığımda formumda kullandığım her edit nesnesinin eventına aynı kodu yazmanın sıkıntılı olduğundan dolayı, daha pratik bir yol var mı diye sormuş , cevaplar arasında  Function ve Procedurları kullanmam yönündeki çözümü kullanmaya karar vermiştim.

  Şimdiki sorunum ise : Edit nesnesinin içeriğinin boş olması durumunda cursor un edit içerisinde kalıp , kullanıcıyı veri girmeye zorlamasını istiyorum. Biliyorsunuz bu işi setfocus methoduyla ve if then döngüsüyle yapabiliyoruz. fakat ben bunu bir procedure haline getirip edit nesnesinin OnExit event ından çağırmak istiyorum. Ama kendimin tanımladığı procedure da edit1.setfocus yazdığımda hata alıyorum.



Normalde Onexit Eventına yazdığım ve çalışan kod:


if edit1.Text ='' then
      begin
      edit1.SetFocus;
      end;


bu kodu Onexit Eventından çağırdığım procedurun içine  yazdığımda hata alıyorum.
Çözümlerinizi bekliyorum. Şimdiden Teşekkürler.

Analyzer

Selam,

Form1.Edit1 şeklinde hangi Edit1 nesnesi olduğunu tanımlamanız gerekir. Ayrıca sahiplilik(owner) konusunda burada güzel bir makale mevcut : http://www.ceviz.net/programcilar-icin-yazarlik-dersleri-2_s2_a1199.html

Analyzer
Üşeniyorum, öyleyse yarın!

tolga.onder

biraz daha açarmısınız anlayamadım. Ayrıca biraz daha sorunumu açayım. bir Edit_Denetle adında Function düşününün. Edit nesnesinin Onexit Eventından Edit_Denetle(Edit1.Text); şeklinde çağırdım. Yani function uma edit1 ın string içeriğini parametre olarak verdim. Function umun  bu içeriğin boş olması halinde bana Edit1.setfocus komutunu geri döndürmesi gerekiyor veya function içerisinde Edit1.setfocus komutunu işletmesi gerekiyor. zaten Function içerisinde edit1 yazıp noktaya basdığımda kullanabileceğim metotlar bir pencere halinde gelmiyor.

Analyzer

Selam,

Delphi ve BCB'de nesne silsilesi şeklinde tanımlanır ve işlem yapılır. Örneğin TForm sınıfı ile Form1 nesnesini tanımlarsınız. (veyahut proje ilk açıldığında tanımlı gelir) Bu Form1 nesnesi üzerine bir TEdit nesnesi düşürürseniz varsayılan olarak ismi Edit1 olur. Derleyiciye bu Edit1 nesnesini belirtmek isterseniz bu Edit1 i aslında Form1.Edit1 olarak işaret etmeniz gerekir. Yani örneğin iki formunuz ve ayrı formlarda iki tane Edit1 nesneniz var. Siz Edit1 dediğinizde, derleyici doğal olarak hangi Edit1 kastettiğinizi bilmediğinden hata verecektir. O nedenle Form1.Edit1.Text := "vs."; şeklinde işlem yapmanız gerekir. Sizdeki OnExit event'i, zaten TEdit nesnesinden dolayı Form1'in "yavrusu" olduğundan tekrar Form1.Edit1 şeklinde yazmanız gerekmez. Ancak Form1 nesnesine ait olmayan bir fonksiyondan Edit1 i çağırıyorsanız, başına "owner"'i olan Form1 ibaresini yazmanız gerekir.

Analyzer
Üşeniyorum, öyleyse yarın!

tolga.onder

ilginize teşekküer Analyzer,

Vermiş olduğunuz Memik Yanık a ait makaleden esinlenerek şu şekilde yaptım ve oldu.
benim problemim kendi yapmış olduğum procedure veya function içinde form1 üzerindeki edit nesnesine ait mesela text methodunu kullanamamdı. aşağıdaki gibi yapınca oluyor.

Procedure Edit_Denetle(bilesen:TEdit);
begin
          If bilesen.text = '' then
          begin
           bilesen.setfocus;
end;

end;


orhanc

Delphide componentleri bu şekilde topluca kontrol edebilirsin. Ayrıca tek satır işlemlerde
if then
den sonra
begin end
kullanmana gerek yok.

procedure TfrmAtaForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  i : Integer ;  
begin
  for i := 0 to ( Sender as TForm ).ComponentCount - 1 do
  begin
    if ( Sender as TForm ).Components[i].ClassName = 'TcxDBLookupComboBox' then
    begin
      if ( ( ( ( Sender as TForm ).Components[i] ) as TcxDBLookupComboBox ).DroppedDown ) and ( Key = VK_RETURN ) then
        Exit ;
    end;
    if ( Sender as TForm ).Components[i].ClassName = 'TcxComboBox' then
    begin
      if ( ( ( ( Sender as TForm ).Components[i] ) as TcxComboBox ).DroppedDown ) and ( Key = VK_RETURN ) then
        Exit ;
    end;
  end;
  if Key = VK_RETURN then
    ActiveControl := FindNextControl( ActiveControl , True , True , False ) ;
  if Key = VK_ESCAPE then
    Close ;
end;
i'm doing nothing... Giddy Up  http://www.drorhan.com

Analyzer

Alıntı yapılan: tolga.onder - 04 Mayıs 2010, 15:33:12
ilginize teşekküer Analyzer,

Vermiş olduğunuz Memik Yanık a ait makaleden esinlenerek şu şekilde yaptım ve oldu.
benim problemim kendi yapmış olduğum procedure veya function içinde form1 üzerindeki edit nesnesine ait mesela text methodunu kullanamamdı. aşağıdaki gibi yapınca oluyor.

Procedure Edit_Denetle(bilesen:TEdit);
begin
          If bilesen.text = '' then
          begin
           bilesen.setfocus;
end;

end;

Selam,

Evet sizin yaptığınız da doğrudur. Burada da TSender nesnesiyle bir nevi fonksiyon
içine TEdit nesnesini "gönderiyorsunuz". Bu fonksiyonları ve nesneleri birbirinden
bağımsız olarak düşünün. İki bağımsız nesneyi ilişkilendirmek adına, siz TSender ile
"etiket" yolluyorsunuz bir manada. Torry.net sitesinde tips adında bir bölüm var.
İngilizceniz varsa basit bir dille bir çok örnek anlatılıyor, soru cevap şeklinde.
Çok faydalıdır.

Analyzer
Üşeniyorum, öyleyse yarın!

tolga.onder

If then end bloğunun arasında tek satırlık kod kullanılacağı zaman begin end e gerek olmadığını biliyorum. Ama alışkanlık yapıyor. Sürekli tek satır çalışdıktan sonra birden fazla satır kullanma ihtiyacı duyarsam begin end i unutuyorum. Ondan sonra çok basit bir şey için yarım saat tırmalıyorum.  Bir nevi yoğurt yeme şekli yani.

a_a_sezen

Sender parametresi toplu işlemlerde her zaman işinize yarayacaktır. Bileşenlerin fonksiyonlarının hemen hepsinde bulunur.
Ayrıca Delphi de nasıl yazılır bilmiyorum ama
If bilesen.text = ''
şeklindeki kontrolunuz yerine
if(bilesen->Text.IsEmpty())
kullanımını tavsiye ederim. Yine aynı yerde kullanıcıyı neden zorladığınızı mesajla bildirmeniz de isabetli olabilir.
Kendi kullanımımdan bir örnek kod aşağıya kopyalıyorum. Delphicesi çok farklı olmayacaktır.
bool TFrmAna::TextKontrol(TObject *Sender)
{
	TEdit *Edit = dynamic_cast<TEdit *>(Sender);
	if(Edit->Text.IsEmpty()) {
		Application->MessageBox(L"Tüm değerleri girdiğinizden enim olunuz!",
								L"ASOZA Asal Uyarısı", MB_OK + MB_ICONINFORMATION);
		Edit->SetFocus();
		return false;
	}
	UnicodeString asMesaj = "En fazla basamak sayısı : " + String(SAYIBOYU);
	if(Edit->Text.Length() > SAYIBOYU) {
		Application->MessageBox(asMesaj.w_str(),
								L"ASOZA Asal Uyarısı", MB_OK + MB_ICONINFORMATION);
		Edit->SetFocus();
		return false;
	}
	/*
	char *pcYazi = new char[Edit->Text.Length() + 1];
	strcpy(pcYazi, Edit->Text.c_str());
	for(int i = 0; i < *(pcYazi + i) != '\0'; i++) {
		if(!isdigit(*(pcYazi + i))) {
			Application->MessageBox(L"Sadece rakam girdiğinizden enim olunuz!",
									L"ASOZA Asal Uyarısı", MB_OK + MB_ICONINFORMATION);
			Edit->SetFocus();
			return false;
		}
		Application->ProcessMessages();
	}
	*/
	return true;
}

Güce ve Geleceğe Güvenle...