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

Вниз

EOutOfResources   Найти похожие ветки 

 
Handle   (2006-05-05 10:08) [0]

Подскажите где ошибка, возникает EOutOfResources через некоторое время и как исправить?

procedure TForm1.Timer1Timer(Sender: TObject);
var
P: TPoint;
bmp: TBitmap;
DC: HDC;
begin
Timer1.Interval:= 1;
Image1.Picture:= nil;
GetCursorPos(P);
bmp:=TBitmap.Create;
bmp.Height:=Screen.Height;
bmp.Width:=Screen.Width;
DC:=GetDC(0);
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
DC, P.X, P.Y , SRCCOPY);
bmp.Width:= 32;
bmp.Height:= 32;
Image1.Picture.Bitmap:= bmp;
bmp.Free;
ReleaseDC(0, DC);
end;


 
Плохиш ©   (2006-05-05 10:31) [1]


> Image1.Picture:= nil;
..
> bmp:=TBitmap.Create;
..
> Image1.Picture.Bitmap:= bmp;
> bmp.Free;

Что делаем?
После такого, возникающая ошибка является самой безопасной.
Вместо Picture:= nil освобождай Picture.Bitmap. А строчку bmp.Free выкинуть нафик.


 
Плохиш ©   (2006-05-05 10:36) [2]

А ещё лучше вместо
> Image1.Picture.Bitmap:= bmp;
использовать
Image1.Picture.Assign(bmp);
и в этом случае bmp.Free остаётся.


 
evvcom ©   (2006-05-05 11:48) [3]


> А ещё лучше вместо
> > Image1.Picture.Bitmap:= bmp;
> использовать
> Image1.Picture.Assign(bmp);
> и в этом случае bmp.Free остаётся.

Там (в TPicture.SetGraphic) собственно и делается Assign(bmp).

Хотя и в TImage.SetPicture делается FPicture.Assign(Value). Поэтому

> Вместо Picture:= nil освобождай Picture.Bitmap.

вроде как тоже не причина. Взгляд был поверхностный, с графикой особо не работал, так что может в чем-то и не прав. Но я бы, наверное, MemProof все же погонял.


 
ЮЮ ©   (2006-05-05 12:34) [4]

Похоже, все дело в изменении размеров непустого TBitmap.  
Такой код, похоже, не жрет лишних ресурсов:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 P: TPoint;
 bmp: TBitmap;
 DC: HDC;
begin
 bmp:=TBitmap.Create;
 bmp.Width:= 32;
 bmp.Height:= 32;
 DC:=GetDC(0);
 try
   Timer1.Interval:= 1;
   GetCursorPos(P);
   BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height,
   DC, P.X, P.Y , SRCCOPY);
   Image1.Picture.Bitmap := nil;
   Image1.Picture.Bitmap.Assign(bmp);
 finally
   bmp.Free;
   ReleaseDC(0, DC);
 end;
end;


Да и проц на 100% не грузит :) На кой тебе весь экран в BitBlt, если интересует только 32х32 ?


 
han_malign ©   (2006-05-05 14:59) [5]

Image1.Picture.Bitmap.Handle:= bmp.ReleaseHandle;
bmp.Free;


 
ancara ©   (2006-05-05 15:09) [6]


> Image1.Picture.Bitmap := nil;
> Image1.Picture.Bitmap.Assign(bmp);

убийственно.

Мне кажется надо перед запуском таймера создать bitmap на Image:
Image1.Picture.Bitmap := TBitmap.Create;
Image1.Picture.Bitmap.Width:=32;
Image1.Picture.Bitmap.Height:=32;


а в таймере делать так

//тут создание bmp и получение картинки с десктопа
//все как было написано выше...
Image1.Picture.Bitmap.Canvas.Draw(0,0, bmp);
bmp.Free;


 
ЮЮ ©   (2006-05-06 03:50) [7]


>
> > Image1.Picture.Bitmap := nil;
> > Image1.Picture.Bitmap.Assign(bmp);
>
> убийственно.


У чего здесь убийственного? Первый оператор вовсе не означает потери ссылки на объект TBitmap, а его уничтожение.  

Без этого Image1 не хотел перерисовываться, правда тогда я пытался использовать  Image1.Picture.Bitmap, а не пересоздавать bmp в таймере.
При создании каждый раз нового экземпляра TBitmap -  это лишнее.


 
ancara ©   (2006-05-06 12:27) [8]

>У чего здесь убийственного?
Хм, и правда, ничего. Что ж, сорри, погорячился. :)

Просто я не удосужился проверить, а сделал поспешный вывод. Ведь если мы
присвоим указателю на объект значение nil, а затем попытаемся вызвать метод у этого объекта, эти дейстия должны будут привести к AV, не так ли?

Но в случае с TPicture.Bitmap этого не происходит, я так думаю в связи с тем, что
в методе TPicture.GetBitmap присутствует вызов
ForceType(TBitmap);
который и воссоздает объект FGraphic (в этом случае типа TBitmap)
ДО ТОГО, как мы обратимся к его методам.
 Я просто пытаюсь найти объяснение этому "явлению".
В чем я ошибаюсь?

А в процедуре автора вопроса локальная переменная bmp действительно лишняя, можно же в таймере сразу с десктопа копировать на Picture.Bitmap.Canvas, тем же BitBlt?



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

Текущий архив: 2006.06.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.06 c
8-1136404947
Ten
2006-01-04 23:02
2006.06.11
Цифровое преобразование изображения


2-1148469253
Konnor
2006-05-24 15:14
2006.06.11
Инет


4-1142584324
Turbid
2006-03-17 11:32
2006.06.11
Колесико над иконкой в трее


15-1147815021
Ы
2006-05-17 01:30
2006.06.11
Давайте знакомится


2-1148439658
sergey_vl
2006-05-24 07:00
2006.06.11
Помогите организовать словарь с возможностью поиска