Показать сообщение отдельно
  #3  
Старый 07.03.2015, 20:22
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Восклицание

Потому что это баг, который происходит, если TCanvas использовать в TThread. Для исправления предлагается заблокировать TCanvas от других потоков (в данном примере, достаточно сделать TCanvas.LockCount <> 0).

TCanvas.LockCount
Если LockCount > 0, то холст заблокирован от других потоков. Поток, который не блокирует холст, перед его использованием, рискует получить ошибку (справка RAD Studio → TCustomCanvas.Lock).

TCanvas.Lock
Увеличивает LockCount на единицу.

TCanvas.Unlock
Уменьшает LockCount на единицу.

Код:
procedure TThread1.Execute;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap1.Canvas.Lock;
  Bitmap1.SetSize(6, 6); // определяем размер изображения
  Thread1.Suspended := True; // в TForm1.Button1Click, присвоив False, запускаем поток
  ShowMessage(ColorToString(Bitmap1.Canvas.Pixels[0, 0])); // пиксел = clWhite
end;

http://hashcode.ru/questions/162625/...wer_sort=votes
http://www.delphisources.ru/forum/showthread.php?t=718
http://www.delphisources.ru/forum/sh...t=24037&page=2
Ответить с цитированием