Добрый вечер
В моей статье, я описывал способ работы с TBitmap. В вашем же случае, вы работаете с канвой. У канвы формы нету Bitmap. Поэтому ваш код падает при попытке вызывать Map у не существующего объекта.
Для решения вашей задачи, нужно:
Помнить о самое главной вещи при работе с канвой в FMX. Это то, что выполнять отрисовку можно только в определенный моменты времени (в отличии от VCL). Непосредственно, когда получен системный запрос на отрисовку сцены (формы), а именно в событиях OnPaint, OnPainting (в вашем случае у панели).
Знать, что канва существует в единственном экземпляре в рамках одной формы (опять же в отличии от VCL, где свою канву имеет каждый оконный контрол).
Резюмирую, все выше сказанное.
procedure TForm4.Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
var
X, Y: Integer;
PixelRegion: TRectF;
begin
Canvas.Stroke.Color := TAlphaColorRec.Red;
for X := 0 to Floor(Panel1.Width) - 1 do
for Y := 0 to Floor(Panel1.Height) - 1 do
begin
PixelRegion := TRectF.Create(TPointF.Create(X, Y), 1, 1);
Canvas.DrawRect(PixelRegion, 0, 0, AllCorners, 1);
end;
end;
Задаем обработчик на событие TPanel.OnPaint. Используя канву переданную через параметры, задаем цвет кисти и отрисовываем логические пиксели. Для закраски пикселей, я воспользовался обычной отрисовкой квадрата с шириной в 1 логический пиксель.
Если речь идет об андроиде, то из-за возможного наличия экрана с повышенной плотностью пикселей (Screen Scale) это код для экранов со Scale отличных от 1 и не кратных 2, будет рисовать сдвоенные/размазанные линии. Чтобы этого избежать, нужно перед отрисовкой выполнить округление региона до физических пикселей при помощи метода TCanvas.AlignToPixel.
procedure TForm4.Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
var
X, Y: Integer;
PixelRegion: TRectF;
PixelPos: TPointF;
begin
Canvas.Stroke.Color := TAlphaColorRec.Red;
for X := 0 to Floor(Panel1.Width) - 1 do
for Y := 0 to Floor(Panel1.Height) - 1 do
begin
PixelPos := Canvas.AlignToPixel(TPointF.Create(X, Y));
PixelRegion := TRectF.Create(PixelPos, 1, 1);
Canvas.DrawRect(PixelRegion, 0, 0, AllCorners, 1);
end;
end;