2014-10-09 5 views
1

Я использую Delphi XE2 с компонентами Firedac. У меня довольно странная проблема. У меня есть пользовательский компонент, который использует собственный компонент Firedac TQuery для поиска некоторых данных. Странно то, что после открытия запроса он еще не активирован.Delphi Firedac: Подождите открытого TFDQuery

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

С этой частью кода у меня есть «False» в сообщении. Это означает, что метод TQuery.Open запускает некоторый поток, чтобы открыть его. Может кто-то мне посоветует, как я могу ждать открытия запроса, прежде чем запустить FunctionToDoAfter?

наилучшими пожеланиями, Piotr

+0

У вас есть TADGUIxWaitCursor на вашей форме, а если нет, попробуйте добавить его? – MartynA

+1

Вы изменили значение свойства ResourceOptions.CmdExecMode? (Думаю, вы только что переключились в асинхронный режим)? – TLama

+0

MartynA - У меня есть компонент WaitCursor в приложении. Не в CustomComponent, но я не пытался добавить некоторые. – Quasik

ответ

1

TLama - это было 10 точки выстрела, спасибо. Я добавил режим amAsync несколько месяцев назад, и я думаю, что я не реализовал всю функциональность.

Теперь я прочитал еще один раз help site here, и есть точный ответ на мой вопрос в примере с циклом while.

Я новичок в stackoverlflow, как я могу отплатить вам, TLama? Вы сохранили несколько часов мои :)

Edit 1

После Frazz предложение приемлемо, я постараюсь, чтобы скопировать информацию из исходной страницы, связанной выше.

FireDacs имеет четыре режима выполнения команд. Вы можете изменить его в FDQuery1.ResourceOptions.CmdExecMode. Вы также можете установить тайм-аут для выполнения команды в FdQuery1.ResourceOptions.CmdExecTimeout.

В CmdExecModes является:

amBlocking - Вызывающий поток и G блокируются до тех пор, пока действие закончено.

amNonBlocking - вызывающий поток блокируется до завершения действия. Графический интерфейс не заблокирован.

amCancelDialog - вызывающий поток и графический интерфейс блокируются до завершения действия. FireDAC показывает диалог, позволяющий отменить действие.

amAsync - вызывающий поток и графический интерфейс не блокируются. Вызываемый метод немедленно возвращается.

Вы можете подождать, пока команда выполняется, проверяя состояние команды:

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.

+0

Поскольку вы новичок в SO, я дам вам несколько советов. Как и этот ответ, вероятно, будет удален, поскольку он малопригоден для других. Пожалуйста, включите соответствующую информацию на сайт, который вы связали непосредственно в этом ответе (ссылки разрываются со временем), чтобы другие пользователи могли увидеть решение, а затем принять ответ. – Frazz

Смежные вопросы