2016-11-29 71 views
0

任何人都可以請幫我找出爲什麼ClientDataset中的計算字段不更新0.1875。實際上它不接受0.25,0.50,0.75,1.0等等。如果值爲0.26,0.51 ... 0.1876 ..等等,字段可以更新。我使用下面的代碼在Delphi XE3:德爾福ClientDataSet計算字段不更新爲具體的價值

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ClientDataSet1.Close; 
    DBEdit1.DataSource:= DataSource1; 
    DBEdit1.DataField := 'PieceRate'; 
    ClientDataSet1.Open; 
end; 

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); 
begin 
    ClientDataSet1.FieldByName('PieceRate').AsFloat :=StrToFloat(Edit1.Text); 
end; 

procedure TForm1.ClientDataSet1PieceRateGetText(Sender: TField; 
var Text: string; DisplayText: Boolean); 
begin 
    if Sender.IsNull then 
    Text:='Why it is blank?' 
    else 
    Text:= Sender.Value; 
end; 

enter image description here

enter image description here

enter image description here enter image description here

+0

你應該張貼的字段類型,什麼SQL是填滿你的數據集。 – RBA

+0

你的q需要一個MCVE。另外,爲什麼使用TDBEdit,它允許編輯一個字段值和一個計算字段? – MartynA

+0

當我按下Calc按鈕時,我只是將Edit1.text值分配給計算字段。但它不會更新0.25,0.50等的計算字段。 –

回答

3

如你沒有提供一個MCVE,我創建了自己,並且其代碼和DFM提取物 如下。它的操作應該是不言而喻的 - 它將Value計算的 字段設置爲列表框中的選定值。列表框的OnClick 處理程序調用ClientDataSet.First的要點是要導致數據集滾動,因此 將調用其OnCalcFields事件。

該項目沒有表現出你所稱的問題(儘管目前尚不清楚 究竟是什麼意思,因爲該值不被「接受」)。無論ListBox 中的哪個項目被點擊,相應的貨幣值都會顯示在DBEdit前面 的系統固有符號中,唯一的例外是0.1875 顯示爲「£0.19」,因爲默認情況下該值被四捨五入爲兩小數位。我的程序在D7和D10西雅圖運行一致,順便說一句。

所以,不管是什麼原因導致你的問題出現在你的項目中,你沒有包含在你的q中的 ,這表明沒有其他值的MCVE。

在評論你說:

當我按下按鈕,計算器,我只是分配Edit1.text值計算領域。

那麼,這不是你的Button1Click處理程序所做的,根據你q中的代碼。如果,則將值賦給計算的字段,而不是在OnCalcFields事件中,則應在檢查之前檢查數據集是否在適當的StateTDataSetState)之前。你是?

代碼:

type 
    TForm1 = class(TForm) 
    ClientDataSet1: TClientDataSet; 
    DataSource1: TDataSource; 
    DBEdit1: TDBEdit; 
    ClientDataSet1ID: TIntegerField; 
    ClientDataSet1Value: TCurrencyField; 
    ListBox1: TListBox; 
    procedure ClientDataSet1CalcFields(DataSet: TDataSet); 
    procedure FormCreate(Sender: TObject); 
    procedure ListBox1Click(Sender: TObject); 
    public 
    end; 

[...] 

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); 
begin 
    ClientDataSet1.FieldByName('Value').AsString := ListBox1.Items[ListBox1.ItemIndex]; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ListBox1.ItemIndex := 0; 
    ClientDataSet1.CreateDataSet; 
    ClientDataSet1.InsertRecord([1]); 
end; 

procedure TForm1.ListBox1Click(Sender: TObject); 
begin 
    ClientDataSet1.First; 
end; 

DFM提取

object DBEdit1: TDBEdit 
    DataField = 'Value' 
    DataSource = DataSource1 
end 
object ListBox1: TListBox 
    Items.Strings = (
    '0' 
    '0.1875' 
    '0.25' 
    '0.50' 
    '0.75' 
    '1.0') 
    OnClick = ListBox1Click 
end 
object ClientDataSet1: TClientDataSet 
    Aggregates = <> 
    Params = <> 
    OnCalcFields = ClientDataSet1CalcFields 
    object ClientDataSet1ID: TIntegerField 
    FieldName = 'ID' 
    end 
    object ClientDataSet1Value: TCurrencyField 
    FieldKind = fkCalculated 
    FieldName = 'Value' 
    Calculated = True 
    end 
end 
object DataSource1: TDataSource 
    DataSet = ClientDataSet1 
end