Форум: "Основная";
Текущий архив: 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