Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Вниз

Почему выскакивает ошибка   Найти похожие ветки 

 
Condor   (2003-11-08 14:41) [0]

Когда я рисую на канве, она выдает эту ошибку. Не могу понять почему.. Подскажите, пожалуйста, как с этим бороться.


 
Lmz   (2003-11-08 14:53) [1]

Ошибка в 17-ой строке...

Читай Тейксера и Пачеко


 
Condor   (2003-11-08 14:55) [2]

А где можно взять?


 
Юрий Федоров   (2003-11-08 14:57) [3]

Окно не создано. Либо еще, либо уже.
Либо Канва вообще не привязана к окну. Приведи код


 
Condor   (2003-11-08 15:01) [4]

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


 
mOOx_   (2003-11-08 15:06) [5]

Так может объяснишь (читай покажешь), когда это - ИНОГДА?


 
Condor   (2003-11-08 15:16) [6]

Когда я копирую из канвы в память на оконную канву, вызывая BitBlt или CopyRect...
А иногда - это значит, что она выдает это сообщение ни при каждом копировании.


 
mOOx_   (2003-11-08 15:19) [7]

Блин, ну что у тебя за секретный код? Просто сил нет с этими КГБшниками разговоры разговаривать. Я же написал, чтоб ты читал не "объяснишь", а "покажешь". А ты опять за свое. А вообще, используй отладчик и выясняй, что не так в ИНОГДА случаях. Когда выяснишь, трабла сама собой решиться.
Удачи.


 
Condor   (2003-11-08 15:29) [8]

Да какой секретный, он большой просто:)))

var
MemBmp:TBitmap;

1. Рисуем на канве в памяти эллипсы, линии, и так далее
2.BitBlt(Image1.Canvas.Handle,0,0,MemCanva.Width,MemCanva.Height,MemBmp.Canvas.Handle,0,0,srccopy);

Первый шаг проходит всегда, второй - почти всегда, но иногда выскакивает "Canvas does not allow drawing". ИНОГДА это бывает тем чаще, чем больше в памяти рисуешь..

И если бы я сам смог решить эту проблему - сюда бы не писал..


 
Digitman   (2003-11-08 15:30) [9]


> Почему выскакивает ошибка "Canvas does not allow drawing"?
>


потому что происходит программное исключение


> вызывая BitBlt или CopyRect


не выдумывай. ТОЛЬКО метод TCanvas.CopyRect может вызвать данное исключение, но никак не BitBlt().

Это скорей всего значит, что объект класса TCanvas заблокирован осн.код.потоком, а ты пытаешься получить к нему несанкционированный доступ из доп.код.потока


 
Condor   (2003-11-08 15:35) [10]

Tcanvas.CopyRect точно нет, но после BitBlt есть Tcanvas.refresh. Он может влиять?


 
mOOx_   (2003-11-08 15:40) [11]

Тогда такой вопрос (раз уж самому лень разбираться, то давай на вопрося отвечай): нафига тебе рисовать несколько раз, на сколько я понимаю, одно и тоже?
Затем, где вызов КопиРект? Приведи ним пример. С дигитом полностью согласен!!!
Еще: когда тоже пытался на ТИмаге рисовать, но тоже траблы были какие-то. Посему перешел на ТПаинтБокс. Чем он не нравиться?
Удачи.


 
Digitman   (2003-11-08 15:40) [12]

procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
NeededState: TCanvasState;
begin
NeededState := ReqState - State;
if NeededState <> [] then
begin
if csHandleValid in NeededState then
begin
CreateHandle;
if FHandle = 0 then
raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
end; // здесь происходит исключение
if csFontValid in NeededState then CreateFont;
if csPenValid in NeededState then CreatePen;
if csBrushValid in NeededState then CreateBrush;
State := State + NeededState;
end;
end;

procedure TCanvas.CopyRect(const Dest: TRect; Canvas: TCanvas;
const Source: TRect);
begin
Changing;
RequiredState([ csHandleValid, csFontValid, csBrushValid]);
Canvas.RequiredState([csHandleValid, csBrushValid]);
StretchBlt(FHandle, Dest.Left, Dest.Top, Dest.Right - Dest.Left,
Dest.Bottom - Dest.Top, Canvas.FHandle, Source.Left, Source.Top,
Source.Right - Source.Left, Source.Bottom - Source.Top, CopyMode);
Changed;
end;


 
mike.dld   (2003-11-08 15:45) [13]

У меня такие траблы были только когда я вручную канвас создавал, а хэндлу его dc не присваивал (т.е. не писал всяких там CreateCompatibleDC, CreateCompatibleBitmap, SelectObject)...


 
Condor   (2003-11-08 15:46) [14]

mOOx_ © (08.11.03 15:40) [11]

Копиректа нет, рисую не одно и тоже :), придется переходить на TPaintBox..

Digitman © (08.11.03 15:40) [12]
Спасибо, конечно, за помощь, но то, что пишешь, пока не по моим мозгам, так что помочь оно мне не может..

Ладно, всем спасибо, буду на PainBox переписывать


 
Condor   (2003-11-08 15:47) [15]

mike.dld © (08.11.03 15:45) [13]

А как решил, приведи, пожалуйста, простенький пример


 
mOOx_   (2003-11-08 15:52) [16]

А, вспомнил, что меня смутило: ТИнаж постоянно перерисовывает картинку, которая в соответствующем свойстве указана. Ну а поскольку там ничего нет, то при перемещении формы всех твоих изощрений не остается. Можно, конечно все это дело отследить, НО:
1. геморно
2. МОРГать будет сильно, думается.
Удачи.


 
mike.dld   (2003-11-08 15:57) [17]


var
c: tCanvas;
dc,dc2: HDC;
bmp: HBITMAP;
wnd: HWND;
begin
c := tCanvas.Create;
wnd := GetDesktopWindow;
dc := GetDC(wnd);
dc2 := CreateCompatibleDC(dc);
bmp := CreateCompatibleBitmap(dc,Sender.Width,Sender.Height);
ReleaseDC(wnd,dc);
SelectObject(dc2,bmp);
tCanvas.Handle := dc2;
...
DeleteDC(dc2);
tCanvas.Free;
end;


Что-то такого типа



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.012 c
1-65979
Igit
2003-11-11 18:20
2003.11.20
Метки в Pascal


1-65828
AlexanderSK
2003-11-06 14:44
2003.11.20
Проблемма с SaveDialog.


1-65949
GSVSerg
2003-11-10 18:24
2003.11.20
MDI форма


1-65972
ZABor
2003-11-10 22:53
2003.11.20
Действие при появлении Фрейма


8-66020
Hatawa
2003-07-25 09:53
2003.11.20
Проблема с CopyRect





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский