Delphi Tcxgrid Hücre
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 4
- Kayıt: 28 Ara 2017 10:32
Delphi Tcxgrid Hücre
Tcxgrid colum hücrelere girilenlere göre diğer columm hücrelerde hesaplamalar yapmak istiyorum hangi eventta yapabilirim bu konuda yardımcı olabilir misiniz ilginiz için şimdiden teşekürler iyi çalışmalar
Re: Delphi Tcxgrid Hücre
Bunu işlemi Cxgrid / Tableview events sekmesinde Datacontroller içindeki OndataChange ile yapabilirsiniz.
Örnek aşağıda
view içinde herhangi bir alan değişirse bu olay tetikleniyor
procedure Tkapifrm.siparisuretim_viewDataControllerDataChanged(Sender: TObject);
begin
try
siparisuretim_view.DataController.OnDataChanged := nil;
try
siparisuretim_view.Controller.FocusedRecord.Values[6] := // tutar alanı
StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[3])) * // adet alanı
StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[5])); // birim fiyat alanı
except
try
siparisuretim_view.Controller.FocusedRecord.Values[6] := '';
except
end;
end;
finally
siparisuretim_view.DataController.OnDataChanged := siparisuretim_viewDataControllerDataChanged;
end;
maliyet_hesapla;
end;
Örnek aşağıda
view içinde herhangi bir alan değişirse bu olay tetikleniyor
procedure Tkapifrm.siparisuretim_viewDataControllerDataChanged(Sender: TObject);
begin
try
siparisuretim_view.DataController.OnDataChanged := nil;
try
siparisuretim_view.Controller.FocusedRecord.Values[6] := // tutar alanı
StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[3])) * // adet alanı
StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[5])); // birim fiyat alanı
except
try
siparisuretim_view.Controller.FocusedRecord.Values[6] := '';
except
end;
end;
finally
siparisuretim_view.DataController.OnDataChanged := siparisuretim_viewDataControllerDataChanged;
end;
maliyet_hesapla;
end;
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
-
- Üye
- Mesajlar: 4
- Kayıt: 28 Ara 2017 10:32
Re: Delphi Tcxgrid Hücre
Cevabınız için teşekürler kendi koduma göre uyarladım yalnız veritabanına değişen sütün kayıt olmuyor birde read of hatası veriyor tcxgrid bulunduğu form açıldığında yardımcı olabilir misiniz
cxGrid1DBTableView1.DataController.OnDataChanged := nil;
try
cxGrid1DBTableView1.Controller.FocusedRecord.Values[14] := // tutar alanı
StrToFloat(VarToStr(cxGrid1DBTableView1.Controller.FocusedRecord.Values[11])) * // adet alanı
StrToFloat(VarToStr(cxGrid1DBTableView1.Controller.FocusedRecord.Values[12])); // birim fiyat alanı
except
try
cxGrid1DBTableView1.Controller.FocusedRecord.Values[14] := '';
except
end;
end;
finally
cxGrid1DBTableView1.DataController.OnDataChanged := cxGrid1DBTableView1DataControllerDataChanged;
end;
cxGrid1DBTableView1.DataController.OnDataChanged := nil;
try
cxGrid1DBTableView1.Controller.FocusedRecord.Values[14] := // tutar alanı
StrToFloat(VarToStr(cxGrid1DBTableView1.Controller.FocusedRecord.Values[11])) * // adet alanı
StrToFloat(VarToStr(cxGrid1DBTableView1.Controller.FocusedRecord.Values[12])); // birim fiyat alanı
except
try
cxGrid1DBTableView1.Controller.FocusedRecord.Values[14] := '';
except
end;
end;
finally
cxGrid1DBTableView1.DataController.OnDataChanged := cxGrid1DBTableView1DataControllerDataChanged;
end;
- Dosya ekleri
-
- 14526.PNG (3.85 KiB) 1702 kere görüntülendi
Re: Delphi Tcxgrid Hücre
Merhaba,
TcxGrid kullanımı diğer TDBGrid bileşenlerinden farklıdır. Güvenli kullanım yollarından bir tanesi de aşağıdaki gibi değil
kolonların kendi isimleri ile olmalıdır. Bu isimler çoğu zaman çalışma zamanında tanımlanmış ve form içinde kullanılabilir durumdadır.
Kolon isimlerini kullanmanın bir diğer avatajı da StrToFloat(), VarToStr() dönüşümlerini yapmaya gerek kalmadan direk ilgili veri türü ile çalışabilmenize yardımcı olmasıdır.
OnDataChanged() olayı içinde iken olayın bağlantısını kopararak çalışmak doğru bir yöntem değildir
Bunun yerine Form içinde tanımlanacak bir değişken ile bağlantıyı koparmadan çok daha sağlıklı kod yazmak mümkündür
Bütün önerileri bir yerde topladığımız zaman aşağıdaki gibi bir kod yazmak mümkündür.
Eğer Enter tuşuna basmadan sürekli değişiklik yapılabilecek şekilde olmasını ister iseniz aşağıdaki parametre değişikliğini de yapmalısınız
Çalışan örnek uygulamayı ekte bulabilirsiniz. C ve D sütunlarında yapılan değişiklikler E sütununda gösterilecektir.
TcxGrid kullanımı diğer TDBGrid bileşenlerinden farklıdır. Güvenli kullanım yollarından bir tanesi de aşağıdaki gibi değil
Kod: Tümünü seç
cxGrid1DBTableView1.Controller.FocusedRecord.Values[14]
Kod: Tümünü seç
cxGrid1DBTableView1RecId: TcxGridDBColumn;
cxGrid1DBTableView1a: TcxGridDBColumn;
cxGrid1DBTableView1b: TcxGridDBColumn;
cxGrid1DBTableView1c: TcxGridDBColumn;
cxGrid1DBTableView1d: TcxGridDBColumn;
cxGrid1DBTableView1e: TcxGridDBColumn;
OnDataChanged() olayı içinde iken olayın bağlantısını kopararak çalışmak doğru bir yöntem değildir
Kod: Tümünü seç
cxGrid1DBTableView1.DataController.OnDataChanged := nil;
Kod: Tümünü seç
...
private
{ Private declarations }
UpdatingData: Boolean;
...
procedure TForm1.cxGrid1DBTableView1DataControllerDataChanged(Sender: TObject);
begin
if UpdatingData then Exit();
...
Kod: Tümünü seç
procedure TForm1.FormCreate(Sender: TObject);
begin
// OnDataChanged() olayı içinde iken tekrar tekrar çalışmaması için kullanılan değişken
UpdatingData := False;
// Bir sonraki hücreye geçildiği zaman veya Enter tuşuna basılıp veri girişi onaylandığı zaman OnDataChanged() olayı tetiklenmesi için
// Normal koşullarda satır değiştiği zaman tetiklenir
cxGrid1DBTableView1.DataController.Options := cxGrid1DBTableView1.DataController.Options + [dcoImmediatePost];
end;
procedure TForm1.cxGrid1DBTableView1DataControllerDataChanged(Sender: TObject);
begin
if UpdatingData then Exit();
UpdatingData := True;
try
// cxGrid bazı işlemleri hafızada yapar. OnDataChanged() olayı
// DataSet dsBrowse (gezinme) modunda iken tetiklenir.
if cxGrid1DBTableView1.DataController.DataSource.State = dsBrowse then
begin
// Değişiklik moduna geçip ilgili veriyi TDataSet üzerinde güncelleyebiliriz.
// Böylece TcxGrid bu güncellemeyi otomatik olarak ekranda gösterecektir
cxGrid1DBTableView1.DataController.DataSource.DataSet.Edit();
cxGrid1DBTableView1e.DataBinding.Field.AsInteger := cxGrid1DBTableView1c.DataBinding.Field.AsInteger + cxGrid1DBTableView1d.DataBinding.Field.AsInteger;
cxGrid1DBTableView1.DataController.DataSource.DataSet.Post();
end;
finally
UpdatingData := False;
end;
end;
Kod: Tümünü seç
// Sürekli veri giriş modunda ve ok tuşları ile hücreler arası gezinebilmek için
cxGrid1DBTableView1.OptionsBehavior.AlwaysShowEditor := True;
- Dosya ekleri
-
- cxgrid_veri guncelleme.7z
- (6.11 KiB) 92 kere indirildi
-
- Üye
- Mesajlar: 4
- Kayıt: 28 Ara 2017 10:32
Re: Delphi Tcxgrid Hücre
Merhaba ilginiz ve cevabınız için teşekürler, verdiğiniz bilgilerle toplama,çarpma ve çıkarma işlemleri yapabiliyorum bölme işlemi yaperken hata alıyorum , floating invalid vb. gibi bu konuda yardımcı olabilir misiniz yapmak istediğim işlem aşağıdaki gibidir
cxGrid1DBTableView1MevcutYeniMaliyetFarki.DataBinding.Field.AsInteger := cxGrid1DBTableView1YeniMaliyet.DataBinding.Field.AsInteger / cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsInteger;
cxGrid1DBTableView1MevcutYeniMaliyetFarki.DataBinding.Field.AsInteger := cxGrid1DBTableView1YeniMaliyet.DataBinding.Field.AsInteger / cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsInteger;
Re: Delphi Tcxgrid Hücre
Merhaba,
Bölme işlemi yapıyorsunuz ve AsInteger demişsiniz. Sorun buradan kaynaklanıyor. Eğer sizi tam sayı kısmı ilgilendiriyor ise div kullanabilirsiniz.
Yada aşağıdaki şekilde kullanabilirsiniz.
Bölme işlemi yapıyorsunuz ve AsInteger demişsiniz. Sorun buradan kaynaklanıyor. Eğer sizi tam sayı kısmı ilgilendiriyor ise div kullanabilirsiniz.
Yada aşağıdaki şekilde kullanabilirsiniz.
Kod: Tümünü seç
cxGrid1DBTableView1MevcutYeniMaliyetFarki.DataBinding.Field.AsString :=FloatToStr(cxGrid1DBTableView1YeniMaliyet.DataBinding.Field.AsInteger / cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsInteger);
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
-
- Üye
- Mesajlar: 4
- Kayıt: 28 Ara 2017 10:32
Re: Delphi Tcxgrid Hücre
Merhaba,
Dediğiniz şekilde yaptım fakat floating point division by zero hatası alıyorum veritabnındaki veri türleri float div kullandığımdada veri türü hataları alıyorum nasıl çözebilirim bu sorunu
Dediğiniz şekilde yaptım fakat floating point division by zero hatası alıyorum veritabnındaki veri türleri float div kullandığımdada veri türü hataları alıyorum nasıl çözebilirim bu sorunu
Re: Delphi Tcxgrid Hücre
Merhaba,
öncelikle bölme işleminin sonucundadaki veriyi ele alın ve diğer Float alanlardaki veriler ile karşılaştırın. İhtiyacınız tip dönüşümü.
Gerekli tip dönüşümünü sağladıktan sonra diğer Float değerlerde olduğu gibi kayıt yapabilirsiniz.
öncelikle bölme işleminin sonucundadaki veriyi ele alın ve diğer Float alanlardaki veriler ile karşılaştırın. İhtiyacınız tip dönüşümü.
Gerekli tip dönüşümünü sağladıktan sonra diğer Float değerlerde olduğu gibi kayıt yapabilirsiniz.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Re: Delphi Tcxgrid Hücre
"Floating point division by zero" anlamı sıfıra bölme hatasıdır. Yani sizin bölen rakamınız sıfır. Diğer bir deyişleOzan Yıldız yazdı: ↑29 Ara 2017 12:04 Merhaba,
Dediğiniz şekilde yaptım fakat floating point division by zero hatası alıyorum veritabnındaki veri türleri float div kullandığımdada veri türü hataları alıyorum nasıl çözebilirim bu sorunu
Kod: Tümünü seç
cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsInteger
Bunun dışında eğer ondalıklı sayılar ile çalışmanız gerekiyor ise AsInteger değil AsFloat şeklinde değerleri kullanmalı ve atamalısınız. Tabii ilgili database tablo kolonunun integer değil double veya decimal gibi ondalık rakam saklayabilen bir veri türünde olması gerekiyor.
İlgili kodunuzu tablo alanlarının ondalık değerleri deseklediğini düşünerek aşağıdaki şekilde yazmanız mümkün
Kod: Tümünü seç
if cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsFloat <> 0 then
begin
cxGrid1DBTableView1MevcutYeniMaliyetFarki.DataBinding.Field.AsFloat := cxGrid1DBTableView1YeniMaliyet.DataBinding.Field.AsFloat / cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsFloat;
end;
Re: Delphi Tcxgrid Hücre
Bir kez daha söyleme gereği duyuyorum. CLASS mantığını öğrenin, hangi class ın ne iş yaptığını bilmezseniz, hiç bir şey yapamazsınız.
TDastaset üzerinden yapın neden cxgrid de takla attırıp duruyorsunuz? ".FieldByName('').As....." hatta tasarıma göre calculated field eklenip oncalc ta hesaplama yaptırtabilirsin, bir sürü koda gerek kalmaz. anahtar kelime "ertank" yazmış "immideatepost" o mesajında yeterli bilgi var.
Kod yazmaya uğraşmayın, kodun nasıl çalıştıüını öğrenin. DİL bilbek budur.
Soru dahi sorun. "column" başka bir şey "hücre" başka bir şey. yapılmak istenen hesaplama??? Ne hesaplaması? Database var mı? Yok mu? Neden cxgrid? Yüzme bilmiyorsanız, okyanusa gemiden atlamayın.Tcxgrid colum hücrelere girilenlere göre diğer columm hücrelerde hesaplamalar yapmak istiyorum
TDastaset üzerinden yapın neden cxgrid de takla attırıp duruyorsunuz? ".FieldByName('').As....." hatta tasarıma göre calculated field eklenip oncalc ta hesaplama yaptırtabilirsin, bir sürü koda gerek kalmaz. anahtar kelime "ertank" yazmış "immideatepost" o mesajında yeterli bilgi var.
Kod yazmaya uğraşmayın, kodun nasıl çalıştıüını öğrenin. DİL bilbek budur.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!