- Код: Выделить всё
Png := TPortableNetworkGraphic.Create;
png.Canvas.Create;
png.Canvas.Lock; // не помогло!
Png.SetSize(450,300);
Png.PixelFormat:=pf8bit;
Png.Transparent:=true;
Png.TransparentColor:=clBlue;
Png.Canvas.Brush.Color:=clBlue;
Png.Canvas.FillRect(0,0,450,300);
Png.Canvas.Brush.Color:=clYellow;
Png.Canvas.Ellipse(10,10,246,246);
png.canvas.Font.Size:=40;
png.canvas.Brush.Color:=clBlue;
png.canvas.Pen.Color:=clwhite;
png.canvas.Font.Color:=clwhite;
png.canvas.TextOut(40,40,'Проверка текста');
//png.SaveToStream(OutputData);
png.SaveToFile('111.png');
png.Canvas.unLock; //
png.Free;
Получаю или вылет программы или "программа вызвала subj"
Проблема возникает при первой же попытке отрисовать на канве.
Не в потоке под Linux и в потоке под Вынь код отрабатывает нормально.
Куда копать? Трабл в canvas и threads - попробовал работать с TBitmap - тоже самое.
Попробовал fcl-image - отрисовывает в потоке без проблем, но вывод текста (canvas.texout) там без кириллицы
Добавлено спустя 2 часа 9 минут 33 секунды:
Попробую сделать sinchronize
Добавлено спустя 19 часов 55 минут 7 секунд:
Ну сам себе и отвечу.
1) Synchronize действительно решил проблему
2) Canvas.lock, как альтернатива synchronize для визуальных компонентов, почему то не дал результата
Остался таки вопрос из области теории: в задаче спрашивалось "Отрисовать png в памяти и вывести в файл".
Если бы я рисовал что-либо на канве формы, было бы понятно, зачем блокировки, но я то рисовал в памяти, какого же тогда потребовалась блокировка?