Form üzerindeki değişiklikler nasıl algılanır?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Form üzerindeki değişiklikler nasıl algılanır?

Mesaj gönderen cappy2005 »

Merhaba,
Bir form ve üzerinde 15 tane veri giriş kontrol olduğunu düşünelim, işte bunlar edit,combobox,memo,checkbox vs. olsun.Kullanıcı bu formu açtığında tüm alanlar boş olacak bu alanlardan herhangi birine bir değer giripte formu kapatmak isteiğinde "Çıkmak istediğinizden eminmisiniz?" şeklinde bir mesaj göstermek istiyorum.

Başka bir durum ise kullanıcı belli bir kayıdı çağırıp üzerinde bir alanı değiştirip kayıt etmeden çıkmak isterse yine aynı şekilde bir mesaj göstermek istiyorum.Bunun için her seferinde tüm alanların yeni ve eski hallerini karşılaştırmak mı gerekiyor.Bu işin daha kolay bir yolu var mı?Sizler bu durum için ne düşünüyorsunuz.

Son olarak Visual Basic ile çalışan bir arkadaşımdan yanlış hatırlamıyorsam IsDirty şeklinde bir metod olduğunu duymuştum bu metod form üzerinde bir değişiklik olup olmadığını bildiriyormuş benim hatırladığım kadarıyla bu şekilde ama tam emin değilim.Delphide böyle bişey varmı?
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

boolean tipinde isediting özelliği vardır. Bunu denetleyerek değişiklik yapılıp yapılmadığını anlayabilirsiniz.

Eğer table nesnesine bağlıysa zaten otomatik olarak table 'ın duruu Edit olur. Onuda

Kod: Tümünü seç

table.state=dsedit
ile anlayabilirsiniz.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

S.A.

DataSource'da OnDataChange var.
Veri değişikliğinde ve Next gibi işlemlerde bu tetikleniyormuş.
Form açıldığı anda 'DataChanged' gibi global bir değişkene False değerini atayıp, OnDataChange'de bu değişkene True değeri atarsanız, sanırım istediğiniz olur.

Kolay gelsin.
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Mesaj gönderen cappy2005 »

Cevaplar için teşekkür ederim ama sanırım ben derdimi anlatamadım.

Benim bir formun var ve üzerinde edit,combobox,checkbox ve aklınıza gelen diğer veri giriş bileşenlerinden var.Kullanıcı formu açtı herhangi bir chekbox'ı tıkladı ve bir edit içine sadece bir harf yazdı örnegin "c" harfi olsun ve formu kapatmak istedi.

Şimdi bu noktada veritabanı ile hiçbir ilişkimiz olmadı dolayısıyla şu an için veritabanı bana değişiklik var diyemez ama bir değişiklik oldu bir checkbox işaretlendi ve edit içine bir harf girildi benim öğrenmek istediğim böyle bir değişikliği nasıl yakalarım.Dolayısyla kullanıcı çıkmadan mesaj verebilirim.

Daha somut bir örnek göstermek gerekirse notepad'i açıp bir harf yazıp kapatmak istesek hemen uyarı verir.Benimde yapmak istediğim böyle bişey ama form üzerinde bir çok edit,combobox,memo vs. olunca bu işin daha basit bir şekli varmı diye araştırmaya başladım?Bu işin daha kolay ve programatik bir yolu var mı? yoksa her bileşen her seferinde kontrol mu edilmeli?
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Mesaj gönderen cappy2005 »

mkysoft yazdı:boolean tipinde isediting özelliği vardır. Bunu denetleyerek değişiklik yapılıp yapılmadığını anlayabilirsiniz.
IsEditing ile ilgili bir bilgi bulamadım.Nedir nasıl kullanılır yardımcı olursanız sevinirim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
arkadaşların dediği gibi boolean bir değişken tanımlayacaksınız.
formun onshow unda editlara değerlerini atadıktan sonra bu değişkeni false edeceksiniz.
edit,combo vs değiştiği zaman bu değişkeni set edeceksiniz
form kapanırken değişkeni kontrol edeceksiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

VT programcılığına kapılmışız, kusura bakmayın :roll:

Aslangeri hocam'ın dediğine ek olarak:
Edit ComboBox vb nesnelerin OnChange'ini kullanabilirsiniz.
cappy2005
Üye
Mesajlar: 35
Kayıt: 30 Kas 2005 02:42

Mesaj gönderen cappy2005 »

aslangeri yazdı:s.a.
arkadaşların dediği gibi boolean bir değişken tanımlayacaksınız.
formun onshow unda editlara değerlerini atadıktan sonra bu değişkeni false edeceksiniz.
edit,combo vs değiştiği zaman bu değişkeni set edeceksiniz
form kapanırken değişkeni kontrol edeceksiniz.
kolay gelsin.
Evet yazdığınızı anladım bir boolean değişken ile tüm formu kontrol etmek gayet mantıklı ve güzel bir çözüm bencede ama benim takıldığım nokta biraz daha farklı, yani o boolean değişkenin (Bundan sonra bu boolean değişken yerine DegistiMi kelimesi kullanılacaktır) degerini set etmek için benim anladığım kadarı ile formun değişiklikten önceki hali bir yerde saklanmalı yani editlerin içi boşmu dolumu doluysa kaç karekter var vs, sonra çıkış esnasında bu içerikle o anki içerik karşılaştırılıp DegistiMi değişkenine ilgili deger atanmalı.

