![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Почему пиксел = $FFFFFFFF?
Код:
procedure TThread1.Execute; begin Bitmap1 := TBitmap.Create; Bitmap1.SetSize(6, 6); // определяем размер изображения Thread1.Suspended := True; // в TForm1.Button1Click, присвоив False, запускаем поток ShowMessage(ColorToString(Bitmap1.Canvas.Pixels[0, 0])); // пиксел = $FFFFFFFF end; Последний раз редактировалось SpectraL, 06.03.2015 в 16:12. |
#2
|
||||
|
||||
![]() Потому.
Потому, что битмап белый. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() Потому что это баг, который происходит, если 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 Последний раз редактировалось SpectraL, 07.03.2015 в 20:31. |
#4
|
||||
|
||||
![]() Вероятно, вывод значения в окно ShowMessage, также, как и в форму, нужно выполнять в процедуре Synchronize.
Код:
procedure TThread1.Execute; begin Bitmap1 := TBitmap.Create; Bitmap1.SetSize(6, 6); // определяем размер изображения Thread1.Suspended := True; // в TForm1.Button1Click, присвоив False, запускаем поток Synchronize(procedure begin ShowMessage(ColorToString(Bitmap1.Canvas.Pixels[0, 0])) end); // пиксел = clWhite end; Последний раз редактировалось SpectraL, 09.03.2015 в 20:23. |