Boolean Kullanımı !!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Boolean Kullanımı !!

Mesaj gönderen ozcank »

Arkadaşlar Merhaba;
Ben Form9 üzerine 1 tane CheckBox1 yerleştirdim ve bunu Tablo ya kaydettiriyorum Tablo da True veya False olarak yazıyor form9 a girerken tabloda true ise işaretli değilse işaretsiz nasıl kontrol ettirebilirim?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Boolean Kullanımı !!

Mesaj gönderen mrmarman »

Merhaba.

- Siz Tabloda derken DBGrid'de demek istediğinizi değerlendiriyorum.

- DBGrid'in baktığı DataSource'un DataSet'i hangisi ise onun OnAfterScroll eventine söylenen kodu yazın. Yazarken de ilgili Tablo'nun boş küme ile dönüp dönmediğini mutlaka sorgulayın yoksa Exception alırsınız.

Örneğin şöyle yazın :

Kod: Tümünü seç

if Query.RecordCount > 0
  then Checkbox1.Checked := Query.FieldByName('EPARAM_1').AsBoolean
  else Checkbox1.checked := false; // işaretli kalmasın diye...
bir de ek olarak tabloyu ilk defa açtığınızda OnAfterScroll eventi tetiklenmez. Bunun için Open veya Active := True; dediğin satırın hemen altına da

Kod: Tümünü seç

Checkbox1.Checked := Query.FieldByName('EPARAM_1').AsBoolean;
şeklinde bir ekleme yaparak gelen ilk kaydın değerlendirmeye alınmasını sağlamalısınız.
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

mrmarman çok teşekkür ederim bilgileriniz için bu işlemi yaptım ama şimdi esas işlem görmesi gereken yere bir kod yazdım ama bu sefer Form9 daki CheckBox1 etkiliyor ;

Kod: Tümünü seç

procedure TForm2.FormActivate(Sender: TObject);
begin
IF FORM9.Checkbox1.Checked = Form9.EPARAMQ.FieldByName('EPARAM_1').AsBoolean Then
begin
DBEdit3.ReadOnly:=True;
end
else
begin
DBEdit3.ReadOnly:=False;
end;
end;

bunu nasıl çözebilirim?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Boolean Kullanımı !!

Mesaj gönderen mrmarman »

Merhaba...

- Zaten verdiğim şekilde bir uygulama yapmamışsınız... Önce onu belirteyim... Başlığı okuyanlar yanlış anlamasın diye bunu yazdım...

Kod: Tümünü seç

IF FORM9.Checkbox1.Checked = Form9.EPARAMQ.FieldByName('EPARAM_1').AsBoolean Then
- Burada bence bir hata var. Yazar ne demek istedi diye sorarız ya ?! :)

- Siz sorunuzda veritabanınızdaki True veya False olma durumuna göre Form9'daki checkbox Checked olsun veya olmasın diye sormuştunuz. O sorunuzla bağlantılı olarak burada çapraz bir anlam kayması görüyorum. :!:

- Verdiğiniz kodda şöyle bir cümle kuruyorum: :idea:
Eğer Form9'daki CheckBox1 ile veritabanınızdaki EPARAM_1 alanı aynı ise ( bu true=true da olabilir false=false da olabilir ) o zaman DBEdit3'e erişim YAPILAMASIN yani ReadOnly olsun... Aksi ise yani veritabanında True iken CheckBox1 false ise ya da veritabanında False iken CheckBox1 true ise o zaman DBEdit3'ün erişimi serbest bırakılsın... Demişsiniz. :!:

Bu durumda ne yapmak istediğinizi söylerseniz o mihmalde cevap verelim... :?:
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

evet aynen doğru anlaşıldı.
Ben Form9 daki checkbox1 tabloda ki EPARAM_1 e true veya false olarak yazıyorum bu durumda Form2 deki DBEdit3 alanını true veya false göre ayarlamak istiyorum
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

Form9 daki CheckBox1 İşaretliyse veri tabanına True olarak yazıyor False İse False yazıyor o değişmez yani CheckBox1 İşaretli veritabanı işaretsiz olma ihtimali yok.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Boolean Kullanımı !!

Mesaj gönderen mrmarman »

Merhaba.

