2011-01-20 3 views
1

kbmMemTable에서 BLOB 필드를 사용하여 개발 한 사용자 정의 구성 요소를 TComponent에서 저장하고 읽기 및 쓰기 구성 요소 스트림 메서드 TReader을 사용하여 BLOB에 구성 요소를 읽고 씁니다. 들. kbmMemTable의 데이터는 결국 GpStructuredStorage으로 생성 된 구조화 된 저장 파일에 저장됩니다.Delphi 스트리밍 문제

내 구성 요소를 (kbmMemtable과 함께) 새 응용 프로그램으로 옮기고 새 응용 프로그램에서 BLOB 필드를 읽으 려 할 때까지 완벽하게 작동했습니다. 처음에는 구성 요소 이름 지정 오류 (구성 요소 이름이 이미 있음)가 표시되었지만 나중에 TReader이 내 구성 요소의 TPersistent 속성을 읽으려고 할 때 액세스 위반이 발생하기 시작했습니다.

는 지금까지 내가 아는 한, 나는 내가 gpStructuredStorage 파일에서 kbmMemTable 데이터를 가져 오지 방법과 내가 다시 TReader를 사용하여 BLOB 필드에서 구성 요소를 읽는 방법에 관해서 아무것도 변경하지 않았다. 나는 구성 요소를 변경하지 않았으며 같은 테이블의 다른 BLOB 필드에 저장하고있는 다른 구성 요소에 문제가없는 것 같습니다 (적어도 읽을 때 오류가 발생하지는 않습니다.) 뒤로).

나는 문제가 될 수있는 곳에서 미안합니다. 어떤 도움이나 제안이라도 대단히 감사하겠습니다. 델파이 2007을 사용하고 있습니다.

+0

질문의 서식이 텍스트의 벽이 아니도록하는 방법은 어떻습니까? 나는이 형식으로 그것을 읽으려고하지 않는다. –

+0

TPersistent를 .dfm 파일에 쓰고 두 번째 .dfm 파일을 다시 읽은 다음 두 가지 응용 프로그램에서 문제를 재현 해보십시오. 그런 다음 문제를 재현 할 가장 간단한 TPersistent로 줄이십시오. 그런 다음 샘플 코드로 질문을 다시하십시오. –

답변

0

이것은 추측에 불과하지만 새로운 애플리케이션의 구성 요소 클래스 정의가 스트리밍하려는 구성 요소 정의와 일치하지 않는 것 같습니다.

1

다른 추측입니다. 구성 요소 이름이 다른/다른 것과 대조됩니다. 예 :이 문제를 해결하려면, 항상 다른 갈증 자들 한 후 단위 (들)을 만들

from: SysUtils, YourUnitClass, Classes; 
to: SysUtils, Classes, YourUnitClass; 

및 구성 요소에게 내가 마지막으로 생각

+0

도움 주셔서 감사합니다. 구성 요소가 선언 된 유닛의 초기화 섹션에 내 구성 요소를 등록합니다.하지만 클래스 등록을 취소하지는 않습니다. 단위 주문도 확인합니다. – golfur

0

initialization 
    RegisterClasses([TYourComponentClass]); 

finalization 
    UnRegisterClasses([TYourComponentClass]); 

노랭이 행운을 등록해야합니다 왜 스트리밍 문제를 일으켰는지 알 수는 없지만 누군가가이 문제에 관해 밝혀 낼 수없는 이유는 확실하지 않습니다. 문제가 내가 사용하고 있던 새 타사 구성 요소 중 일부로 인해 발생할 수 있는지 확인하기로 결정했습니다. 스키닝 구성 요소 (내 새 앱이 개선 될 예정이었습니다!)를 사용할 때 모든 것이 있어야합니다. 비활성화하면 프로그램에서 제거하지 못했음을 의미하므로 방금 압축 된 스킨이 더 이상 창과 컨트롤을 그리는 데 사용되지 않도록 만들었습니다.