2013-03-18 3 views
0

무료로 제공되는 데이터 모듈을 사용할 수 있습니다.TJvAppDBStorage가 포함 된 데이터 모듈을 해제하면 TComponent.RemoveNotification()에서 액세스 위반이 발생합니다.

exception class : EAccessViolation 
exception message : Access violation at address 0048FC2B in module 'Instruments.exe'. Read of address 80808088. 

main thread ($1e28): 
0048fc2b Instruments.exe System.Classes TComponent.RemoveNotification 
00408a01 Instruments.exe System   57 @Halt0 
00ac86f0 Instruments.exe Instruments 82 initialization 

이 데이터 모듈은 TADOxxx 구성 요소의 무리를 포함, 플러스 두 TJvDataSource : 나는 다른 구성 요소 (심지어 Application)를 수동으로 파괴, 또는 수 있도록 노력 나를 위해 그것을 여부,이 스택 트레이스와 함께 AV를 얻을 수 하나는 TApplicationEvents이고, 하나는 TClientDataSet이고, 하나는 TJvAppDBStorage이다. 이 코드에는 ADO 연결을 여는 것, 테이블에 레코드 몇 개를 작성하는 것, 몇 가지 쿼리를 실행하는 것 등이 포함됩니다 (예외는 아닙니다). 자신의은 위에서 언급 한 것 이외의 다른 구성 요소가 아닙니다. RemoveNotificaion()에 대한이 가짜 호출은 어디에서 발생했는지에 대해 의아해합니다. 어떤 아이디어?

UPDATE

TJvAppDBStorage를 제거한 후, 나는 데이터 모듈을 파괴 할 수있다.

object AppStorage: TJvAppDBStorage 
    StorageOptions.BooleanStringTrueValues = 'TRUE, YES, Y' 
    StorageOptions.BooleanStringFalseValues = 'FALSE, NO, N' 
    DataSource = dsConfiguration 
    KeyField = 'Key' 
    SectionField = 'Section' 
    SubStorages = <> 
    ValueField = 'Value' 
    Left = 272 
    Top = 304 
end 

은 누구도 JvAppDBStorage을 사용했습니다 다음은 구성 요소의 속성인가? 이 은 보통이고 일까요?

+0

'응용 프로그램'이 더 나은 소유자라고 생각합니다. 즉, 'nil'을 계속 전달하지 말고 대신 데이터 모듈에서 'Free'를 호출하십시오. AV 디버깅에 도움이 필요하면 더 많은 정보를 제공하십시오. 정확한 오류 메시지, 발생한 위치의 코드 및 호출 스택을 제공하십시오. –

+0

@DavidHeffernan 님이 질문을 업데이트했습니다. 스택 추적에서 보여 주듯이 예외는 내 코드에서 발생하지 않습니다. –

+0

예, 예상됩니다. 데이터 모듈은 어디에서 생성합니까? .dpr 파일에서? 그렇다면'Application.Run'이 반환 된 후에 당신이'Free'를 호출 할 것을 제안합니다. 그리고 그것을 주 양식으로 소유하지 마십시오. 따라서 소유자로 'nil'을 전달하십시오. 이것이 실패하면 적어도 소멸자가 호출 될 때를 더 많이 제어 할 수 있습니다. 그리고 디버깅이 더 쉬울 것입니다. –

답변

2

나는 JvAppDBStorage에 대한 경험이 없지만 무슨 일이 일어나고 있는지 추측 할 수 있습니다.

이 구성 요소는 JvAppDBStorage 인스턴스의 DataSource 속성에 지정된대로 설정을 데이터베이스에 저장합니다. 귀하의 경우는 dsConfiguration입니다. 따라서이 모든 기능을 사용하려면 AppStorage이 설정을 읽고 쓸 때마다 dsConfiguration을 사용할 수 있어야합니다. 나는 AppStorage가 그것에 저장하려고 시도했을 때 dsConfiguration이 이미 파괴되었다고 내기 할 것입니다. AppStorage이 해제되면 문제가 발생할 것으로 예상됩니다. 따라서 문제에 대한 설명은 AppStorage 전에 dsConfiguration이 해제되었습니다.

해결책은 AppStorage이 해제 될 때 dsConfiguration이 아직 살아 있는지 확인하는 것입니다.

+0

답장을 보내 주셔서 다시 한번 감사드립니다. 난 그냥'JvAppDBStorage' 컴포넌트를 자르고 붙이면 문제는 해결되었습니다 :-) –