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

时间:2014-09-08 12:08:13

标签: 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;

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

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

  StoredCursor := WaitCursor.ScreenCursor;
  WaitCursor.ScreenCursor := gcrNone;
  try
    // access DB with queries
  finally
    WaitCursor.ScreenCursor := StoredCursor;
  end;

更新2:还有两种方法可以做到。

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

1 个答案:

答案 0 :(得分:19)

this FAQ set:

中介绍了这一点
  

如何完全关闭SQL沙漏?

     

a)要完全禁用应用程序的等待光标,请使用   TFDGUIxWaitCursorProvider ='控制台'。 '控制台'   provider包含一个空的等待游标实现和等待   FireDAC将不再显示光标。如果鼠标光标仍然是   更改,然后检查是否只包含FireDAC.ConsoleUI.Wait单位   进入你的应用程序和FireDAC.VCLUI.Wait和FireDAC.FMXUI.Wait   不包括在内。请注意,您将无法转动   再次等待光标。

     

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

FDWaitCursor1.ScreenCursor := gcrNone;
     

FDManager.ResourceOptions.SilentMode := True;
     

c)禁用等待光标和FireDAC对话框,但要有   能够在以后再次启用它们,设置FDManager.SilentMode   属性为真实。这将禁用所有等待游标和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;