무료로 제공되는 데이터 모듈을 사용할 수 있습니다.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
을 사용했습니다 다음은 구성 요소의 속성인가? 이 은 보통이고 은일까요?
'응용 프로그램'이 더 나은 소유자라고 생각합니다. 즉, 'nil'을 계속 전달하지 말고 대신 데이터 모듈에서 'Free'를 호출하십시오. AV 디버깅에 도움이 필요하면 더 많은 정보를 제공하십시오. 정확한 오류 메시지, 발생한 위치의 코드 및 호출 스택을 제공하십시오. –
@DavidHeffernan 님이 질문을 업데이트했습니다. 스택 추적에서 보여 주듯이 예외는 내 코드에서 발생하지 않습니다. –
예, 예상됩니다. 데이터 모듈은 어디에서 생성합니까? .dpr 파일에서? 그렇다면'Application.Run'이 반환 된 후에 당신이'Free'를 호출 할 것을 제안합니다. 그리고 그것을 주 양식으로 소유하지 마십시오. 따라서 소유자로 'nil'을 전달하십시오. 이것이 실패하면 적어도 소멸자가 호출 될 때를 더 많이 제어 할 수 있습니다. 그리고 디버깅이 더 쉬울 것입니다. –