Delphi ClientDataSet计算字段未更新特定值

时间:2016-11-29 06:48:29

标签: delphi dataset delphi-xe3 calculated-field

任何人都可以帮我弄清楚为什么ClientDataset中的计算字段没有用0.1875更新。实际上它不接受0.25,0.50,0.75,1.0 ......等。如果值为0.26,0.51 ... 0.1876 ..等,则可以更新字段。我在Delphi XE3中使用以下代码:

import threading
import sys
import Queue
import string

#argumanlarin alinmasi
if len(sys.argv)!=4:
    print("Duzgun giriniz: '<filename>.py s n l'")
    sys.exit(0)
else:
    s=int(sys.argv[1])
    n=int(sys.argv[2])
    l=int(sys.argv[3])

#Global
index = 0

#kuyruk deklarasyonu
q1 = Queue.Queue(n)
q2 = Queue.Queue(2000)

lock = threading.Lock()

#Threadler
threads=[]

#dosyayi okuyarak stringe cevirme
myfile=open('metin.txt','r')
data=myfile.read()

#Thread tanimlamasi
class WorkingThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        lock.acquire()
        q2.put(self.caesar(q1.get(), s))
        lock.release()

    def caesar(self, plaintext, shift):
        alphabet = string.ascii_lowercase
        shifted_alphabet = alphabet[shift:] + alphabet[:shift]
        table = string.maketrans(alphabet, shifted_alphabet)
        return plaintext.translate(table)

for i in range(0,n):
    current_thread = WorkingThread()
    current_thread.start()
    threads.append(current_thread)

output_file=open("crypted"+ "_"+ str(s)+"_"+str(n)+"_"+str(l)+".txt", "w")

for i in range(0,len(data),l):
    while not q1.full:
        q1.put(data[index:index+l])
        index+=l
    while not q2.empty:
        output_file.write(q2.get())

for i in range(0,n):
    threads[i].join()

output_file.close()
myfile.close()

enter image description here

enter image description here

enter image description here enter image description here

1 个答案:

答案 0 :(得分:3)

由于您还没有提供MCVE,我创建了自己的,以及它的代码和DFM提取 在下面。它的操作应该是不言而喻的 - 它设置Value计算 字段到ListBox中的选定值。 ListBox的OnClick的重点 处理程序调用{​​{1}}是为了使数据集滚动等等 调用它的OnCalcFields事件。

该项目没有表现出你所声称的问题(虽然目前还不清楚是什么 完全是指不被“接受”的价值。列表框中的任何项目 单击,相应的货币值显示在前面的DBEdit中 通过系统的curency符号,唯一的小例外是0.1875 显示为“£0.19”,因为默认情况下,该值四舍五入到小数点后两位。我的课程在D7和D10西雅图,顺便说一下。

因此,无论是什么原因导致您的问题都在您的项目中,而您却没有 包含在你的q中,它显示了MCVE的价值。

在评论中你说:

  

当我按下Calc按钮时,我只是将Edit1.text值分配给计算字段。

嗯,这不是你的Button1Click处理程序所做的,根据你的q中的代码。如果您 在OnCalcFields事件之外的任何地方为计算字段分配值,那么您应该检查数据集是否在适当的ClientDataSet.FirstState)之前所以。你呢?

代码:

TDataSetState

DFM提取

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;
相关问题