1

我将 Delphi XE2 与 Firedac 组件一起使用。我有一个很奇怪的问题。我有自定义组件,它使用自己的 Firedac TQuery 组件来搜索一些数据。奇怪的是,打开查询后 - 它还没有激活。

qry.Open;
ShowMessage(BoolToString(qry.Active,True);
FunctionToDoAfter(SilentMode);

使用这部分代码,我在消息中有“False”。它接缝 TQuery.Open 方法运行一些线程来打开它。有人可以告诉我,在运行 FunctionToDoAfter 之前,我该如何等待打开查询?

最好的问候, 皮奥特

4

1 回答 1

2

TLama - 那是 10 分球,谢谢。几个月前我添加了 amAsync 模式,我想我当时并没有实现所有功能。

现在我在这里又读了一次帮助站点,在带有“while”循环的示例中,我的问题得到了准确的答案。

我是stackoverlflow的新手,TLama,我该如何报答你?你节省了我几个小时:)

编辑 1

按照 Frazz 的建议,我将尝试从上面链接的源页面复制一些信息。

FireDacs 有四种命令执行模式。您可以在 FDQuery1.ResourceOptions.CmdExecMode 中更改它。您还可以在 FdQuery1.ResourceOptions.CmdExecTimeout 中设置执行命令的超时时间。

CmdExecModes 是:

amBlocking -- 调用线程和 GUI 被阻塞,直到操作完成。

amNonBlocking -- 调用线程被阻塞,直到动作完成。GUI 未被阻止。

amCancelDialog -- 调用线程和 GUI 被阻塞,直到操作完成。FireDAC 显示一个对话框,允许取消操作。

amAsync -- 调用线程和 GUI 未被阻塞。被调用的方法立即返回。

您可以通过检查命令状态来等待命令正在执行:

FDQuery1.ResourceOptions.CmdExecMode := amAsync;
FDQuery1.Open;
  while FDQuery1.Command.State = csExecuting do begin
  // do something while query is executing
end;

有 6 种不同的命令状态:csInactive、csPrepared、csExecuting、csOpen、csFetching、csAborting。

于 2014-10-09T21:33:10.393 回答