В чем вопрос-то? Куда нажать, чтобы увидеть? На свежей альфе? Знаете-ка что…. Этой ошибке ТРИСТА ЛЕТ! Посмотрите на дату исходного сообщения — март 2006 года.
Никуда не нажать. Эта ошибка возникает сама по себе и непредсказуемо. И чем дальше бат деградирует (с увеличением номера версии) — тем чаще.
Я ж сказал — на форумах по дельфи про такую проблему знают, знают про ее причины и знают, что надо делать, чтобы она не возникала. И всяких новичков терпеливо учат, как надо программировать многопоточные приложения.
Также, когда я искал информацию об этой ошибке, я видел много релизов РАЗНЫХ программ, в описании к которым было указано, что в этой версии «исправлена ошибка, приводящая к Canvas does not allow drawing и к Acsess violation at address».
Отрицать очевидное бессмысленно — ошибка в Бате есть, и причина ее — корявое программирование, рассинхронизация процессов, утечки памяти.
Беда в том, что эту ошибку в Бате уже НИКОГДА не исправить!!! Слишком все запущено. Я представляю, сколько кода надо перелопатить. А код уже давно такой, что в одном месте тронешь — в трех других сразу рассыпается.
kessor 4 / 4 / 2 Регистрация: 27.10.2014 Сообщений: 90 |
||||
1 |
||||
15.02.2016, 13:09. Показов 8932. Ответов 6 Метки нет (Все метки)
после N запусков вот этой функции
программа вылетает с ошибкой canvas does not allow drawing
__________________
0 |
Пишу на Delphi…иногда 1422 / 1277 / 286 Регистрация: 03.12.2012 Сообщений: 3,914 Записей в блоге: 5 |
|
15.02.2016, 13:25 |
2 |
как исправить? GetWindowDC After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.
0 |
kessor 4 / 4 / 2 Регистрация: 27.10.2014 Сообщений: 90 |
||||
15.02.2016, 14:06 [ТС] |
3 |
|||
то есть просто добавить строчку
?
0 |
587 / 454 / 147 Регистрация: 09.12.2013 Сообщений: 2,385 Записей в блоге: 2 |
|
15.02.2016, 16:20 |
4 |
Зачем вообще TCanvas? Просто HDC возьмите. И да, освобождать надо.
canvas does not allow drawing Это логически не может быть из-за показанного кода. Вы там ничего не рисуете. В другом месте наверное что-то делается. Добавлено через 22 секунды
0 |
kessor 4 / 4 / 2 Регистрация: 27.10.2014 Сообщений: 90 |
||||
15.02.2016, 17:27 [ТС] |
5 |
|||
а так можно цвет пикселя получать?
0 |
BOGG ART 587 / 454 / 147 Регистрация: 09.12.2013 Сообщений: 2,385 Записей в блоге: 2 |
||||
15.02.2016, 18:40 |
6 |
|||
Сообщение было отмечено kessor как решение РешениеЯ же говорю — возьмите переменную HDC, освобождайте.
1 |
4 / 4 / 2 Регистрация: 27.10.2014 Сообщений: 90 |
|
18.02.2016, 17:03 [ТС] |
7 |
после ~100 итераций начинает выдавать всегда одно и то же значение(для G — 255)
0 |
|
|
Здравствуйте!
void __fastcall TFMain::AppException(TObject *Sender, Exception *E) { Screen->Cursor = crDefault; if (onSxfLoad) { sprintf(buf, «Файл %srnОшибка на объекте %d:%d:», OpenDialog1->FileName, sxfItem->api->MapObj->code, sxfItem->api->MapObj->num); switch (sxfItem->api->MapObj->local) { case 0 : strcat(buf, «LIN»); break; case 1 : strcat(buf, «SQR»); break; case 2 : strcat(buf, «DOT»); break; case 3 : strcat(buf, «TXT»); break; case 4 : strcat(buf, «VEC»); break; case 5 : strcat(buf, «MIX»); break; default : strcat(buf, «UFO»); break; } strcat(buf, «rn»); strcat(buf, E->Message.c_str()); Application->MessageBox(buf, «Ошибка чтения файла», MB_ICONWARNING); } else { ShowMessage(E->Message.c_str()); // вот сюда попадаю Application->Terminate(); } } Рухает после загрузки примерно 20 карт в OnPaint пейнтбокса, на который выводится БМП:
void __fastcall TFMain::PBPaint(TObject *Sender) { PB->Canvas->Draw(0, 0, bmp); } Куда рыть? Проверить, всем ли SelectObject() есть соответствующие DeleteObject()? Или тут что-то другое? |
popsa |
|
поток я так понимаю у тебя один, поэтому скорее всего что то из этого Цитата Question: Сообщение отредактировано: popsa — 22.10.10, 12:43 |
leo |
|
Цитата #SI# @ 22.10.10, 12:15 Проверить, всем ли SelectObject() есть соответствующие DeleteObject()? Интересно, а зачем вообще их понадобилось юзать. Чем VCL-ные обертки не устраивают, или хочется создать «гремучую смесь» VCL и API ?! |
#SI# |
|
leo, научи, как висюльками нарисовать PolyPolygon() и выполнить TransparentBlt(). Ну шо те стоит, а? Сообщение отредактировано: #SI# — 22.10.10, 17:54 |
leo |
|
Цитата #SI# @ 22.10.10, 17:48 Да, и заодно как такое пёрышко создать? Не понятно, чем ты вообще занимаешься — хочешь слепить свою самоделку лучше или дешевле, чем Панорама ГИС-вьюер ?! |
#SI# |
|
leo, ты по делу можешь ответить? Если нет — то не парься, ага? А с поделками этой конторы я знаком не понаслышке…
switch (obj->code) { //….. case 71323000 : pen = ::CreatePen(PS_SOLID, 1, clBlack); logBrush.lbStyle = BS_HATCHED; logBrush.lbColor = clBlack; logBrush.lbHatch = HS_CROSS; brush = ::CreateBrushIndirect(&logBrush); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; //———————————————————————— case 71610000 : pen = ::CreatePen(PS_DASH, 1, clBlack); brush = ::CreateSolidBrush(clWhite); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; //======================================================================= default : // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! pen = ::CreatePen(PS_SOLID, 1, clFuchsia); brush = ::CreateSolidBrush(clFuchsia); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; } } А вот вывод полигона:
void DrawPolygon(HDC dc, TPoint *pnts, int *pCount, int mCount, HPEN pen, HBRUSH brush) { HPEN dcPen = ::SelectObject(dc, pen); HBRUSH dcBrush = ::SelectObject(dc, brush); ::PolyPolygon(dc, pnts, pCount, mCount); ::SelectObject(dc, dcPen); ::DeleteObject(pen); ::SelectObject(dc, dcBrush); ::DeleteObject(brush); } Причем когда искусственно устанавливаю коды в 0 и вывожу по дефолту — проблем нет! Такое впечатление, что глюк идёт из-за вызовов CreateBrushIndirect()
default : pen = ::CreatePen(PS_SOLID, 1, clFuchsia); // brush = ::CreateSolidBrush(clFuchsia); logBrush.lbStyle = BS_HATCHED; logBrush.lbColor = clBlack; logBrush.lbHatch = HS_CROSS; brush = ::CreateBrushIndirect(&logBrush); DrawPolygon(hdc, points, pointCount, metricCount, pen, brush); return; Всё ОК… Пошёл рыцца дальше…
// плотнозастроенные case 1 : value = GetAtrValue(atrs, 243); switch (value) { // крупный город case 20 : brush = ::CreateSolidBrush(RGB(255, 148, 40)); // жёлтенькие break; // малый город, ПГТ case 21 : case 22 : brush = ::CreateSolidBrush(LTGRAY_BRUSH); break; // с/х и дачные посёлки case 23 : case 24 : brush = ::CreateSolidBrush(BLACK_BRUSH); break; // прочие НП case 26 : brush = ::CreateSolidBrush(BLACK_BRUSH); break; // любые НП /* а кисти — нет */ case 28 : ::CreateSolidBrush(RGB(255, 148, 40)); // жёлтенькие break; /* -*- */ default : ::CreateSolidBrush(RGB(255, 0, 0)); // UFO } break;
Всем спасибо за внимание! Сообщение отредактировано: #SI# — 23.10.10, 16:11 |
leo |
|
Цитата #SI# @ 23.10.10, 11:11 Лео, ежели кинет тебя судьба и заставит писать на Панорамных MapAPI / GTK — спрашивай, не стесняйся. Чем смогу — помогу! «Эт вряд ли»(С). «Не царское это дело» заниматься какими-то рисовалками, поэтому «помощников» мне и так хватает, и не они мне советуют что и как делать, а я им «с высоты птичьего полета», поскольку прежде чем грузить «61 карту сотки на Московскую область» нужно подумать — а нужно ли это вообще и можно ли решить эту задачу иначе |
#SI# |
|
Цитата leo @ 24.10.10, 07:45 а я им «с высоты птичьего полета» Штаны не потеряй. Давай ты будешь своим делом заниматься, а я — своим. И помогать друг другу. А по части флудежа в тематике тебе всё равно за мной не угнацца. Не веришь — спроси тутошних модераторов. Они много чего могут вспомнить Добавлено 24.10.10, 09:17 |
leo |
|
Цитата #SI# @ 24.10.10, 09:13 Давай ты будешь своим делом заниматься
Я своим и занимаюсь — пытаюсь обратить внимание на то, что, возможно, вы НЕ «верной дорогой идете, товарисч!» В предыдущем топике ты пытался параллельно рисовать 4-5 карт в разных потоках — видимо есть какие-то проблемы с быстродействием. Теперь речь зашла об отрисовке 20-60 карт и возникли вопросы с нехваткой ресурсов. Хотя судя по этой картинке, уже при отображении 3-4 листов одновременно, разобрать что-либо на такой с позволения сказать «карте» практически невозможно — тут явно нужна генерализация. Поэтому если и юзать многопоточность, то не для того, чтобы параллельно рисовать «кашу» на экране, а создаватьобновлять прореженный списоксписки генерализованных объектов, которые следует отображать в мелких масштабах. И если кол-во одноврменно отображаемых объектов при разных мелких масштабах будет примерно одинаковым (или хотя бы будет отличаться раза в 2-3, а не в сотни раз), и ссылки на отображаемые объекты будут занесены в отдельный список (чтобы не искать их по всем картам при каждой перерисовке), то и основному потоку будет практически пофиг рисовать одну подробную карту или 60 мелких генерализованных. (Ну и ес-но одна мелкая схематическая карта-навигатор на весь район — штука весьма полезная). |
#SI# |
|
Да простят меня модеры за забивание форума картинками… Мил человек, не рассказывай мне, как делаются ГИСы. Я этим занимался ещё тогда, когда ты штаны мочил… Ничего личного. Ага. Не надо считать собеседников дебилами.
— Добавлено 25.10.10, 10:18 Вопрос к МАСТЕРАМ уровня Адиля/Тренера (в алфавитном порядке ) — чем так можно засрать память, что система просто не реагирует? Сообщение отредактировано: #SI# — 25.10.10, 10:20 |
Hi, whenever I try to use my application on a client’s computer I get the error message «Canvas Does not Allow Drawing.» This happens only when I try to print a Report using fastreport 3. I use InstallShield and have included all fastreport libraries.
Any suggestions would be greatly appreciated.
Comments
-
Hi, whenever I try to use my application on a client’s computer I get the error message «Canvas Does not Allow Drawing.» This happens only when I try to print a Report using fastreport 3. I use InstallShield and have included all fastreport libraries.
Any suggestions would be greatly appreciated.
I know this is VERY old post, but thought I would just advise as it is the only valid page on the subject when doing a search on Google. It seems that your c: drive needs to have a temp folder, in order for the canvas to be drawn, there must be read&write permissions on the folder too.
-
Hi, whenever I try to use my application on a client’s computer I get the error message «Canvas Does not Allow Drawing.» This happens only when I try to print a Report using fastreport 3. I use InstallShield and have included all fastreport libraries.
Any suggestions would be greatly appreciated.
I know this is VERY old post, but thought I would just advise as it is the only valid page on the subject when doing a search on Google. It seems that your c: drive needs to have a temp folder, in order for the canvas to be drawn, there must be read&write permissions on the folder too.
This is VERY old post, but still actual. It is important to have some default printer on your system — but NOT Fax!
-
This is a very old post but have helped me lot.
The only thing I needed to do was to run RAD Studio XE2 as Administrator.
All fixed!Thank you
-
this post is helping confused computer users since 2006!
long live the post ! -
The post is not dead! Long live the post!
Leave a Comment
Форум РадиоКот • Просмотр темы — Ошибка при рисовании на канве, Delphi
Сообщения без ответов | Активные темы
ПРЯМО СЕЙЧАС: |
Автор | Сообщение | ||
---|---|---|---|
|
Заголовок сообщения: Ошибка при рисовании на канве, Delphi Добавлено: Ср янв 10, 2018 20:05:03 |
||
Зарегистрирован: Пн сен 05, 2011 10:03:06 Рейтинг сообщения: 0
|
Сразу скажу, с графикой раньше вообще не работал. |
||
Вернуться наверх |
Профиль
|
||
Реклама | |
|
|
Мурик
|
Заголовок сообщения: Re: Ошибка при рисовании на канве, Delphi Добавлено: Ср янв 10, 2018 23:27:35 |
||
Карма: 1 Рейтинг сообщения: 0
|
Рисовать нужно в одном потоке, желательно основном. |
||
Вернуться наверх | |||
Реклама | |
|
|
paskal
|
Заголовок сообщения: Re: Ошибка при рисовании на канве, Delphi Добавлено: Ср янв 10, 2018 23:43:41 |
||
Зарегистрирован: Пн сен 05, 2011 10:03:06 Рейтинг сообщения: 0
|
Особенность программы такова, что процесс рисования идет в реальном времени непрерывно. Если я сделаю графику в основном потоке, программа повиснет. |
||
Вернуться наверх | |||
ДанилКоржов
|
Заголовок сообщения: Re: Ошибка при рисовании на канве, Delphi Добавлено: Ср янв 17, 2018 18:48:16 |
Зарегистрирован: Вт янв 16, 2018 23:18:46 Рейтинг сообщения: 0
|
Делема у вас, но выход должен же быть …. |
Вернуться наверх | |
Реклама | |
|
Выгодные LED-драйверы для решения любых задач КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения. Подобрать LED-драйвер>> |
SIM31
|
Заголовок сообщения: Re: Ошибка при рисовании на канве, Delphi Добавлено: Чт фев 15, 2018 17:29:33 |
||
Карма: 17 Рейтинг сообщения: 0
|
Я кидал на форму таймер, и внутри вызова таймера рисовал анимацию, работает превосходно, можно каждые 16 мс экран перерисовывать. |
||
Вернуться наверх | |||
Реклама | |
|
|
Реклама | |
|
LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон. Подробнее>> |
Кто сейчас на форуме |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2 |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |