2011-01-20 4 views
1

Я использую поле blob в kbmMemTable, чтобы сохранить пользовательский компонент, который я разработал от TComponent, и я использую методы потока для чтения и записи для TReader для чтения и записи компонента в blob поле. Данные в kbmMemTable в конечном итоге хранятся внутри файла структурированного хранилища, созданного GpStructuredStorage.Проблема с потоками Delphi

Это работает безупречно, пока я не переместил свой компонент (вместе с kbmMemtable) в новое приложение и попытался прочитать новое приложение в поле blob. Сначала я получал ошибку именования компонентов (имя компонента уже существует), но позже я начал получать нарушение доступа, когда TReader пытается прочитать свойство TPersistent моего компонента.

Насколько я знаю, я ничего не касаемо, как я retrive данные kbmMemTable из файла gpStructuredStorage и, как я прочитал компонент обратно из области больших двоичных объектов с помощью TReader изменить. Я не внес никаких изменений в компонент и, похоже, у меня нет проблем с другими компонентами, которые я храню в других полях blob в одной таблице (по крайней мере, я не получаю никаких ошибок при их чтении назад).

Я удивлен тем, что может быть проблемой. Любая помощь/предложение были бы весьма признательны. Я использую Delphi 2007.

+0

Как насчет форматирования вашего вопроса, чтобы он не являлся стеной текста? Я не склонен пытаться прочитать его в этой форме. –

+0

попытайтесь воспроизвести свою проблему в обоих приложениях, написав свой TPersistent в .dfm-файле, а затем прочитав этот .dfm-файл. Затем уменьшите свою проблему до простейшего TPersistent, который будет воспроизводиться. Затем повторите запрос с образцом кода. –

ответ

0

Это всего лишь предположение, но похоже, что определение класса компонента в новом приложении не соответствует определению компонента, который вы передаете.

1

Еще одна догадка. Название вашего компонента связано с другим/другим. Чтобы решить эту проблему, всегда сделать свой аппарат (ы) после того, как другие жажды те партии: пример:

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

и убедитесь, чтобы зарегистрировать свой компонент

initialization 
    RegisterClasses([TYourComponentClass]); 

finalization 
    UnRegisterClasses([TYourComponentClass]); 

Гук удачи

+0

Спасибо за помощь. Я регистрирую свой компонент в разделе инициализации модуля, где объявлен мой компонент, хотя я не отменяю регистрацию класса. Я также проверю порядок заказа. – golfur

0

я, наконец, понял из-за чего возникла проблема потоковой передачи - хотя я не уверен, почему так, возможно, кто-то может пролить свет на эту проблему. Я решил проверить, могут ли проблемы возникнуть некоторые из новых сторонних компонентов, которые я использовал, и вот, когда я отключил компонент скиннинга (который будет улучшен в моем новом приложении!), Все работало как это должно быть. Отключив, я имею в виду, что я не удалял его из программы, я просто сделал это так, чтобы сжатые скины больше не использовались для рисования окон и элементов управления.

Смежные вопросы