Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Устранение ошибки 'Access Violation' при присвоении значения опубликованному свойству в Delphi 2009"

Delphi , Базы данных , Модуль данных

Устранение ошибки 'Access Violation' при присвоении значения опубликованному свойству в Delphi 2009

При работе с Delphi 2009 вы столкнулись с ошибкой 'Access Violation' при попытке присвоить значение опубликованному свойству компонента на Datenodule. В данной статье мы рассмотрим причину этой ошибки и способы ее устранения.

Описание проблемы В вашем приложении на Delphi 2009 есть Datenodule, на котором расположен кастомный компонент 'Globals'. Вы пытаетесь изменить опубликованное свойство (строковый тип) компонента 'Globals' на другой форме:

dm.Globals.qhProject := _ProjectName.Text; // всегда вызывает ошибку 'Access Violation'

Контрол _ProjectName является потомком TLabeledEdit. Ошибка 'Access Violation' возникает, только если в поле есть какой-либо текст. Если присвоить значение свойству вручную, ошибка не происходит:

dm.Globals.qhProject := 'some text'; // работает

Определение свойства qhProject выглядит следующим образом:

FqhProject: string;
property qhProject: string read FqhProject write FqhProject;

Вы не можете понять, почему возникает ошибка 'Access Violation', и перемещали порядок автоматического создания форм и Datenodule, но ошибка все равно появлялась.

Обновление Вы используете TFormContainer из Billenium Effects для переключения между формами в приложении. Обе формы, участвующие в проблеме, находятся в контейнере форм. На форме TdlgSummary есть процедура SyncVars:

procedure TdlgSummary.SyncVars;
begin
    dm.Globals.qhProject := _ProjectName.Text;
end;

На форме TdlgFinalize вызывается эта процедура:

dlgSummary.SyncVars;

Если вызывать SyncVars внутри TdlgSummary, все работает нормально. Если вызывать ее из TdlgFinalize, возникает ошибка 'Access Violation'. Кажется, что проблема кроется именно в этом, но вы не можете понять, что именно идет не так. Даже если переключиться на TdlgFinalize, TdlgSummary не уничтожается, так как к ней можно вернуться. Есть ли идеи, как решить эту проблему?

Альтернативный ответ Возможно, контрол _ProjectName является nil. Попробуйте поставить точку останова на этой строке и просмотрите _ProjectName, чтобы проверить, дает ли он действительную ссылку или нет.

Подтвержденный ответ Оказалось, что проблема связана с TFormContainer. Компонент создавал форму, но не присваивал ее глобальной переменной. Добавление dlgSummary := Self; в обработчик события OnCreate формы TdlgSummary решило проблему.

Вывод При работе с компонентами на Datenodule важно правильно обращаться к ним и учитывать особенности их создания и уничтожения. В данном случае проблема была связана с TFormContainer и неправильным присвоением созданной формы глобальной переменной. Устранение этой проблемы помогло избежать ошибки 'Access Violation' при присвоении значения опубликованному свойству компонента на Datenodule.

Создано по материалам из источника по ссылке.

Контекст: Устранение ошибки 'Access Violation' при присвоении значения опубликованному свойству в Delphi 2009 на Datenodule.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Модуль данных ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:27:10/0.0038971900939941/0