Почему мой пользовательский компонент поднимает AV в IDE?

Я пытаюсь написать простой компонент, который позволит вам встроить одну или несколько поверхностей рендеринга SDL в окно Delphi, используя API-интерфейсы SDL 1.3. Он прекрасно скомпилируется и установится, но когда я пытаюсь использовать компонент в дизайнере форм, он вызывает AV всякий раз, когда я пытаюсь получить доступ к его свойствам в инспекторе объектов, сохранить форму или удалить компонент и поместить его в form при попытке запуска выдает ошибку компоновщика: по какой-то причине он, по-видимому, не может правильно прочитать DFM.

Библиотеку DLL можно найти по адресу http://www.libsdl.org/tmp/SDL-1.3-dll.zip и исходный код моего компонента можно скачать здесь . SDL.pas — это заголовочный файл JEDI-SDL; остальное мой собственный код.

Не вижу смысла для этого поднимать АВ в конструкторе форм. Если я динамически создаю элемент управления во время выполнения, у меня нет проблем со стабильностью. Может ли кто-нибудь взглянуть на это и, возможно, предоставить некоторые отзывы, которые могли бы помочь мне прояснить это?


person Mason Wheeler    schedule 09.03.2009    source источник


Ответы (1)


Вы можете отладить это самостоятельно. Откройте проект пакета, который содержит ваш компонент. Затем перейдите в «Выполнить | Параметры» и введите саму IDE в качестве хост-приложения. Запустите IDE из среды IDE. Затем повторите свои шаги, чтобы воспроизвести AV, и IDE должна остановиться и показать вам, где что-то не работает. Отсюда вы можете использовать обычные методы отладки.

person Allen Bauer    schedule 09.03.2009
comment
ХОРОШО. Проблема исчезает, когда я удаляю свойство Flags из опубликованного раздела. IDE останавливается, когда пытается найти RTTI для базового определения Set. Я использую Delphi 2009 со всеми установленными обновлениями. Это второй случай плохого RTTI, который я обнаружил в 2009 году. Я помещу это в QC. - person Mason Wheeler; 09.03.2009
comment
Как объявляется множество? Сколько элементов в наборе? Вы можете публиковать только наборы, содержащие не более 32 элементов. - person Allen Bauer; 10.03.2009
comment
TSdlWindowFlags = набор (sdlwFullscreen, sdlwOpenGl, sdlwShown, sdlwBorderless, sdlwResizable, sdlwMinimized, sdlwMaximized, sdlwInputGrabbed, dslwInputFocus, sdlwMouseFocus, sdwlForeign, sdlw3Force32 = sdlwForce32); 12 элементов в перечислении, созданном таким образом, чтобы я мог передать его подпрограмме C, ожидающей int. - person Mason Wheeler; 10.03.2009
comment
Высокий элемент, конечно, никогда не используется. Но это не превышает предела в 32 элемента. См. qc.embarcadero.com/wc/qcmain.aspx?d=72070 для моего отчета об ошибке. - person Mason Wheeler; 10.03.2009
comment
Ах. Это несвязное перечисление. Последний элемент не является смежным. Это, вероятно, причина, поскольку RTTI не обрабатывает несмежные перечисления, а затем наборы, созданные из них. - person Allen Bauer; 10.03.2009
comment
В этом случае он не должен компилироваться. Генерация плохого двоичного кода в фоновом режиме никогда не бывает правильной. Кстати, есть ли другой способ заставить набор иметь больший размер байта, чем в противном случае? - person Mason Wheeler; 10.03.2009
comment
Похоже, последний элемент, sdlwForce32, нужен только для того, чтобы убедиться, что размер равен 32 битам. Если все, что вы делаете, это передаете это значение в API, оно все равно будет передано как 32-битное, если вы просто приведете его к Integer. - person Allen Bauer; 10.03.2009
comment
Если вы передаете ссылку и ожидаете, что API заполнит значение, вам, возможно, придется вручную использовать временное значение, а затем привести его. Попробуйте объявить перечисление как собственный тип, а затем создайте набор этого перечисления. - person Allen Bauer; 10.03.2009
comment
Мех. Я объявил это как набор специально, поэтому мне не пришлось бы делать это как целое число. пожал плечами Ну ладно. В данном конкретном случае сет в любом случае не нужно публиковать. Было бы неплохо иметь директиву {$MINSETSIZE} (например, {$MINENUMSIZE}), чтобы это работало. - person Mason Wheeler; 10.03.2009
comment
(Отправлено как 72093) - person Mason Wheeler; 10.03.2009