2010-01-18 58 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事件,但我不知道無聲的中止技巧: - $謝謝! – 2010-01-18 13:13:14

+0

請注意,BeforeScroll並未涵蓋所有情況(如某人關閉數據集或僅刷新數據集)。我曾經寫過一個TRecordArrivedNotifier(基於TDataLinkReflector),當你到達一個新記錄時觸發一個事件。你可以用它作爲基礎來觸發「中止」。請參閱我的演講「智能代碼與數據庫和數據感知控件」:http://wiert.wordpress.com/conferences-seminars-and-other-public-appearances/ – 2010-01-18 16:19:42

1

奇怪。你在使用什麼樣的網格,在這種情況下不會自動調用Post?

如果你想做這樣的事情,如果網格沒有爲它提供一個方便的事件,可能是放置事件處理程序的最佳位置在數據集的BeforeScroll事件上。要保持更改不被應用,您可以撥打Abort

+0

更改不在網格中進行。該網格是隻讀的,但屏幕的其餘部分將根據當前選定的記錄進行刷新。我的問題現在已經解決了,謝謝Sertac Akyuz。您的解決方案几乎完全相同。也謝謝你。 – 2010-01-18 13:18:23