![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
методы Assign и Canvas.Drawобъекта TBitmap [D7, XP]
night_light © (2009-05-28 16:22:00)Здравствуйте! Подскажите пожалуйста, что происходит при использовании метода Assign и метода Canvas.Draw.
При использовании в VCL код:
InBitmap, NewBitmap: TBitmap;
...
InBitmap.LoadFromFile('1.bmp');
...
NewBitmap.Canvas.Draw(3, 5, InBitmap);
выдаёт белое поле в NewBitmap,
тогда как код:
InBitmap, NewBitmap: TBitmap;
...
InBitmap.LoadFromFile('1.bmp');
...
NewBitmap.Assign(InBitmap);
NewBitmap.Canvas.Draw(3, 5, NewBitmap);
как и требуется помещает в NewBitmap
сдвинутую картинку из InBitmap.
Если же код для такого сдвига использовать в другом потоке (Thread),
то во втором случае вылетает исключение EOutOfResources с сообщением 'Недостаточно памяти для обработки команды.', а в первом случае всё работает так, как мне нужно.
По документации разобраться не смог. Хотелось бы понять суть происходящего, чтобы избежать возможных неожиданных редко возникающих ошибок.
night_light (2009-05-28 17:28:00) [1]разобрался, спасибо!
night_light (2009-05-28 17:09:00) [2]>> Как я понял, метод Assign в данном случае представляет
>неправильно понял.
как же тогда понимать строчку в справке по TBitmap.Assign
If the bitmap needs to be changed, the actual bitmap image is copied before the changes are made (copy on write).
Ega23 (2009-05-28 16:46:00) [3]
> Как я понял, метод Assign в данном случае представляет
неправильно понял.
> какой функцией я могу СКОПИРОВАТЬ один битмап в другой
procedure TCatViewFrame.dbgCatDetailsDBTableView1Column1CustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
bmp : TBitmap;
begin
if not adsCatDetails.Active then Exit;
if adsCatDetails.IsEmpty then Exit;
bmp := TBitmap.Create;
try
try
ilItemsImages.GetBitmap(AViewInfo.Value, bmp);
ACanvas.Canvas.CopyRect(AViewInfo.Bounds, bmp.Canvas, Rect(0,0,16,16));
ADone := True;
except
end;
finally
bmp.Free;
end;
end;
night_light (2009-05-28 16:42:00) [4]Как я понял, метод Assign в данном случае представляет что-то вроде присвоения указателя и копирования при изменении, и поэтому возникают проблеммы, подскажите, пожалуйста, какой функцией я могу СКОПИРОВАТЬ один битмап в другой немедленно, т.е. при вызове функции.
night_light (2009-05-28 16:37:00) [5]прощу прощения, но в тех примерах, на основании которых я писал код про задание размеров Bitmap-а ничего не сказано, поясните, пожалуйста, как и где их лучше задавать?
Ega23 (2009-05-28 16:24:00) [6]Размеры задал?