2010-10-06 22 views
0

我在Delphi 7中使用TADOQuery
在构造函数中,我调用ADOQuery.openADOQuery在构造函数后关闭

为什么ADOQuery在表单外调用另一个函数时会关闭?

constructor TClass1.Create(AOwner: TComponent; 
    MyParam: TProgramParam); 
begin 
    inherited; 
    ADOQuery.Open; 
    ADOQuery.Locate('fieldName',Param,[]); 
end; 
+1

您必须提供一些信息。就像什么时候调用什么函数一样,在什么形式之外? 'Class1'在哪里得到'ADOQuery',因为它没有创建它?等等。 – 2010-10-06 17:45:00

回答

4

我的建议寻找谁是关闭数据集:

创建用于AdoQuery的BeforeClose事件的新事件处理程序,把任何被编译并执行只是把一个断点。例如:

procedure TfrmCreDocCredito.cdsSucursalesBeforeClose(DataSet: TDataSet); 
begin 
    ShowMessage('Closing!!'); 
end; 

运行程序,执行到创建类的实例需要用户进行任何操作和断点程序停止的时候,你要检查调用堆栈的机会。它会揭示谁,如果你想一点,你会发现为什么数据集正在关闭。如果你的断点没有触发,我打赌数据集从未真正打开过。

此致敬礼。

+0

这是一个天才的想法,我抱着自问,怎么没有想到我自己:)谢谢。 – none 2010-10-07 14:11:15

0
constructor TClass1.Create(AOwner: TComponent; 
    MyParam: TProgramParam); 
begin 
    inherited; 
    ADOQuery.Open; 
    ADOQuery.Locate('fieldName',Param); 
end; 

// 

constructor TClass1.Create(AOwner: TComponent; 
    MyParam: TProgramParam); 
begin 
    inherited; 
    ADOQuery.Open; 
    ADOQuery.Locate('fieldName',Param,[]); 
end; 
+3

我在*答案*中看不到这一点。如果您试图在'Locate'中提示缺少第三个参数,请改为发布* comment *。 – kobik 2013-05-22 10:59:19