- Sunduğun veri yetersiz, bu kadarlık açıklamaya cevap yazamıyorum. Yazdığın cümleyi kendin bir daha okur musun ? Soru biraz yere bassın lütfen...
@ozcank yazdı:evet aynen doğru anlaşıldı.
Ben Form9 daki checkbox1 tabloda ki EPARAM_1 e true veya false olarak yazıyorum bu durumda Form2 deki DBEdit3 alanını true veya false göre ayarlamak istiyorum
1. Form9'daki CheckBox1, hangi Query'deki EPARAM_1'den tetiklenerek kendiliğinden TRUE veya FALSE oluyor ?! Bunu bir kenara yaz...

- Detay: Sen bir (A) Query'si üzerinden kod ile CheckBox1'deki değişimi sağlıyorsan, başka formdan bu aynı (A) query'sini kullanırsan hatalı davranmış olursun. O formda da başka bir (B) Query'si kullanacaksın. Tersi durumda bilinçli bir şema oluşturup Form2'de (A) Query'sini kullandığında CheckBox'ların da dizginlerini ele alacaksın. Bu kadar basit.

2. Form2'deki DBEdit3 alanı; hangi Query'nin / hangi Tablonun /hangi Alanına Bakıyor ?! Bunu müneccim olan anlar, ben değil :lol:

- Detay: Çok zeki olabilirsin. Beyninde sorular dönüp durur ama bunu karşı tarafa aktarırken şahsım için konuşayım, zeka seviyesi düşük birisine anlatır gibi anlat.

Sorunu şu şekilde sor : Şöyle bir (A) tablom ve şöyle bir (B) tablom var. (A) Tablosundaki EPARAM_1 isimli alan boolean bir alandır. Veri girişi yaparken bu boolean alanı CheckBox1 isimli bir işaret kutusunda göstermek istiyorum. Ancak Checkbox1 FORM9 isimli bir forma aittir. Form2'de şu şu şartları oluşturduğumda Form9'daki CheckBox1 de değişiyor ve ben bunu istemiyorum. Araştırdım; şu örneğini verdiğim kod bloğunda şunu yaptığımda bu olumsuzluk karşıma çıkıyor. Bu olumsuzluğu önlemek için şöyle bir kod ile çözüm aradım ancak sonuç alamadım. Yardımınızı istiyorum.

Bak senaryo oturdu değil mi ?!

- Bu her platformda geçerlidir. Soruları yarım sormak çözümden uzaklaştırır, herkes için zaman kaybı doğurur. Bu da 1 cevap 2 cevap 3'den sonra cevap alamamak şeklinde döner.

- Şimdi sorularını yeniden değerlendirip tekrar sor.
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

mrmarman açıklaman için çok teşekkür ediyorum. Sorumu şöyle anlatayım o zaman ;
Form9 da Checkbox1 var ve true veya false olarak TBLEMANETPARAM tablosunda EPARAM_1 ' Kaydediyorum.
Form2 de ise DBEdit3 var ve bu alanı EPARAM_1 deki true veya false göre yazılabilir yada kapalı duruma getirmek istiyorum.

Kod: Tümünü seç

procedure TForm2.FormCreate(Sender: TObject);
begin
IF Form9.EPARAMQ.FieldByName('EPARAM_1').AsBoolean = True Then
begin
DBEdit3.ReadOnly:=True;
end
else
begin
DBEdit3.ReadOnly:=False;
end;
    end;

bu kod Access Violation hatası veriyor yardımcı olurmusunuz?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Boolean Kullanımı !!

Mesaj gönderen mrmarman »

Merhaba.

- Access Violation vermesinin en yaygın sebebi henüz Create edilmemiş bir bileşeni referans almak istenmesi durumudur. Hata verdiğinde hata metninin geriye kalan kısmında bu hataya sebebiyet veren çağrınızı da yazmıştır. Bunu da ihmal etmeden okuyalım.

- Kendi yorumum şöyle;

Kod: Tümünü seç

IF Form9.EPARAMQ.FieldByName('EPARAM_1').AsBoolean = True Then
demişsiniz ya, burada

1. Application FORM Create ORDER ( formların create edilme sıralamasıdır ) dikkate alındığında; FORM2 isimli form, FORM9 isimli formdan daha önce CREATE edildiğinden henüz FORM9 yokken buna erişim yapıyor olmanız.
2. FORM9 yokken FORM2'ye erişim yapılıyorsa bu durumda bu hatayı verir.
3. aksine FORM9 varsa ancak EPARAMQ henüz create edilmemişse bu hatayı verir,
4. FORM9 vardır ancak EPARAMQ aslında FORM9 üzerinde değil başka bir form veya datamodule üzerindedir.

