Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-65740
saperxl
2003-10-31 20:32
2003.11.20
Пароль к SYSDBA в InterBase


1-65896
Morfey
2003-11-06 01:22
2003.11.20
Дамп памяти


3-65728
sasasasa
2003-11-01 23:02
2003.11.20
Interbase API


6-66030
zarochka
2003-09-24 22:29
2003.11.20
Как закачать файды на сервер


14-66107
Delirium^.Tremens
2003-10-27 09:36
2003.11.20
Прощание с форумом.