2014-09-08 28 views
8

Mam kontrolę siatki na formularzu i kiedy zmiana rekordu bieżącego muszę załadować RTF przechowywane w DB. To działa dobrze w ogóle, ale kiedy przełączyć rekordy widzę zmiany kursora myszy do klepsydra i powrót do regularnego:Jak uniknąć kursora myszy klepsydry podczas wykonywania zapytania SQL z TFDQuery w Delphi XE5

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; 

Jeśli komentarz „SelectQuery.Open;” wtedy kursor się nie przełącza. Przypuszczam, że powinna istnieć opcja w TFDQuery (lub połączeniu), ale nie mogę znaleźć niczego. Jakaś pomoc?

AKTUALIZACJA. Jak sugeruje TLama, umieściłem WaitCursor: TFDGUIxWaitCursor w moim formularzu (jedno miejsce dla APP) i używać go w ten sposób:

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

Update2: Jeszcze dwa sposoby, aby to zrobić.

  1. Set TFDQuery.ResourceOptions.SilentMode=True (najprostszym sposobem, aby wyłączyć kursor klepsydry dla konkretnych zapytań, nazwa nieruchomość jest zły, ale według dokumentu nie blokuje żadnych dialogów, jedynie zmiany kursora).
  2. Ustaw globalną zmienną FADGUIxSilentMode=True z jednostki FireDAC.UI.Intf (nie najlepiej, ale prawdopodobnie najprostszy sposób, aby wyłączyć globalnie zmiany kursora w FireDAC).

Odpowiedz

19

ta jest pokryta this FAQ zestawie

Jak mogę wyłączyć całkowicie klepsydrę SQL?

a) Aby całkowicie wyłączyć wskaźnik oczekiwania dla aplikacji, użyj TFDGUIxWaitCursor z Provider = "Konsola". Dostawca "Console" zawiera pustą implementację kursora oczekiwania, a kursor oczekiwania nie będzie już pokazywany przez FireDAC. Jeśli kursor myszy nadal się zmienia, sprawdź, czy w aplikacji jest dołączona tylko jednostka FireDAC.ConsoleUI.Wait , a FireDAC.VCLUI.Wait i FireDAC.FMXUI.Wait nie są uwzględniane. Zauważ, że nie będziesz mógł ponownie włączyć kursora oczekiwania .

b) wyłączenie kursora oczekiwania, ale ma możliwość włączenia go później, kod użycia jak następuje:

FDWaitCursor1.ScreenCursor := gcrNone; 

lub

FDManager.ResourceOptions.SilentMode := True; 

C), aby wyłączyć Oczekuj kursora i okien dialogowych FireDAC, ale aby mieć możliwość późniejszego włączenia ich, ustaw właściwość FDManager.SilentMode na True.Spowoduje to wyłączenie wszystkich czekać kursorów i FireDAC dialogi, w tym:

  • Błąd dialogowe
  • asynchroniczny wykonanie dialogowe
  • Logowanie dialogowe
  • Script rozwijać dialog

Ustawianie ResourceOptions.SilentMode do Prawdziwego wyłącza tylko kursory .

Ponieważ chcesz wyłączyć, że kursor tylko dla tego wykonania kwerendy, należy wybrać opcję B i owinąć kod z mniej więcej tak:

var 
    OldCursor: TFDGUIxScreenCursor; 
begin 
    OldCursor := FDWaitCursor1.ScreenCursor; 
    FDWaitCursor1.ScreenCursor := gcrNone; 
    try 
    // your code goes here 
    finally 
    FDWaitCursor1.ScreenCursor := OldCursor; 
    end; 
end; 
+0

muszę wyłączyć kursor zmienia się tylko w tym konkretnym miejsce, a nie dla całej aplikacji. Twoja pierwsza sugestia użycia TFDGUIxWaitCursor działa dobrze, dziękuję! Czy możesz to określić jako rozwiązanie? –

+0

Tak, dobrze, jeszcze raz dziękuję! –

+0

Nie ma za co! Szybszy byłeś z tym samym przykładem kodu :-) – TLama