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