cxgrid kolonlarda hesaplama işlemi yapma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen cvheneburi »

Arkadaşlar merhaba cxgrid i veritabanına bağlamadan tablewiev alanı ile kullanıyorum sütünlar arasında matematiksel işlemler yapmak için DataController.OnDataChanged eventine aşağıdaki kodu viewtopic.php?t=12840 forumda buldum fakat read of address hatası veriyor

Kod: Tümünü seç

try
    cxGrid1TableView1.DataController.OnDataChanged := nil;
    try
      cxGrid1TableView1.Controller.FocusedRecord.Values[7] :=
      StrToFloat(VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[5])) *
      StrToFloat(VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[6]));
    except
      try
        cxGrid1TableView1.Controller.FocusedRecord.Values[7] := '';
      except
      end;
    end;
  finally
    cxGrid1TableView1.DataController.OnDataChanged := cxGrid1TableView1DataControllerDataChanged;
  end;
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen ertank »

Hangi satırda bu hatayı alıyorsun?
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen cvheneburi »

cxgrid e satır eklediğim zaman oluyor break butonuna basınca cxGrid1TableView1.Controller.FocusedRecord.Values[7] := alanı işaretli oluyor
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen ertank »

Aşağıdaki kod ile denediğinde ekrana önce değerler mi geliyor? Yoksa önce hata mesajı mı geliyor?

Kod: Tümünü seç

try
    cxGrid1TableView1.DataController.OnDataChanged := nil;
    try
      ShowMessage('değer 1:' + VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[5]));
      ShowMessage('değer 1:' + VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[6]));

      cxGrid1TableView1.Controller.FocusedRecord.Values[7] :=
      StrToFloat(VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[5])) *
      StrToFloat(VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[6]));
    except
      try
        cxGrid1TableView1.Controller.FocusedRecord.Values[7] := '';
      except
      end;
    end;
  finally
    cxGrid1TableView1.DataController.OnDataChanged := cxGrid1TableView1DataControllerDataChanged;
  end;
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen cvheneburi »

önce hata mesajı geliyor
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen ertank »

O zaman bizim ile paylaştığın kod öncesinde bir noktada hata oluşuyor.
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen cvheneburi »

bu kod ile cxgrid e satır ekliyorum

Kod: Tümünü seç

 with cxGrid1TableView1.DataController do
  begin
  RecordCount := RecordCount + 1;
  end;
fakat DataChanged eventene ilgili kodu yazdmadığım zaman hiç bir sıkıntı yok bu kod olduğu sürece form create olurken bile hata veriyor
birde bir şey dikkatimi çekti benim 9 adet sayılan alanım var cxgridde form create olurken hatayı birkez veriyor ama her satır eklediğim de 9 kez hata veriyor hataya devam et dediğimde ise çarpma işlemini yapmıyor
şöyle bir kod buldum nette fakat bu kod dbtableviewde işe yarıyor tableview olunca işlem yapmıyor kod

Kod: Tümünü seç

procedure TForm2.cxGrid1DBTableView1Column1GetDataText(
  Sender: TcxCustomGridTableItem; ARecordIndex: Integer; var AText: string);
begin
 with TcxGridDBTableView(Sender.GridView).DataController do
   AText := VarToStr(Values[ARecordIndex, cxGrid1DBTableView1A.Index] - Values[ARecordIndex, cxGrid1DBTableView1B.Index])
end;
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen cvheneburi »

formun ilk açılışında verdiği hatayı şu şekilde giderdim

Kod: Tümünü seç

if cxGrid1TableView1.DataController.RecordCount<>0 then
begin
 try
    cxGrid1TableView1.DataController.OnDataChanged := nil;
    try
      {ShowMessage('değer 1:' + VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[5]));
      ShowMessage('değer 1:' + VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[6])); }

      cxGrid1TableView1.Controller.FocusedRecord.Values[6] :=
      StrToFloat(VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[5])) *
      StrToFloat(VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[4]));
    except
      try
        cxGrid1TableView1.Controller.FocusedRecord.Values[6] := '';
      except
      end;
    end;
  finally
    cxGrid1TableView1.DataController.OnDataChanged := cxGrid1TableView1DataControllerDataChanged;
  end;
end;
daha sonra her yeni satır eklediğimde hesaplama yaptıracağım fieldlara 0 değerini aktarıyoeum

Kod: Tümünü seç

with cxGrid1TableView1.DataController do
  begin
    Values[RecordCount-1 ,0] :='0';Values[RecordCount-1 ,1] :='0';
  Values[RecordCount-1 ,2] :='0';Values[RecordCount-1 ,3] :='0';
  Values[RecordCount-1 ,4] :='0';
  Values[RecordCount-1 ,5] :='1';  Values[RecordCount-1 ,6] :='0';
  Values[RecordCount-1 ,7] :='0';  Values[RecordCount-1 ,8] :='0';
  Values[RecordCount-1,9] :='0';  Values[RecordCount-1 ,10] :='0';
  Values[RecordCount-1 ,11] :='0';  Values[RecordCount-1 ,12] :='0';
  end;
  cxGrid1TableView1.ApplyBestFit();
tek sıkıntı ilk satır oluşturuken ve son eklenen satırın güncellenmesi iptal edilirken yaşıyorum
ilk satır oluşturuken cxgrid deki alan sayısının 2 katı kadar hata veriyor satır güncellemesini iptal ederken 2 kez hata veriyor
https://yadi.sk/d/XV8BnCLJscmEW
bu linkte kodların olduğu bir exe var bakabilirseniz memnun olurum...
cvheneburi
Üye
Mesajlar: 95
Kayıt: 07 Eki 2010 03:55

Re: cxgrid kolonlarda hesaplama işlemi yapma

Mesaj gönderen cvheneburi »

sorunu çözdüm sonunda :D meğer cxGrid1TableView1.Controller.FocusedRecord.Values[6]..... kodunda ilgili kolonu okuyamıyormuş bende kodu aşağıdaki şekilde değiştirdim sorun kalmadı

Kod: Tümünü seç

var
a:integer;
begin
if cxGrid1TableView1.DataController.RecordCount<>0 then
begin
 try
    cxGrid1TableView1.DataController.OnDataChanged := nil;
    try
      {ShowMessage('değer 1:' + VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[5]));
      ShowMessage('değer 1:' + VarToStr(cxGrid1TableView1.Controller.FocusedRecord.Values[6])); }
with cxGrid1TableView1.DataController do
  begin
    a:= cxGrid1TableView1.Controller.FocusedRowIndex;
   Values[a,6]:=Values[a,5]*Values[a,4];
  end;
    except
      try
         cxGrid1TableView1.DataController.Values[a,6]:='';
      except on e:exception do
          begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
     end;
      end;
    end;
  finally
    cxGrid1TableView1.DataController.OnDataChanged := cxGrid1TableView1DataControllerDataChanged;
  end;
end;


ilgin için teşekkür ederimmmm
Cevapla