Class Delphi:在另一个模块中调用的TADOQuery字段突然具有默认值

Class Delphi:在另一个模块中调用的TADOQuery字段突然具有默认值,class,delphi,tadoquery,Class,Delphi,Tadoquery,我在一个应用程序中有两个数据模块:TPAymentDataModule和TJobEditDataModule。在一个数据模块中,我必须从另一个模块调用某个TADOQuery,以更新数据库: (这段代码位于TPaymentDataModule中): OrderEditQuery的Order\u status\u id字段有一个OnValidate事件处理程序: (这段代码位于另一个模块中:TJobEditDataModule): 所有字段似乎都正常工作,但当点击OnValidate处理程序时,所有

我在一个应用程序中有两个数据模块:TPAymentDataModule和TJobEditDataModule。在一个数据模块中,我必须从另一个模块调用某个
TADOQuery
,以更新数据库: (这段代码位于TPaymentDataModule中):

OrderEditQuery
Order\u status\u id
字段有一个
OnValidate
事件处理程序:

(这段代码位于另一个模块中:TJobEditDataModule):

所有字段似乎都正常工作,但当点击
OnValidate
处理程序时,所有字段突然都有默认值并导致代码失败。 我不会创建查询并将它们作为单例使用,因此我希望事件处理程序中的
Sender
应该指向查询的同一个实例,因为只有一个单例查询可用


但我对德尔福还不熟悉,所以我一直在想,这里出了什么问题

如果我没有弄错,您需要
将您的编辑发布到数据库中:

procedure TPaymentDataModule.ForceOrdersToComplete;
begin
  ..
  while not eof do
    begin
      // get all orders that refer to this payment group 
      JobEditDataModule.OrderEditQuery.Parameters.ParamValues['orderId'] :=
      PaymentGroupContentQueryorder_Id.Value;
      JobEditDataModule.OrderEditQuery.Active:=true;
      JobEditDataModule.OrderEditQuery.Edit;

      // and try to modify their status
      JobEditDataModule.OrderEditQueryorder_status_id.AsInteger := 2;

      // Commit the changes to the DB here
      JobEditDataModule.OrderEditQuery.Post;

      Next;
   end;
end;

谢谢,我忘了把这条线插进去了。但问题是,由于另一个模块中的验证失败,代码甚至没有到达它。奇怪的是,当我将
ForceOrdersToComplete
方法移动到
JobEditDataModule
中时,验证开始正常工作。似乎在数据模块之间丢失了对字段的引用?@user3243551:请在您的问题中包括所有细节,这些都很重要。不这样做将导致浪费别人的时间。试着做一个SSCCE(以这样的方式缩短代码,使其仍然显示问题,并将其放入您的问题中)
procedure TJobEditDataModule.OrderEditQueryorder_status_idValidate(Sender: TField);
begin
  if (not Self.IsNewJobStatusPermissible(OrderEditQueryorder_status_id.OldValue,
   OrderEditQueryorder_status_id.NewValue)) then
   begin
     raise Exception.CreateFmt('Cannot modify status of order %s.', [            OrderEditQueryOrder_Name.AsString ]);
     Abort;
 end;
end;
procedure TPaymentDataModule.ForceOrdersToComplete;
begin
  ..
  while not eof do
    begin
      // get all orders that refer to this payment group 
      JobEditDataModule.OrderEditQuery.Parameters.ParamValues['orderId'] :=
      PaymentGroupContentQueryorder_Id.Value;
      JobEditDataModule.OrderEditQuery.Active:=true;
      JobEditDataModule.OrderEditQuery.Edit;

      // and try to modify their status
      JobEditDataModule.OrderEditQueryorder_status_id.AsInteger := 2;

      // Commit the changes to the DB here
      JobEditDataModule.OrderEditQuery.Post;

      Next;
   end;
end;