![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
ivan219 |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 4 Всего: 12 |
Этот код не работает так как надо:
А вот так работае:
Вопрос: почему когда:
выносиш за пределы одной процедуры то ничего не рисует??? И как от этого избавится??? Это сообщение отредактировал(а) ivan219 - 28.7.2007, 20:33 |
||||||
|
|||||||
s-mike |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Я бы сказал, что это элементарное незнание принципов работы VCL. Рисовать нужно в событии OnPaint.
|
|||
|
||||
ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 4 Всего: 12 |
s-mike, Вобщето я это знаю вопрос в другом.
|
|||
|
||||
s-mike |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Судя по коду - нет. Иначе зачем рисовать в Button.OnClick, Timer.OnTimer? Если известно, что это _в корне_ неправильно. Собственно проблемы все из-за как раз из-за этого. Весь код отрисовки следует переместить в Form.OnPaint, а в событии кнопки или таймера следует поместить только команду перерисовки — Invalidate. |
|||
|
||||
ivan219 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 4 Всего: 12 |
Ну хорошо вот так будет правильно?
Только проблема осталось. Зато если сделать так:
или так
То всё отрисовывается, вот я и задал вопрос почему нужно создавать обекты GraphicsGDIPlus Pen их отрисовывать и уничтожать в одной процедуре т.е. последовательно, так как ели сделать так:
И нажать по очереди Button1..3 то тоже ничего неотрисовывается. Это сообщение отредактировал(а) ivan219 - 29.7.2007, 22:59 |
||||||||
|
|||||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
ivan219, насколько я знаю графические дескрипторы GDI даются во время прорисовки и существуют недолго, потому если их получить в разное время, то потом они могут оказаться недействительными.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
s-mike |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Конечно не правильно. Объект Graphics должен создаваться при каждой перерисовке.
Повезло, не более ![]() Правильно будет так:
|
|||
|
||||
ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 4 Всего: 12 |
Печально
![]() Значит надо всегда создавать и уничтожать ведь это лишнии затраты ресурсов. Это особенность Windows или что??? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
ivan219, не такие уж и затраты. Объект типа TGPGraphics - этого своего рода DC для GDI+. В GDI его же получают и пересоздают при каждой перерисовке и ничего.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
s-mike |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 425 Регистрация: 16.1.2005 Где: Киев Репутация: 5 Всего: 16 |
Объект TGPGraphics.Create/Free — это по сути обертки над двумя противоположными функциями. Так что ничего ресурсоемкого в этом нет.
Сейчас нет под рукой GDI+, но принцип там таков: передавая в определенную функцию DC окна мы получаем дескриптор GDI+, на котором можно рисовать. То есть процесс абсолютно аналогичный получению DC. Может быть более правильным было бы в объекте сделать возможность изменять Handle для рисования не пересоздавая объект (как Canvas.Handle). Ведь все-таки при создании объекта выделяется память, и хорошо если при каждом новом создании объекта используется выделенная перед этим область памяти. Но текущая реализация GDI+ от progdigy этого не предусматривает. |
|||
|
||||
ivan219 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1121 Регистрация: 19.11.2005 Где: Планета земля Репутация: 4 Всего: 12 |
Спасибо разяснили.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |