2010-01-18 2 views
1

,과 같이 연결이 데이터 구성 요소가 있습니다 :ADOQuery에서 현재 레코드가 변경되기 전에 발생하는 이벤트와 현재 레코드를 변경하지 않는 방법은 무엇입니까? 내 응용 프로그램에서

사용자가 DBGrid를에서 다른 행을 선택하거나 DBNavigator의 ADOQuery의 현재 레코드 변경을 사용 할 때마다
DBGrid > (DataSource > ADOQuery > ADOConnection) 
DBNavigator > (DataSource > ADOQuery > ADOConnection) 

. 좋아,하지만 사용자가 현재 레코드를 약간 변경 한 다음 멀리 이동하면 변경 한 내용이 손실됩니다.

변경 사항이있을 경우 사용자가 현재 레코드에서 벗어나기 위해 확인 대화 상자를 표시하고 싶습니다. 그리고 사용자가 '아니오'를 클릭하면 응용 프로그램이 현재 레코드를 변경하지 않기를 바란다.

어디에서 코드를 삽입해야합니까? 사용자가 현재 레코드에서 벗어나기 전에 시작되는 이벤트는 무엇이며 계속 진행하지 못하게하는 방법은 무엇입니까?

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 이벤트에서 필자와 함께해야한다는 것을 알았지 만, 조용한 중단 트릭에 대해서는 몰랐다. - $ 많이 감사합니다! –

+0

BeforeScroll은 모든 상황 (예 : 데이터 집합을 닫거나 데이터 집합을 새로 고치는 것)을 다루지는 않습니다. 한 번 TDataLinkReflector 기반의 TRecordArrivedNotifier를 작성하여 새 레코드에 도착하면 이벤트를 발생시킵니다. 이것을 "Abort"를 발사하는 기지로 사용할 수 있습니다. 내 대화 "데이터베이스 및 데이터 인식 컨트롤이 포함 된 더 똑똑한 코드"를 참조하십시오. http://wiert.wordpress.com/conferences-seminars-and-other-public-appearances/ –

1

이상한. 이 상황에서 자동으로 Post를 호출하지 않는 어떤 종류의 그리드를 사용하고 있습니까?

이와 같은 작업을 수행하려는 경우 그리드가 편리한 이벤트를 제공하지 않는 경우 이벤트 처리기를 배치하는 데 가장 적합한 장소는 데이터 세트의 BeforeScroll 이벤트입니다. 변경 사항을 적용하지 않으려면 Abort으로 전화하십시오.

+0

변경 내용이 그리드에서 만들어지지 않았습니다. 그리드는 읽기 전용이지만 현재 선택된 레코드를 기반으로 화면의 나머지 부분이 새로 고쳐집니다. Sertac Akyuz 덕분에 문제가 해결되었습니다. 귀하의 솔루션은 실질적으로 동일합니다. 고마워. –

관련 문제