![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||||||||||
|
||||||||||||
![]() Работаю над проектом на Delphi, недавно решил прикрутить OpenGL. Для упрощения решил использовать библиотеку dglOpenGL. Всё работает отлично почти до самого конца. Т.е. при закрытии приложения прога вылетает с какой-нибудь ошибкой, обычно в работе с окнами.
Сначала я использовал вывод в дочернее окно TPanel. Кода в проекте много, даже самого OpenGL, приведу основное: инициализация: Код:
А при закрытии окна (OnClose): Код:
Код:
При этом после закрытия окна программа вылетает с различными ошибками модулей работы с окнами. Далее я подумал, что это проблема делфи и решил сделать отдельный класс, который будет создавать своё дочернее окно в конструкторе: Код:
а в деструкторе класса сделал удаление окна: Код:
Но после первого же закрытия такого окна и работе с другими окнами опять вылетает в каком-либо месте ошибка. Далее я решил попробовать отключить сам OpenGL (для него я сделал отдельный класс). Сделал константу и наставил условий, которыми отключил все функции OpenGL. В итоге программа стала работать нормально. Т.е. выходит ошибка удаления самого OpenGL окна. Ну и как вариант, остается не удалять OpenGL-окно и работать до самого конца, просто скрывая их или показывая, но в конце работы приложения всё равно вывалится ошибка... Например при попытке показать другое окно, после закрытия этого произошел останов по Int3. Приложил CallStack. ![]() Синим выделена моя процедура, там идет Show другой формы. Что еще пробовал: отключить DestroyRenderingContext(hrc) - никакой разницы; создавать окно не Child, а отдельное - такой же результат уничтожения. Единственное, что срабатывает, так это замена уничтожения окна на скрытие: Код:
Может кто знает, может сталкивался с такой проблемой или хорошо разбирается в работе WINAPI с окнами, что это может быть? P.S. Если кто-то хочет спросить "зачем WS_EX_NOPARENTNOTIFY?", пишу сразу что без него эффект не меняется... |
#3
|
||||||||
|
||||||||
![]() Необоснованные навороты - это модуль dglOpenGL?
Я думал, что это может быть из-за него, но функции в этом модуле, как правило, повторяют основные рекомендации и уроки по openGL: Код:
Код:
Код:
Код:
Кто на Delphi 7 делал, у вас нормально всё работает? |
#4
|
||||
|
||||
![]() По приведённым выше процедурам и на API у меня в 7-ке никогда проблем не было.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
![]() А видяха случаем не ATI ? С ней такие косяки случаются. Точнее с дровами. Поставте последние.
|
#6
|
|||
|
|||
![]() Видяхи разные пробовал и Intel встроенный в чипсет и ATI и NVidia... На них место возникновения ошибки немного отличается. Допустим сейчас столкнулся с проблемой, что на ATI и NVidia второе такое окно вообще создаваться не хочет. Ищу решение...
|
#7
|
||||
|
||||
![]() А чего искать, не используй корявые компоненты, и как говорил ранее, учись писать сам.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||||||||||
|
||||||||||||
![]() Да убрал этот модуль, использую стандартный модуль OpenGL. Много раз все переписывал, пробовал по-разному с окнами работать (и создавать и удалять через WinAPI). Сейчас все работает, но ошибка остается. Я временно сделал вместо удаления окон скрытие. При закрытии программы происходит удаление окон и вылетает ошибка. Если только закоментировать вызовы самих функций openGL, то ошибка пропадает.
Код:
Создание окна: Код:
Код:
Каждый рендер начинается с Код:
Удаление окна: Код:
Уже и через модуль проверки утечек памяти прогонял свой код, вроде все ок. Помогает только выключить вызов всех функций openGL и тогда все работает отлично )) А так, ошибка при удалении окна в Windows.DestroyWindow: Код:
|
#9
|
||||
|
||||
![]() Скинь проект, посмотрю.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |