Form üzerindeki değişiklikler nasıl algılanır?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Form üzerindeki değişiklikler nasıl algılanır?
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ı?
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ı?
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 ile 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
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?
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?
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.
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
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ı.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.
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....
Aksine böyle bir cevap yazarak olaya başka bir açıdan bakmamı sağladınız saolun.ulu coder yazdı: VT programcılığına kapılmışız, kusura bakmayın Rolling Eyes
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.
@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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Dediğimiz gibi nesnelerin OnChange olayını vardır. İçeriği değiştirğinde bu olay tetiklenir. Edit nesnelerinden birinin OnChange olayına
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.
Kod: Tümünü seç
DegistiMi:=true;
diğer tür nesneleriniz içinde yanısı yapın. Zira farklı türdeki nesnleri bir birlerinin olaylarını çağıramıyor.
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:
İyi çalışmalar.
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;
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.
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
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.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ınayazmanız yeterli. Diğer tüm edit nesnelerininde OnChange olayında da ilk editin onchange olayını seçin.Kod: Tümünü seç
DegistiMi:=true;
diğer tür nesneleriniz içinde yanısı yapın. Zira farklı türdeki nesnleri bir birlerinin olaylarını çağıramıyor.
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.
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.
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.