Delphi Tcxgrid Hücre

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Ozan Yıldız
Üye
Mesajlar: 4
Kayıt: 28 Ara 2017 09:32

Delphi Tcxgrid Hücre

Mesaj gönderen Ozan Yıldız » 28 Ara 2017 09:45

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

Kullanıcı avatarı
cinarbil
Üye
Mesajlar: 104
Kayıt: 18 Mar 2014 09:26

Re: Delphi Tcxgrid Hücre

Mesaj gönderen cinarbil » 28 Ara 2017 11:26

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;
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)

Ozan Yıldız
Üye
Mesajlar: 4
Kayıt: 28 Ara 2017 09:32

Re: Delphi Tcxgrid Hücre

Mesaj gönderen Ozan Yıldız » 28 Ara 2017 02:18

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;
Dosya ekleri
14526.PNG
14526.PNG (3.86 KiB) 103 kere görüntülendi

ertank
Üye
Mesajlar: 965
Kayıt: 11 Eyl 2015 11:45

Re: Delphi Tcxgrid Hücre

Mesaj gönderen ertank » 28 Ara 2017 11:48

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

Kod: Tümünü seç

cxGrid1DBTableView1.Controller.FocusedRecord.Values[14]
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.

Kod: Tümünü seç

    cxGrid1DBTableView1RecId: TcxGridDBColumn;
    cxGrid1DBTableView1a: TcxGridDBColumn;
    cxGrid1DBTableView1b: TcxGridDBColumn;
    cxGrid1DBTableView1c: TcxGridDBColumn;
    cxGrid1DBTableView1d: TcxGridDBColumn;
    cxGrid1DBTableView1e: TcxGridDBColumn;
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

Kod: Tümünü seç

cxGrid1DBTableView1.DataController.OnDataChanged := nil;
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

Kod: Tümünü seç

...
  private
    { Private declarations }
    UpdatingData: Boolean;
...

procedure TForm1.cxGrid1DBTableView1DataControllerDataChanged(Sender: TObject);
begin
  if UpdatingData then Exit();
...
Bütün önerileri bir yerde topladığımız zaman aşağıdaki gibi bir kod yazmak mümkündür.

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;
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

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;
Çalışan örnek uygulamayı ekte bulabilirsiniz. C ve D sütunlarında yapılan değişiklikler E sütununda gösterilecektir.
Dosya ekleri
cxgrid_veri guncelleme.7z
(6.13 KiB) 9 kere indirildi

Ozan Yıldız
Üye
Mesajlar: 4
Kayıt: 28 Ara 2017 09:32

Re: Delphi Tcxgrid Hücre

Mesaj gönderen Ozan Yıldız » 29 Ara 2017 09:21

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;

Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 344
Kayıt: 05 Oca 2012 12:55

Re: Delphi Tcxgrid Hücre

Mesaj gönderen xozcanx » 29 Ara 2017 10:16

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.

Kod: Tümünü seç

cxGrid1DBTableView1MevcutYeniMaliyetFarki.DataBinding.Field.AsString :=FloatToStr(cxGrid1DBTableView1YeniMaliyet.DataBinding.Field.AsInteger / cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsInteger);
Nasibinde varsa aIırsın karıncadan biIe ders. Nasibinde yoksa bütün cihan önüne seriIse sana ters.

Ozan Yıldız
Üye
Mesajlar: 4
Kayıt: 28 Ara 2017 09:32

Re: Delphi Tcxgrid Hücre

Mesaj gönderen Ozan Yıldız » 29 Ara 2017 11: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

Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 344
Kayıt: 05 Oca 2012 12:55

Re: Delphi Tcxgrid Hücre

Mesaj gönderen xozcanx » 29 Ara 2017 12:29

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.
Nasibinde varsa aIırsın karıncadan biIe ders. Nasibinde yoksa bütün cihan önüne seriIse sana ters.

ertank
Üye
Mesajlar: 965
Kayıt: 11 Eyl 2015 11:45

Re: Delphi Tcxgrid Hücre

Mesaj gönderen ertank » 29 Ara 2017 02:08

Ozan Yıldız yazdı:
29 Ara 2017 11: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
"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şle

Kod: Tümünü seç

cxGrid1DBTableView1MevcutFiyat.DataBinding.Field.AsInteger
değeri sıfır. Bu durumda böyle bir hata almanız çok normal.

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;

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2044
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Delphi Tcxgrid Hücre

Mesaj gönderen freeman35 » 30 Ara 2017 08:12

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.
Tcxgrid colum hücrelere girilenlere göre diğer columm hücrelerde hesaplamalar yapmak istiyorum
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.
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 !!!

Cevapla