2010-01-18 1 views
1

В моем приложении есть эти компоненты данных связана следующим образом:Какое событие увольняется до изменения текущей записи в ADOQuery и как НЕ менять текущую запись?

DBGrid > (DataSource > ADOQuery > ADOConnection) 
DBNavigator > (DataSource > ADOQuery > ADOConnection) 

Всякий раз, когда пользователь выберет другую строку из DBGrid или использует DBNavigator, текущие изменения записи в ADOQuery в. Хорошо, но когда пользователь вносит некоторые изменения в текущую запись, а затем переходя от нее, сделанные изменения теряются.

Я хотел бы отобразить диалоговое окно подтверждения, в котором пользователю необходимо будет подтвердить переход от текущей записи в случае внесения каких-либо изменений. И, когда пользователь нажимает «Нет», я хотел бы, чтобы приложение НЕ меняло текущую запись.

Где я должен вставлять код? Какое событие оно увольняется, прежде чем пользователь перейдет от текущей записи и как остановить действие?

if anythingChanged then 
    if messageDlg(...)=mrNo then 
    ADOQuery.dontChangeCurrentRecord; 

ответ

4

Положить условное прерывание на «BeforeScroll»;

procedure TForm1.ADOQuery1BeforeScroll(DataSet: TDataSet); 
begin 
    if TAdoQuery(DataSet).Modified then //if anythingChanged then 
    Abort; 
end; 
+0

WOO-HOO! В течение 33 минут я ждал этого ответа, мне удалось выяснить, что это событие BeforeScroll, с которым мне нужно возиться, но я не знал об тёмном молчании: - $ THANKS A LOT! –

+0

Обратите внимание, что BeforeScroll не охватывает все ситуации (например, кто-то закрывает набор данных или просто обновляет набор данных). Однажды я написал TRecordArrivedNotifier (на основе TDataLinkReflector), который запускает событие, когда вы приходите на новую запись. Вы можете использовать это как базу для запуска «Прервать». См. Мой разговор «Умный код с базами данных и контрольными данными» здесь: http://wiert.wordpress.com/conferences-seminars-and-other-public-appearances/ –

1

Странно. Какую сетку вы используете, которая автоматически не вызывает сообщение в этой ситуации?

Если вы хотите сделать что-то вроде этого, возможно, лучшее место для размещения обработчика событий, если сетка не обеспечивает удобное для него событие, находится в событии BeforeScroll набора данных. Чтобы изменения не были применены, вы можете позвонить Abort.

+0

Изменения не производятся в сетке. сетка доступна только для чтения, но остальная часть экрана обновляется на основе выбранной в данный момент записи. Сейчас моя проблема решена, благодаря Sertac Akyuz. Ваше решение практически идентично. Спасибо вам тоже. –

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

  • Нет связанных вопросов^_^