- Hata konusunda yaygın karşılaşılan olarak bu yukarıda saydıklarımdan oyumu (1) nolu olana veriyorum. Tavsiyem herhangi Formun OnCreate eventini sadece o form içindeki dinamiklere atıfta bulunacak şekilde kullanınız. ( yani formdaki Edit'lerin boşaltılması, değerlerin varsayılan değerlere atanması vb. gibi )

- Diğer türdeki işlemlerinizde OnCreate yerine OnShow kullanmanız daha rasyonel bir kullanımdır. Çünkü formun Show / ShowModal komutu ile ekranda belirmesine kadar Application Form CREATE işlemleri bitmiş ve hazır olana kadar bu event işlemeyeceğinden sorun kalmayacaktır. (Show / ShowModal dedim ama siz kod içerisinden de bu eventi From1.FormShow( Form1 ); örneğindeki gibi bir komutla da işletebilirsiniz o başka bir konudur. ) :roll:

- Özetle bu mihmalde ilk yapacağınız iş OnCreate eventinden OnShow eventine kodunuzu taşıyın.
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

Mrmarman çok teşekkür ederim ilgi ve alakana. Kodu OnShow a taşıdım ama FORM9 daki CheckBox1 True yapıyor kodu başka türlü nasıl yapabilirim ?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Boolean Kullanımı !!

Mesaj gönderen mrmarman »

Yine cümlenizde noktalama kullanmadığınızdan anlam kaybolmuş... :lol:
@ozcank yazdı:Kodu OnShow a taşıdım ama FORM9 daki CheckBox1 True yapıyor kodu başka türlü nasıl yapabilirim ?
derken ?!

- En son OnCreate eventindeki kodu OnShow'a taşıdığınızı belirttiniz, ancak bu taşıdığınız kod FORM9'daki CheckBox1'in True/False durumuna etki etmez ki. Eşitliğin sol tarafında CheckBox1.Checked ifadesi yer almıyor.

- Sorunu başka yerde arayın.

- Mesela ne yapınca CheckBox1 True veya False oluyor...?!
- Bunu bulmak için formlardan, Form9'daki CheckBox1'in checked durumunu kod içerisinden değiştiren yerleri bir listeler misiniz ? Ama! kod örnekleriyle lütfen. Çünkü şimdi şu oluyor, önce bu oluyordu gibi havada kalmasın. :idea:
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

Form9 da kaydet butonunda kullandığım kod

Kod: Tümünü seç

procedure TForm9.BitBtn1Click(Sender: TObject);
begin
EMANETPRM.Active:=True;
IF EMANETPRM.Locate('EPARAM_20',Edit1.text,[loPartialKey,loCaseInsensitive]) Then
Begin
EMANETPRM.Edit;
EMANETPRM.FieldByName('EPARAM_1').Value:=CheckBox1.Checked;
EMANETPRM.FieldByName('EPARAM_20').Value:=Edit1.Text;
ShowMessage('Kayıt Düzeltilmiştir !!!');
EmanetPrm.Post;
End
Else
Begin
EMANETPRM.Append;
EMANETPRM.FieldByName('EPARAM_1').Value:=CheckBox1.Checked;
EMANETPRM.FieldByName('EPARAM_20').Value:=Edit1.Text;
EmanetPrm.Post;
ShowMessage('Yeni Kayıt Eklenmiştir !!!');
End;
End;
ve Form9 a girerken CheckBox1 durumunu kontrol etmek için Form9 Onactivate de kullandığım kod;

Kod: Tümünü seç

procedure TForm9.FormActivate(Sender: TObject);
begin
EPARAMQ.Active:=True;
if EPARAMQ.FieldByName('EPARAM_1').AsString='True' then
begin
CheckBox1.Checked:=True;
end
else
begin
CheckBox1.Checked:=False;
end;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Boolean Kullanımı !!

Mesaj gönderen mrmarman »

CheckBox1'in OnClick olayına, veritabanında bir hareket oluşturan kod var mı peki?
Resim
Resim ....Resim
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

Hayır herhangi kod yok
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Boolean Kullanımı !!

Mesaj gönderen ozcank »

Aslında kısaca yapmak istediğim şu;
FORM9 daki CheckBox1 e işaret koyduğumda veri tabanı TBLEMANETPARAM da EPARAM_1 e True işaretsizse False yapmak sonra Form2 deki DBEdit3 alanını bu veri tabanındaki true veya false göre aktif yada okunamaz yapmak.
Cevapla