Bu noktada benimde sorum başlıyor aslında bunun için form üzerinde bulunan tüm denetimlerin önceki ve sonraki durumunu bilmek durumundayız aksi takdirde DegistiMi değişkenine hangi kritere göre değer atamamız gerektiği sorusunun cevabını veremeyiz.Benim sormak istediğimde aslında şudur; tüm bu nesnelerdeki değişikliği anlamak için öncesi ve sonrasındaki değerleri karşılatırmak yerine daha kısa kestirme bir yol veya Delphide bir metod varmıdır? Söylediklerinizi yanlış anlamış olabilirim kusura bakmayın lütfen....
ulu coder yazdı: VT programcılığına kapılmışız, kusura bakmayın Rolling Eyes
Aksine böyle bir cevap yazarak olaya başka bir açıdan bakmamı sağladınız saolun.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

formun onshowunda yada showdan önce editlerin içeriğine zaten değer atıyorsunuz. edit ve combolara değerlerini attıktan sonra değişkeni false yapacaksın.

@ulucoder in dediği gibi edit ve comboların onchange olayında değişkeni set edeceksin.

kaydet veya vazgeç e tıklandığı zamanda değişkenin durumuna göre kullanıcıyı uyaracaksın.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

Dediğimiz gibi nesnelerin OnChange olayını vardır. İçeriği değiştirğinde bu olay tetiklenir. Edit nesnelerinden birinin OnChange olayına

Kod: Tümünü seç

DegistiMi:=true;
yazmanız yeterli. Diğer tüm edit nesnelerininde OnChange olayında da ilk editin onchange olayını seçin.
diğer tür nesneleriniz içinde yanısı yapın. Zira farklı türdeki nesnleri bir birlerinin olaylarını çağıramıyor.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Anladığım kadarıyla normal DB componentleri kullanmıyorsun. Bu gibi durumlarda en kestirmeden formun onclosequery eventine şuna benzer bir kod yazarak işini halledebilirsin:

Kod: Tümünü seç

procedure TAnaForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  I: Integer;
begin
  CanClose := TRUE;
  for I := 0 to ControlCount - 1 do
  begin
    if Controls[I] is TMemo then
      if TMemo(Controls[I]).Lines.Count > 0 then CanClose := FALSE;
    if Controls[I] is TEdit then
      if TEdit(Controls[I]).Text <> '' then CanClose := FALSE;
    if not CanClose then Break;
  end;
  if not CanClose then CanClose := MessageDlg('Girdiğiniz bilgiler var. Kapatmak istediğinize emin misiniz?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;
İyi çalışmalar.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Anladığım kadarıyla form ilk açıldığında edit'in içinde 'delphi' yazıyorsa, sonra kullanıcı bunu 'del' olarak değiştirdikten sonra tekrar 'delphi' yaptığında değişklik olmamış gibi davransın istiyorsunuz. Bunun için eski değerleri kaydedip, sonra kontrol etmek haricinde bir yöntem olacağını sanmıyorum. Ama 'delphi' -> 'del' -> 'delphi' şeklindeki bir değişim, 'değişiklik oldu' şeklinde algılanması sorun olmayacaksa, herhangi bir bileşenin OnChange'ine DegistiMi := True yazıp, diğerlerinde OnChange oluşturmayıp, bu OnChange'i seçerek (Events'da OnChange'e çift tıkladığınızda oluşturur, seçmek için tek tıklayın ve ComboBox'dan seçin) amacınıza ulaşabilirsiniz.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

bu da degisik bir cozum yolu olabilir...

http://delphi.zaxaz.com/2006/10/04/19/1 ... ozetliyor/
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

mkysoft yazdı:Dediğimiz gibi nesnelerin OnChange olayını vardır. İçeriği değiştirğinde bu olay tetiklenir. Edit nesnelerinden birinin OnChange olayına

Kod: Tümünü seç

DegistiMi:=true;
yazmanız yeterli. Diğer tüm edit nesnelerininde OnChange olayında da ilk editin onchange olayını seçin.
diğer tür nesneleriniz içinde yanısı yapın. Zira farklı türdeki nesnleri bir birlerinin olaylarını çağıramıyor.
Bencede en pratik yöntem bu, bende böyle yapıyorum. Öncesinden küçük bir araştırma yapayım dedim, ama vakit kaybetmemek için "en kestime yol en iyi bilinen yol" mantığıyla @mkysoft arkadaşımız gibi yaptım. Burada şuna dikkat emtek lazım, EVENT procedurleri aynı olanları gruplayarak onların onchange yada onclick gibi bölümlerine değişiklik oldu gibilerinden bir işlem yapmanız gerekmektedir.

Bunun dışında, @sadettinpolat arkadaşaımızın verdiği linkteki gibi birşeyde söz konu olabilir.

Ama sanki bu işi Windows mesajıyla halledebilirmişiz gibi geliyor. İlk araştırmam bu yöndeydi. Zaten EVENT tetiklemesi bu yönde oluyor. Bakmak lazım.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

OnChange olayı her değişiklikte tetikleniyor. Peki tekrar aynı değere döndüğünde ne olacak? Yine değişti diye değerlendireceksiniz.

Benim teklif ettiğim yöntemi bir function'a çevirip basit bir şekilde başlangıçtaki tüm nesnelerin değerini global bir değişkene aralarına TAB karakteri koyarak atayın. Form kapanırken de aynı şekilde formdaki son şekli elde edip global değişkenle aralarında fark olup olmadığını kontrol edebilirsiniz. Sabit formlarda (yani runtime edit, memo vs. nesne create edilmeyen formlarda) sıfır hata ile çalışır.

İyi çalışmalar.
Cevapla