在Delphi XE5中使用TFDQuery执行SQL查询时如何避免使用沙漏鼠标光标

And*_*tyn 8 delphi firedac

我在表单上有网格控件,当前记录更改时我需要加载存储在DB中的RTF.它一般工作正常,但当我切换记录时,我可以看到鼠标光标更改为沙漏并返回常规:

function TComments.GetDocument(AID: integer; ADst: TStream):Boolean;
begin
  try
    SelectQuery.Close;
    SelectQuery.Params.Clear;
    SelectQuery.SQL.Text :=
      'SELECT Dokument from Kommentarer ' +
      'WHERE ID = :ID';
    SelectQuery.ParamByName('ID').AsInteger := AID;
    SelectQuery.Open;
    Result := SelectQuery.RecordCount > 0;
    if Result then
      (SelectQuery.Fields[0] as TBLOBField).SaveToStream(ADst);
  finally
    SelectQuery.Close;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

如果我发表评论"SelectQuery.Open;" 那么光标不会切换.我想TFDQuery(或连接)应该有选项,但我找不到任何东西.有帮助吗?

UPDATE.正如TLama建议的那样,我将WaitCursor:TFDGUIxWaitCursor放在我的表单(app的一个地方)并以这种方式使用它:

  StoredCursor := WaitCursor.ScreenCursor;
  WaitCursor.ScreenCursor := gcrNone;
  try
    // access DB with queries
  finally
    WaitCursor.ScreenCursor := StoredCursor;
  end;
Run Code Online (Sandbox Code Playgroud)

更新2:还有两种方法.

  1. 设置TFDQuery.ResourceOptions.SilentMode=True(对于特定查询禁用沙漏光标的最简单方法,属性名称不好,但根据doc它不阻止任何对话框,只更改光标).
  2. FADGUIxSilentMode=True从单元FireDAC.UI.Intf 设置全局变量(不是最好的,但可能是最简单的方法来为FireDAC全局禁用游标更改).

TLa*_*ama 19

这包括在this FAQ集合中:

如何完全关闭SQL沙漏?

a)要完全禁用应用程序的等待光标,请使用 带有Provider ='Console'的TFDGUIxWaitCursor.'Console'提供程序包含一个空的等待游标实现,FireDAC将不再显示等待游标.如果鼠标光标仍在更改,请检查应用程序中是否包含FireDAC.ConsoleUI.Wait单元,并且不包括FireDAC.VCLUI.Wait和FireDAC.FMXUI.Wait.请注意,您无法再次打开等待光标.

b)要禁用等待光标,但要能够在以后再次启用它,请使用如下代码:

FDWaitCursor1.ScreenCursor := gcrNone;
Run Code Online (Sandbox Code Playgroud)

要么

FDManager.ResourceOptions.SilentMode := True;
Run Code Online (Sandbox Code Playgroud)

c)要禁用等待光标和FireDAC对话框,但要能够在以后再次启用它们,请将FDManager.SilentMode 属性设置为True.这将禁用所有等待游标和FireDAC对话框,包括:

  • 错误对话框
  • 异步执行对话框
  • 登录对话框
  • 脚本进度对话框

ResourceOptions.SilentMode设置为True仅禁用等待游标.

由于您只想为该查询执行关闭该游标,请使用选项b并使用以下内容包装您的代码:

var
  OldCursor: TFDGUIxScreenCursor;
begin
  OldCursor := FDWaitCursor1.ScreenCursor;
  FDWaitCursor1.ScreenCursor := gcrNone;
  try
    // your code goes here
  finally
    FDWaitCursor1.ScreenCursor := OldCursor;
  end;
end;
Run Code Online (Sandbox Code Playgroud)